IDEA-217757 Support @NamedParams annotation

GitOrigin-RevId: 2ef0d22de463ac5689aec4f715750a5f38d2a500
This commit is contained in:
alexey.afanasiev
2019-07-11 17:42:27 +03:00
committed by intellij-monorepo-bot
parent e6bd15c161
commit 226dc36006
4 changed files with 45 additions and 1 deletions
@@ -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<Pair<String, PsiType>> {
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)
}
@@ -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"
@@ -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(<caret>)
-----
<html><b>first: String, last: String</b></html>
@@ -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(<caret>)
-----
<html><b>@NamedParam(&quot;larch1&quot;) int param1</b>,</html><html> @NamedParam(&quot;param2&quot;) int larch2</html>
-
<html><b>larch1: int, param2: int</b></html>