New J2K: Correctly detect varargs argument in annotations & do not throw away named arguments in annotations

This commit is contained in:
Ilya Kirillov
2019-02-13 12:42:40 +03:00
committed by Ilya Kirillov
parent 90c12736da
commit e39fc53f25
2 changed files with 21 additions and 3 deletions
@@ -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(
@@ -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)