From 08c41474af30d3cee8b319e66ca39178514c1f8d Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Wed, 28 Feb 2018 13:52:11 +0300 Subject: [PATCH] KotlinLanguageInjector: "kotlin" injections in annotations handled by `injectWithCall` --- .../idea/injection/KotlinLanguageInjector.kt | 8 +++++--- .../jetbrains/kotlin/psi/KotlinInjectionTest.kt | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/injection/KotlinLanguageInjector.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/injection/KotlinLanguageInjector.kt index 4101b02f8f9..769214676f6 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/injection/KotlinLanguageInjector.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/injection/KotlinLanguageInjector.kt @@ -247,8 +247,11 @@ class KotlinLanguageInjector( val ktHost: KtElement = host val argument = ktHost.parent as? KtValueArgument ?: return null - val callExpression = PsiTreeUtil.getParentOfType(ktHost, KtCallExpression::class.java) ?: return null - val callee = callExpression.calleeExpression ?: return null + val callExpression = PsiTreeUtil.getParentOfType(ktHost, KtCallElement::class.java) ?: return null + var callee = callExpression.calleeExpression ?: return null + + if (callee is KtConstructorCalleeExpression) + callee = callee.constructorReferenceExpression ?: return null if (isAnalyzeOff()) return null @@ -286,7 +289,6 @@ class KotlinLanguageInjector( } val callee = calleeReference?.resolve() when (callee) { - is KtFunction -> return injectionForKotlinCall(argument, callee, calleeReference) is PsiClass -> { val psiClass = callee as? PsiClass ?: return null val argumentName = argument.getArgumentName()?.asName?.identifier ?: "value" diff --git a/idea/tests/org/jetbrains/kotlin/psi/KotlinInjectionTest.kt b/idea/tests/org/jetbrains/kotlin/psi/KotlinInjectionTest.kt index 026afb8559f..17e604f6332 100644 --- a/idea/tests/org/jetbrains/kotlin/psi/KotlinInjectionTest.kt +++ b/idea/tests/org/jetbrains/kotlin/psi/KotlinInjectionTest.kt @@ -463,6 +463,21 @@ class KotlinInjectionTest : AbstractInjectionTest() { ) } + fun testKotlinNestedAnnotationsPattern() { + doAnnotationInjectionTest( + patternLanguage = "kotlin", + injectedLanguage = RegExpLanguage.INSTANCE.id, + pattern = """kotlinParameter().ofFunction(0, kotlinFunction().withName("Matches").definedInClass("Matches"))""", + kotlinCode = """ + annotation class Matches(val pattern: String) + annotation class ManyMatches(val patterns: Array) + + @ManyMatches(patterns = [Matches("[A-Z][a-z]+")]) + val name = "John" + """ + ) + } + fun testKotlinAnnotationsPatternNamed() { doAnnotationInjectionTest( patternLanguage = "kotlin",