KtLightAnnotation: handling vararg with single arg (EA-114679)

It is deprecated but yet possible form of usage
This commit is contained in:
Nicolay Mitropolsky
2018-01-10 20:38:10 +03:00
parent 6197c5bf7f
commit 9cb62d66cb
2 changed files with 31 additions and 5 deletions
@@ -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)}"
)
)
}
}
})
@@ -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 {