diff --git a/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/conversions/AnnotationClassConversion.kt b/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/conversions/AnnotationClassConversion.kt index df9149c7dd81..a5c2deba55a7 100644 --- a/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/conversions/AnnotationClassConversion.kt +++ b/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/conversions/AnnotationClassConversion.kt @@ -6,6 +6,7 @@ import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext import org.jetbrains.kotlin.nj2k.toExpression import org.jetbrains.kotlin.nj2k.tree.* +import org.jetbrains.kotlin.nj2k.tree.JKAnnotation.UseSiteTarget.PROPERTY_GETTER import org.jetbrains.kotlin.nj2k.types.JKJavaArrayType import org.jetbrains.kotlin.nj2k.types.isArrayType @@ -54,7 +55,7 @@ class AnnotationClassConversion(context: NewJ2kConverterContext) : RecursiveAppl ) { JKKtAnnotationArrayInitializerExpression(initializer) } else initializer, - annotationList = this::annotationList.detached(), + annotationList = ::annotationList.detached().also { it.annotations.forEach { ann -> ann.useSiteTarget = PROPERTY_GETTER } }, ).also { parameter -> parameter.trailingComments += trailingComments parameter.leadingComments += leadingComments diff --git a/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/printing/JKCodeBuilder.kt b/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/printing/JKCodeBuilder.kt index 047c9b9ddefa..90d76b67cf3d 100644 --- a/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/printing/JKCodeBuilder.kt +++ b/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/printing/JKCodeBuilder.kt @@ -802,6 +802,7 @@ internal class JKCodeBuilder(context: NewJ2kConverterContext) { override fun visitAnnotationRaw(annotation: JKAnnotation) { printer.print("@") + annotation.useSiteTarget?.let { printer.print("${it.renderName}:") } printer.renderSymbol(annotation.classSymbol, annotation) if (annotation.arguments.isNotEmpty()) { printer.par { diff --git a/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/tree/elements.kt b/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/tree/elements.kt index 47fcf2d8bfbe..eb933812ad79 100644 --- a/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/tree/elements.kt +++ b/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/tree/elements.kt @@ -4,7 +4,6 @@ package org.jetbrains.kotlin.nj2k.tree import com.intellij.psi.PsiElement import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol - import org.jetbrains.kotlin.nj2k.tree.visitors.JKVisitor import org.jetbrains.kotlin.nj2k.types.JKType @@ -157,10 +156,26 @@ class JKAnnotationList(annotations: List = emptyList()) : JKTreeEl class JKAnnotation( var classSymbol: JKClassSymbol, - arguments: List = emptyList() + arguments: List = emptyList(), + var useSiteTarget: UseSiteTarget? = null ) : JKAnnotationMemberValue() { var arguments: List by children(arguments) override fun accept(visitor: JKVisitor) = visitor.visitAnnotation(this) + + @Suppress("unused") + enum class UseSiteTarget(renderName: String? = null) { + FIELD, + FILE, + PROPERTY, + PROPERTY_GETTER("get"), + PROPERTY_SETTER("set"), + RECEIVER, + CONSTRUCTOR_PARAMETER("param"), + SETTER_PARAMETER("setparam"), + PROPERTY_DELEGATE_FIELD("delegate"); + + val renderName: String = renderName ?: name.lowercase() + } } class JKTypeArgumentList(typeArguments: List = emptyList()) : JKTreeElement(), PsiOwner by PsiOwnerImpl() { diff --git a/plugins/kotlin/j2k/new/tests/testData/newJ2k/annotations/annotationsOnAnnotationMethod.java b/plugins/kotlin/j2k/new/tests/testData/newJ2k/annotations/annotationsOnAnnotationMethod.java index a42f792adc0b..d1cc4bc68a97 100644 --- a/plugins/kotlin/j2k/new/tests/testData/newJ2k/annotations/annotationsOnAnnotationMethod.java +++ b/plugins/kotlin/j2k/new/tests/testData/newJ2k/annotations/annotationsOnAnnotationMethod.java @@ -1,6 +1,6 @@ -@interface NonNls {} +@interface Ann {} @interface Foo { - @NonNls String value(); - @NonNls String value2() default "test"; + @Ann String value(); + @Ann String value2() default "test"; } \ No newline at end of file diff --git a/plugins/kotlin/j2k/new/tests/testData/newJ2k/annotations/annotationsOnAnnotationMethod.kt b/plugins/kotlin/j2k/new/tests/testData/newJ2k/annotations/annotationsOnAnnotationMethod.kt index c25255a29ebf..0353b5f3e0bd 100644 --- a/plugins/kotlin/j2k/new/tests/testData/newJ2k/annotations/annotationsOnAnnotationMethod.kt +++ b/plugins/kotlin/j2k/new/tests/testData/newJ2k/annotations/annotationsOnAnnotationMethod.kt @@ -1,2 +1,2 @@ -internal annotation class NonNls -internal annotation class Foo(@NonNls val value: String, @NonNls val value2: String = "test") +internal annotation class Ann +internal annotation class Foo(@get:Ann val value: String, @get:Ann val value2: String = "test")