From 9cb62d66cb2e9fa1a44757a2a308bb696a704bb6 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Wed, 10 Jan 2018 20:38:10 +0300 Subject: [PATCH] KtLightAnnotation: handling vararg with single arg (EA-114679) It is deprecated but yet possible form of usage --- .../asJava/elements/lightAnnotations.kt | 15 ++++++++----- .../kotlin/asJava/KtLightAnnotationTest.kt | 21 +++++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt index 96704e8d146..2df24309998 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt @@ -194,15 +194,20 @@ class KtLightAnnotationForSourceEntry( delegate.initializers.mapIndexed { i, memberValue -> wrapAnnotationValue(memberValue, this, { originalExpression.let { ktOrigin -> - when (ktOrigin) { - is KtValueArgumentList -> ktOrigin.arguments.getOrNull(i)?.getArgumentExpression() - is KtCallElement -> ktOrigin.valueArguments.getOrNull(i)?.getArgumentExpression() - is KtCollectionLiteralExpression -> ktOrigin.getInnerExpressions().getOrNull(i) + when { + ktOrigin is KtValueArgumentList -> ktOrigin.arguments.getOrNull(i)?.getArgumentExpression() + ktOrigin is KtCallElement -> ktOrigin.valueArguments.getOrNull(i)?.getArgumentExpression() + ktOrigin is KtCollectionLiteralExpression -> ktOrigin.getInnerExpressions().getOrNull(i) + delegate.initializers.size == 1 -> ktOrigin else -> null }.also { if (it == null) LOG.error("error wrapping ${memberValue.javaClass} for ${ktOrigin?.javaClass} in ${ktOrigin?.containingFile}", - Attachment("source_fragments.txt", "origin: '${psiReport(ktOrigin)}', delegate: ${psiReport(delegate)}")) + Attachment( + "source_fragments.txt", + "origin: '${psiReport(ktOrigin)}', delegate: ${psiReport(delegate)}, parent: ${psiReport(parent)}" + ) + ) } } }) diff --git a/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt b/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt index 9e298696e09..46e8c2e4a79 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt +++ b/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt @@ -339,6 +339,27 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() { } } + fun testVarargWithSingleArg() { + myFixture.addClass(""" + public @interface Annotation { + String[] value(); + } + """.trimIndent()) + + myFixture.configureByText("AnnotatedClass.kt", """ + @Annotation(value = "a") + open class AnnotatedClass + """.trimIndent()) + myFixture.testHighlighting("Annotation.java", "AnnotatedClass.kt") + + val annotations = myFixture.findClass("AnnotatedClass").expectAnnotations(1) + val annotationAttributeVal = annotations.first().findAttributeValue("value") as PsiArrayInitializerMemberValue + assertTextAndRange("\"a\"", annotationAttributeVal) + for ((i, arg) in listOf("\"a\"").withIndex()) { + assertTextAndRange(arg, annotationAttributeVal.initializers[i]) + } + } + fun testVarargWithArrayLiteralAndSpread() { myFixture.addClass(""" public @interface Annotation {