[groovy] do not show parameter name hint for closure argument outside
authorDaniil Ovchinnikov <daniil.ovchinnikov@jetbrains.com>
Thu, 3 Nov 2016 17:23:15 +0000 (20:23 +0300)
committerDaniil Ovchinnikov <daniil.ovchinnikov@jetbrains.com>
Thu, 3 Nov 2016 17:23:15 +0000 (20:23 +0300)
 of parentheses (IDEA-163484)

plugins/groovy/src/org/jetbrains/plugins/groovy/codeInsight/hint/GroovyInlayParameterHintsProvider.kt
plugins/groovy/test/org/jetbrains/plugins/groovy/codeInsight/hint/GroovyInlayParameterHintsProviderTest.groovy

index d6ebc52fca6ccfe2587b9aa938bf6902e489a841..f15f0f4f9114203066d9f02b6c3302a712a5f42b 100644 (file)
@@ -26,6 +26,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArg
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrGdkMethod
 import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.GrClosureSignatureUtil
+import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.GrClosureSignatureUtil.ArgInfo
 
 class GroovyInlayParameterHintsProvider : InlayParameterHintsProvider {
 
@@ -41,18 +42,23 @@ class GroovyInlayParameterHintsProvider : InlayParameterHintsProvider {
     val signature = GrClosureSignatureUtil.createSignature(this) ?: return null
     val infos = GrClosureSignatureUtil.mapParametersToArguments(signature, this) ?: return null
     val original = signature.parameters.zip(infos)
-
-    // leave only parameters with names
-    val map = original.mapNotNull {
-      it.first.name?.let { name -> name to it.second }
-    }.toMap()
+    val closureArgument = closureArguments.singleOrNull()
 
     // leave only regular arguments and varargs
-    val nonNamedArguments = map.filterValues {
-      !it.isMultiArg || it.args.none { it is GrNamedArgument }
+    fun ArgInfo<PsiElement>.shouldShowHint(): Boolean {
+      if (isMultiArg) return args.none { it is GrNamedArgument } //  do not show named arguments
+      if (closureArgument == null) return true
+      return closureArgument !in args // do not show closure argument
+    }
+
+    // leave only parameters with names
+    val filtered = original.mapNotNull {
+      val (parameter, info) = it
+      val name = parameter.name
+      if (name != null && info.shouldShowHint()) name to it.second else null
     }
 
-    return nonNamedArguments.mapNotNull {
+    return filtered.mapNotNull {
       val (name, info) = it
       info.args.firstOrNull()?.let { arg ->
         val inlayText = if (info.isMultiArg) "...$name" else name
index acafacf898d836672d5ee21d0638deb8850989a6..e1092983223a146173163bb587f59ae562fdcc51 100644 (file)
@@ -35,6 +35,7 @@ class Foo {
   Foo() {}
   Foo(a, b, c) {}
   void simple(a) {}
+  void simple(a, b) {}
   void defaultArgs(a, b = 1,c) {}
   void mapArgs(Map m, a) {}
   void varArgs(a, def... b) {}
@@ -116,4 +117,10 @@ enum Baz {
   void 'test no DGM inlays'() {
     testInlays '[].each {}', [:]
   }
+
+  void 'test closure arguments'() {
+    testInlays 'new Foo().simple {}', [:]
+    testInlays 'new Foo().simple({})', [17: 'a']
+    testInlays 'new Foo().simple null, {}', [17: 'a', 23: 'b']
+  }
 }