From e39fc53f253108c1767f198cf08b3cf4fcb5e0c7 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 13 Feb 2019 12:42:40 +0300 Subject: [PATCH] New J2K: Correctly detect varargs argument in annotations & do not throw away named arguments in annotations --- .../nj2k/conversions/AnnotationConversion.kt | 15 +++++++++++++-- nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt | 9 ++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/AnnotationConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/AnnotationConversion.kt index 47d1c79e0d8..9569a159a88 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/AnnotationConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/AnnotationConversion.kt @@ -7,12 +7,12 @@ package org.jetbrains.kotlin.nj2k.conversions import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.isVarargsArgument -import org.jetbrains.kotlin.nj2k.primaryConstructor import org.jetbrains.kotlin.nj2k.toExpression import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.impl.JKAnnotationNameParameterImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKAnnotationParameterImpl -import org.jetbrains.kotlin.nj2k.tree.impl.JKUniverseClassSymbol +import org.jetbrains.kotlin.nj2k.tree.impl.JKKtAnnotationArrayInitializerExpressionImpl +import org.jetbrains.kotlin.nj2k.tree.impl.JKNameIdentifierImpl class AnnotationConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { override fun applyToElement(element: JKTreeElement): JKTreeElement { @@ -36,6 +36,17 @@ class AnnotationConversion(private val context: ConversionContext) : RecursiveAp (annotationParameter.value as JKKtAnnotationArrayInitializerExpression)::initializers .detached() .map { JKAnnotationParameterImpl(it) } + annotationParameter is JKAnnotationNameParameter + && annotation.isVarargsArgument(index) + && annotation.classSymbol.target is JKClass + && annotationParameter.value !is JKKtAnnotationArrayInitializerExpression -> { + listOf( + JKAnnotationNameParameterImpl( + JKKtAnnotationArrayInitializerExpressionImpl(annotationParameter::value.detached()), + JKNameIdentifierImpl(annotationParameter.name.value) + ) + ) + } annotationParameter is JKAnnotationNameParameterImpl -> listOf( JKAnnotationNameParameterImpl( diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt index 9a1d0f3a4cc..46496ba8a09 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/expressions.kt @@ -557,7 +557,14 @@ fun JKAnnotation.isVarargsArgument(index: Int): Boolean { val target = classSymbol.target return when (target) { is JKClass -> target.primaryConstructor()?.parameters?.getOrNull(index)?.isVarArgs - is PsiClass -> target.methods.getOrNull(index)?.isVarArgs + is PsiClass -> target.methods.getOrNull(index)?.let { + it.isVarArgs || it.name == "value" + } else -> false } ?: false } + + +fun JKExpression.asStatement(): JKExpressionStatement = + JKExpressionStatementImpl(this) +