From b839081349ed6c724deed01f489500a1eaac6f1d Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Mon, 2 Oct 2017 13:20:06 +0300 Subject: [PATCH] Support for collections literals in LightAnnotations (KT-20543) --- .../asJava/elements/lightAnnotations.kt | 8 ++++- .../kotlin/asJava/KtLightAnnotationTest.kt | 33 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) 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 8844bd063f5..036ff13a5df 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 @@ -183,7 +183,13 @@ class KtLightAnnotationForSourceEntry( private val _initializers by lazyPub { delegate.initializers.mapIndexed { i, it -> wrapAnnotationValue(it, this, { - (originalExpression as KtCallElement).valueArguments[i].getArgumentExpression()!! + originalExpression.let { + when (it) { + is KtCallElement -> it.valueArguments[i].getArgumentExpression()!! + is KtCollectionLiteralExpression -> it.getInnerExpressions()[i] + else -> throw UnsupportedOperationException("cant process $it of type ${it?.javaClass}") + } + } }) }.toTypedArray() } diff --git a/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt b/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt index 5286491bf15..8835b08849d 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt +++ b/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt @@ -16,9 +16,14 @@ package org.jetbrains.kotlin.asJava +import com.intellij.openapi.application.WriteAction +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.psi.* import com.intellij.testFramework.LightProjectDescriptor import junit.framework.TestCase +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.idea.facet.configureFacet +import org.jetbrains.kotlin.idea.facet.getOrCreateFacet import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor @@ -202,6 +207,25 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() { assertTextAndRange("\"def\"", annotationAttributeVal.initializers[1]) } + fun testKotlinAnnotationWithStringArrayLiteral() { + configureKotlinVersion("1.2") + myFixture.configureByText("AnnotatedClass.kt", """ + annotation class Anno(val params: Array) + @Anno(params = ["abc", "def"]) + class AnnotatedClass + """.trimIndent()) + myFixture.testHighlighting("AnnotatedClass.kt") + + val annotations = myFixture.findClass("AnnotatedClass").expectAnnotations(1) + val annotationAttributeVal = annotations.first().findAttributeValue("params") as PsiElement + assertTextAndRange("[\"abc\", \"def\"]", annotationAttributeVal) + + annotationAttributeVal as PsiArrayInitializerMemberValue + assertTextAndRange("\"abc\"", annotationAttributeVal.initializers[0]) + assertTextAndRange("\"def\"", annotationAttributeVal.initializers[1]) + } + + fun testKotlinAnnotationsArray() { myFixture.configureByText("AnnotatedClass.kt", """ annotation class Anno1(val anno2: Array) @@ -376,4 +400,13 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() { number, size) } + private fun configureKotlinVersion(version: String) { + WriteAction.run { + val modelsProvider = IdeModifiableModelsProviderImpl(project) + val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) + facet.configureFacet(version, LanguageFeature.State.DISABLED, null, modelsProvider) + modelsProvider.commit() + } + } + } \ No newline at end of file