diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/impl/namedVariant/namedParams.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/impl/namedVariant/namedParams.kt index 30b770e3022f..853f5d4f84ed 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/impl/namedVariant/namedParams.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/impl/namedVariant/namedParams.kt @@ -6,12 +6,14 @@ package org.jetbrains.plugins.groovy.transformations.impl.namedVariant import com.intellij.codeInsight.AnnotationUtil import com.intellij.psi.* import com.intellij.psi.util.PropertyUtilBase +import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil +import org.jetbrains.plugins.groovy.lang.psi.impl.getArrayValue import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil @@ -19,12 +21,22 @@ const val NAMED_VARIANT_ORIGIN_INFO: String = "via @NamedVariant" const val NAMED_ARGS_PARAMETER_NAME = "__namedArgs" const val GROOVY_TRANSFORM_NAMED_VARIANT = "groovy.transform.NamedVariant" const val GROOVY_TRANSFORM_NAMED_PARAM = "groovy.transform.NamedParam" +const val GROOVY_TRANSFORM_NAMED_PARAMS = "groovy.transform.NamedParams" const val GROOVY_TRANSFORM_NAMED_DELEGATE = "groovy.transform.NamedDelegate" fun collectNamedParams(mapParameter: PsiParameter): List> { if (!mapParameter.type.equalsToText(CommonClassNames.JAVA_UTIL_MAP)) return emptyList() + val annotations = mapParameter + .getAnnotation(GROOVY_TRANSFORM_NAMED_PARAMS) + ?.findDeclaredAttributeValue("value") + ?.getArrayValue { it as? GrAnnotation } + + if (annotations != null) { + return annotations.mapNotNull(::constructNamedParameter) + } + return mapParameter.annotations.mapNotNull(::constructNamedParameter) } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/codeInsight/editorActions/GroovyParameterInfoHandlerTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/codeInsight/editorActions/GroovyParameterInfoHandlerTest.groovy index ce2971ea034f..49884d08a51e 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/codeInsight/editorActions/GroovyParameterInfoHandlerTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/codeInsight/editorActions/GroovyParameterInfoHandlerTest.groovy @@ -1,4 +1,4 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.codeInsight.editorActions import com.intellij.openapi.actionSystem.IdeActions @@ -53,6 +53,16 @@ class GroovyParameterInfoHandlerTest implements ResolveTest { testParameterHint() } + @Test + void 'method with several named params'() { + testParameterHint() + } + + @Test + void 'method with named params annotation'() { + testParameterHint() + } + private void testParameterHint() { def name = myNameRule.methodName.split(" ")*.capitalize().join('').uncapitalize() def testName = name + ".test" diff --git a/plugins/groovy/testdata/parameterInfo/methodWithNamedParamsAnnotation.test b/plugins/groovy/testdata/parameterInfo/methodWithNamedParamsAnnotation.test new file mode 100644 index 000000000000..8b8daa978126 --- /dev/null +++ b/plugins/groovy/testdata/parameterInfo/methodWithNamedParamsAnnotation.test @@ -0,0 +1,11 @@ +import groovy.transform.NamedParam +import groovy.transform.NamedParams + +String namedParams(@NamedParams([ + @NamedParam(value = 'first', type = String, required = true), + @NamedParam(value = 'last', type = String) +]) Map args) {} + +namedParams() +----- +first: String, last: String \ No newline at end of file diff --git a/plugins/groovy/testdata/parameterInfo/methodWithSeveralNamedParams.test b/plugins/groovy/testdata/parameterInfo/methodWithSeveralNamedParams.test new file mode 100644 index 000000000000..edcdea32264f --- /dev/null +++ b/plugins/groovy/testdata/parameterInfo/methodWithSeveralNamedParams.test @@ -0,0 +1,11 @@ +import groovy.transform.NamedParam +import groovy.transform.NamedVariant +@NamedVariant +String foo(@NamedParam("larch1") int param1, @NamedParam("param2") int larch2) { + null +} +println foo() +----- +@NamedParam("larch1") int param1, @NamedParam("param2") int larch2 +- +larch1: int, param2: int \ No newline at end of file