diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolLightLazyAnnotation.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolLightLazyAnnotation.kt index 9aa3e589135..e1444eeef84 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolLightLazyAnnotation.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/SymbolLightLazyAnnotation.kt @@ -10,6 +10,7 @@ import com.intellij.psi.PsiModifierList import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationWithArgumentsInfo import org.jetbrains.kotlin.asJava.classes.lazyPub +import org.jetbrains.kotlin.light.classes.symbol.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtCallElement @@ -39,10 +40,8 @@ internal class SymbolLightLazyAnnotation( override fun getQualifiedName(): String = fqName.asString() private val _parameterList: PsiAnnotationParameterList by lazyPub { - if (annotationApplication.isCallWithArguments) { - symbolLightAnnotationParameterList { annotationApplicationWithArgumentsInfo.value.arguments } - } else { - symbolLightAnnotationParameterList() + symbolLightAnnotationParameterList { + annotationApplicationWithArgumentsInfo.value.normalizedArguments() } } @@ -59,4 +58,4 @@ internal class SymbolLightLazyAnnotation( other.parent == parent override fun hashCode(): Int = fqName.hashCode() -} +} \ No newline at end of file diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt index 5bd0e5577d1..6c38c431eca 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt @@ -199,14 +199,14 @@ internal fun KtAnnotationValue.toAnnotationMemberValue(parent: PsiElement): PsiA values.mapNotNull { element -> element.toAnnotationMemberValue(arrayLiteralParent) } } - is KtAnnotationApplicationValue -> + is KtAnnotationApplicationValue -> { SymbolLightSimpleAnnotation( fqName = annotationValue.classId?.asFqNameString(), parent = parent, - arguments = annotationValue.arguments, + arguments = annotationValue.normalizedArguments(), kotlinOrigin = annotationValue.psi, ) - + } is KtConstantAnnotationValue -> { constantValue.createPsiExpression(parent)?.let { when (it) { @@ -221,6 +221,22 @@ internal fun KtAnnotationValue.toAnnotationMemberValue(parent: PsiElement): PsiA KtUnsupportedAnnotationValue -> null } +internal fun KtAnnotationApplicationWithArgumentsInfo.normalizedArguments(): List { + val args = arguments + val ctorSymbolPointer = constructorSymbolPointer ?: return args + val element = psi ?: return args // May work incorrectly. See KT-63568 + + return analyzeForLightClasses(element) { + val constructorSymbol = ctorSymbolPointer.restoreSymbolOrThrowIfDisposed() + val params = constructorSymbol.valueParameters + val missingVarargParameterName = + params.singleOrNull { it.isVararg && !it.hasDefaultValue }?.name?.takeIf { name -> args.none { it.name == name } } + if (missingVarargParameterName == null) args + else args + KtNamedAnnotationValue(missingVarargParameterName, KtArrayAnnotationValue(emptyList(), null)) + } +} + + private fun KtEnumEntryAnnotationValue.asPsiReferenceExpression(parent: PsiElement): SymbolPsiReference? { val fqName = this.callableId?.asSingleFqName()?.asString() ?: return null val psiReference = parent.project.withElementFactorySafe { diff --git a/analysis/symbol-light-classes/testData/annotationsEquality/Deprecated.java b/analysis/symbol-light-classes/testData/annotationsEquality/Deprecated.java index bb7cc48725b..59dc5106fe2 100644 --- a/analysis/symbol-light-classes/testData/annotationsEquality/Deprecated.java +++ b/analysis/symbol-light-classes/testData/annotationsEquality/Deprecated.java @@ -1,4 +1,4 @@ -@kotlin.Deprecated(message = "", replaceWith = @kotlin.ReplaceWith(expression = ""), level = kotlin.DeprecationLevel.ERROR) +@kotlin.Deprecated(message = "", replaceWith = @kotlin.ReplaceWith(expression = "", imports = {}), level = kotlin.DeprecationLevel.ERROR) public final class MyClass /* MyClass*/ { public MyClass();// .ctor() } diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java index 612a8f5a230..6e7dd9b561b 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByPsiForLibraryTestGenerated.java @@ -42,6 +42,12 @@ public class SymbolLightClassesByPsiForLibraryTestGenerated extends AbstractSymb runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt"); } + @Test + @TestMetadata("annotationWithVaragArguments.kt") + public void testAnnotationWithVaragArguments() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.kt"); + } + @Test @TestMetadata("annotations.kt") public void testAnnotations() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java index 265b87d84da..2b3e8fbe32d 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByPsiForLibraryTestGenerated.java @@ -42,6 +42,12 @@ public class SymbolLightClassesEqualityByPsiForLibraryTestGenerated extends Abst runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt"); } + @Test + @TestMetadata("annotationWithVaragArguments.kt") + public void testAnnotationWithVaragArguments() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.kt"); + } + @Test @TestMetadata("annotations.kt") public void testAnnotations() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java index 7cef521bdcb..fe604ee4453 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByPsiForLibraryTestGenerated.java @@ -42,6 +42,12 @@ public class SymbolLightClassesParentingByPsiForLibraryTestGenerated extends Abs runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt"); } + @Test + @TestMetadata("annotationWithVaragArguments.kt") + public void testAnnotationWithVaragArguments() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.kt"); + } + @Test @TestMetadata("annotations.kt") public void testAnnotations() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java index 1e3c4e1d638..48fe9cc47bc 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByPsiForSourceTestGenerated.java @@ -42,6 +42,12 @@ public class SymbolLightClassesByPsiForSourceTestGenerated extends AbstractSymbo runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt"); } + @Test + @TestMetadata("annotationWithVaragArguments.kt") + public void testAnnotationWithVaragArguments() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.kt"); + } + @Test @TestMetadata("annotations.kt") public void testAnnotations() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java index 45d52554958..a8966471226 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByPsiForSourceTestGenerated.java @@ -42,6 +42,12 @@ public class SymbolLightClassesEqualityByPsiForSourceTestGenerated extends Abstr runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt"); } + @Test + @TestMetadata("annotationWithVaragArguments.kt") + public void testAnnotationWithVaragArguments() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.kt"); + } + @Test @TestMetadata("annotations.kt") public void testAnnotations() throws Exception { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java index 51f89edb79c..3d0e7c4f6e1 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByPsiForSourceTestGenerated.java @@ -42,6 +42,12 @@ public class SymbolLightClassesParentingByPsiForSourceTestGenerated extends Abst runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithSetParamPropertyModifier.kt"); } + @Test + @TestMetadata("annotationWithVaragArguments.kt") + public void testAnnotationWithVaragArguments() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.kt"); + } + @Test @TestMetadata("annotations.kt") public void testAnnotations() throws Exception { diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.descriptors.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.descriptors.java new file mode 100644 index 00000000000..96946314b8e --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.descriptors.java @@ -0,0 +1,49 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface A /* A*/ { + public abstract int[] x();// x() +} + +public final class AnnotationWithVaragArgumentsKt /* AnnotationWithVaragArgumentsKt*/ { + @A() + @B(x = "x", z = "z") + @C(a = @A(), b = @B(x = "x", z = "z")) + @D() + @E(d = @D()) + public static final void foo();// foo() + + @A(x = {1, 2}) + @B(x = "x", y = {1, 2}, z = "z") + @C(a = @A(x = {1, 2}), b = @B(x = "x", y = {1, 2}, z = "z")) + public static final void baz();// baz() + + @A(x = {1}) + @B(x = "x", y = {1}, z = "z") + @C(a = @A(x = {1}), b = @B(x = "x", y = {1}, z = "z")) + public static final void bar();// bar() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface B /* B*/ { + public abstract int[] y();// y() + + public abstract java.lang.String x();// x() + + public abstract java.lang.String z();// z() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface C /* C*/ { + public abstract A a();// a() + + public abstract B b();// b() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface D /* D*/ { + public abstract java.lang.String[] x() default {"a", "b"};// x() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface E /* E*/ { + public abstract D d();// d() +} diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.java new file mode 100644 index 00000000000..ce3ac5e094d --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.java @@ -0,0 +1,49 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface A /* A*/ { + public abstract int[] x();// x() +} + +public final class AnnotationWithVaragArgumentsKt /* AnnotationWithVaragArgumentsKt*/ { + @A(x = {1, 2}) + @B(x = "x", y = {1, 2}, z = "z") + @C(a = @A(x = {1, 2}), b = @B(x = "x", y = {1, 2}, z = "z")) + public static final void baz();// baz() + + @A(x = {1}) + @B(x = "x", y = {1}, z = "z") + @C(a = @A(x = {1}), b = @B(x = "x", y = {1}, z = "z")) + public static final void bar();// bar() + + @A(x = {}) + @B(x = "x", z = "z", y = {}) + @C(a = @A(x = {}), b = @B(x = "x", z = "z", y = {})) + @D() + @E(d = @D()) + public static final void foo();// foo() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface B /* B*/ { + public abstract int[] y();// y() + + public abstract java.lang.String x();// x() + + public abstract java.lang.String z();// z() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface C /* C*/ { + public abstract A a();// a() + + public abstract B b();// b() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface D /* D*/ { + public abstract java.lang.String[] x() default {"a", "b"};// x() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface E /* E*/ { + public abstract D d();// d() +} diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.kt b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.kt new file mode 100644 index 00000000000..8e0027ff489 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.kt @@ -0,0 +1,22 @@ +annotation class A(vararg val x: Int) +annotation class B(val x: String, vararg val y: Int, val z: String) +annotation class C(val a: A, val b: B) +annotation class D(vararg val x: String = ["a", "b"]) +annotation class E(val d: D) + +@A +@B(x = "x", z = "z") +@C(A(), B("x", z = "z")) +@D() +@E(d = D()) +fun foo() {} + +@A(1) +@B("x", 1, z = "z") +@C(A(1), B("x", 1, z = "z")) +fun bar() {} + +@A(1, 2) +@B("x", 1, 2, z = "z") +@C(A(1, 2), B("x", 1, 2, z = "z")) +fun baz() {} \ No newline at end of file diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.lib.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.lib.java new file mode 100644 index 00000000000..1d6ac98b607 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/annotationWithVaragArguments.lib.java @@ -0,0 +1,49 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface A /* A*/ { + public abstract int[] x();// x() +} + +public final class AnnotationWithVaragArgumentsKt /* AnnotationWithVaragArgumentsKt*/ { + @A(x = {1, 2}) + @B(x = "x", y = {1, 2}, z = "z") + @C(a = @A(x = {1, 2}), b = @B(x = "x", y = {1, 2}, z = "z")) + public static final void baz();// baz() + + @A(x = {1}) + @B(x = "x", y = {1}, z = "z") + @C(a = @A(x = {1}), b = @B(x = "x", y = {1}, z = "z")) + public static final void bar();// bar() + + @A(x = {}) + @B(x = "x", y = {}, z = "z") + @C(a = @A(x = {}), b = @B(x = "x", y = {}, z = "z")) + @D() + @E(d = @D()) + public static final void foo();// foo() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface B /* B*/ { + public abstract int[] y();// y() + + public abstract java.lang.String x();// x() + + public abstract java.lang.String z();// z() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface C /* C*/ { + public abstract A a();// a() + + public abstract B b();// b() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface D /* D*/ { + public abstract java.lang.String[] x() default {"a", "b"};// x() +} + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface E /* E*/ { + public abstract D d();// d() +} diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.fir.txt b/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.fir.txt new file mode 100644 index 00000000000..a9b1faae3c4 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.fir.txt @@ -0,0 +1,175 @@ +/** + * public final annotation class A : kotlin/Annotation { + * + * // signature: ([I)V + * public constructor(vararg x: kotlin/Int (* kotlin/IntArray *)) + * + * // getter: x()[I + * public final val x: kotlin/IntArray + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface A { + + public abstract int[] x(); +} + +//////////////////// + + +/** + * package { + * + * // signature: bar()V + * public final fun bar(): kotlin/Unit + * + * // signature: baz()V + * public final fun baz(): kotlin/Unit + * + * // signature: foo()V + * public final fun foo(): kotlin/Unit + * + * // module name: main + * } + */ +@kotlin.Metadata() +public final class AnnotationWithVaragArgumentsKt { + + public AnnotationWithVaragArgumentsKt() { + super(); + } + + @A(x = {1}) + @B(x = "x", y = {1}, z = "z") + @C(a = @A(x = {1}), b = @B(x = "x", y = {1}, z = "z")) + public static final void bar() { + } + + @A(x = {1, 2}) + @B(x = "x", y = {1, 2}, z = "z") + @C(a = @A(x = {1, 2}), b = @B(x = "x", y = {1, 2}, z = "z")) + public static final void baz() { + } + + @A(x = {}) + @B(x = "x", z = "z", y = {}) + @C(a = @A(x = {}), b = @B(x = "x", z = "z", y = {})) + @D() + @E(d = @D()) + public static final void foo() { + } +} + +//////////////////// + + +/** + * public final annotation class B : kotlin/Annotation { + * + * // signature: (Ljava/lang/String;[ILjava/lang/String;)V + * public constructor(x: kotlin/String, vararg y: kotlin/Int (* kotlin/IntArray *), z: kotlin/String) + * + * // getter: x()Ljava/lang/String; + * public final val x: kotlin/String + * public final get + * + * // getter: y()[I + * public final val y: kotlin/IntArray + * public final get + * + * // getter: z()Ljava/lang/String; + * public final val z: kotlin/String + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface B { + + public abstract java.lang.String x(); + + public abstract int[] y(); + + public abstract java.lang.String z(); +} + +//////////////////// + + +/** + * public final annotation class C : kotlin/Annotation { + * + * // signature: (LA;LB;)V + * public constructor(a: A, b: B) + * + * // getter: a()LA; + * public final val a: A + * public final get + * + * // getter: b()LB; + * public final val b: B + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface C { + + public abstract A a(); + + public abstract B b(); +} + +//////////////////// + + +/** + * public final annotation class D : kotlin/Annotation { + * + * // signature: (Lkotlin/Array;)V + * public constructor(vararg x: kotlin/String (* kotlin/Array *) (* = ... *)) + * + * // getter: x()[Ljava/lang/String; + * public final val x: kotlin/Array + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface D { + + public abstract java.lang.String[] x() default {"a", "b"}; +} + +//////////////////// + + +/** + * public final annotation class E : kotlin/Annotation { + * + * // signature: (LD;)V + * public constructor(d: D) + * + * // getter: d()LD; + * public final val d: D + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +public abstract @interface E { + + public abstract D d(); +} diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.ir.txt b/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.ir.txt new file mode 100644 index 00000000000..92956bef585 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.ir.txt @@ -0,0 +1,175 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +/** + * public final annotation class A : kotlin/Annotation { + * + * // signature: ([I)V + * public constructor(vararg x: kotlin/Int (* kotlin/IntArray *)) + * + * // getter: x()[I + * public final val x: kotlin/IntArray + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +public abstract @interface A { + + public abstract int[] x(); +} + +//////////////////// + + +/** + * package { + * + * // signature: bar()V + * public final fun bar(): kotlin/Unit + * + * // signature: baz()V + * public final fun baz(): kotlin/Unit + * + * // signature: foo()V + * public final fun foo(): kotlin/Unit + * + * // module name: main + * } + */ +@kotlin.Metadata() +public final class AnnotationWithVaragArgumentsKt { + + public AnnotationWithVaragArgumentsKt() { + super(); + } + + @A(x = {}) + @B(x = "x", z = "z", y = {}) + @C(a = @A(x = {}), b = @B(x = "x", y = {}, z = "z")) + @D() + @E(d = @D()) + public static final void foo() { + } + + @A(x = {1}) + @B(x = "x", y = {1}, z = "z") + @C(a = @A(x = {1}), b = @B(x = "x", y = {1}, z = "z")) + public static final void bar() { + } + + @A(x = {1, 2}) + @B(x = "x", y = {1, 2}, z = "z") + @C(a = @A(x = {1, 2}), b = @B(x = "x", y = {1, 2}, z = "z")) + public static final void baz() { + } +} + +//////////////////// + + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +/** + * public final annotation class B : kotlin/Annotation { + * + * // signature: (Ljava/lang/String;[ILjava/lang/String;)V + * public constructor(x: kotlin/String, vararg y: kotlin/Int (* kotlin/IntArray *), z: kotlin/String) + * + * // getter: x()Ljava/lang/String; + * public final val x: kotlin/String + * public final get + * + * // getter: y()[I + * public final val y: kotlin/IntArray + * public final get + * + * // getter: z()Ljava/lang/String; + * public final val z: kotlin/String + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +public abstract @interface B { + + public abstract java.lang.String x(); + + public abstract int[] y(); + + public abstract java.lang.String z(); +} + +//////////////////// + + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +/** + * public final annotation class C : kotlin/Annotation { + * + * // signature: (LA;LB;)V + * public constructor(a: A, b: B) + * + * // getter: a()LA; + * public final val a: A + * public final get + * + * // getter: b()LB; + * public final val b: B + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +public abstract @interface C { + + public abstract A a(); + + public abstract B b(); +} + +//////////////////// + + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +/** + * public final annotation class D : kotlin/Annotation { + * + * // signature: (Lkotlin/Array;)V + * public constructor(vararg x: kotlin/String (* kotlin/Array *) (* = ... *)) + * + * // getter: x()[Ljava/lang/String; + * public final val x: kotlin/Array + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +public abstract @interface D { + + public abstract java.lang.String[] x() default {"a", "b"}; +} + +//////////////////// + + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +/** + * public final annotation class E : kotlin/Annotation { + * + * // signature: (LD;)V + * public constructor(d: D) + * + * // getter: d()LD; + * public final val d: D + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +public abstract @interface E { + + public abstract D d(); +} diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.kt b/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.kt new file mode 100644 index 00000000000..8e0027ff489 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.kt @@ -0,0 +1,22 @@ +annotation class A(vararg val x: Int) +annotation class B(val x: String, vararg val y: Int, val z: String) +annotation class C(val a: A, val b: B) +annotation class D(vararg val x: String = ["a", "b"]) +annotation class E(val d: D) + +@A +@B(x = "x", z = "z") +@C(A(), B("x", z = "z")) +@D() +@E(d = D()) +fun foo() {} + +@A(1) +@B("x", 1, z = "z") +@C(A(1), B("x", 1, z = "z")) +fun bar() {} + +@A(1, 2) +@B("x", 1, 2, z = "z") +@C(A(1, 2), B("x", 1, 2, z = "z")) +fun baz() {} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.txt b/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.txt new file mode 100644 index 00000000000..9524f851ab5 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.txt @@ -0,0 +1,175 @@ +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +/** + * public final annotation class A : kotlin/Annotation { + * + * // signature: ([I)V + * public constructor(vararg x: kotlin/Int (* kotlin/IntArray *)) + * + * // getter: x()[I + * public final val x: kotlin/IntArray + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +public abstract @interface A { + + public abstract int[] x(); +} + +//////////////////// + + +/** + * package { + * + * // signature: bar()V + * public final fun bar(): kotlin/Unit + * + * // signature: baz()V + * public final fun baz(): kotlin/Unit + * + * // signature: foo()V + * public final fun foo(): kotlin/Unit + * + * // module name: main + * } + */ +@kotlin.Metadata() +public final class AnnotationWithVaragArgumentsKt { + + public AnnotationWithVaragArgumentsKt() { + super(); + } + + @A(x = {}) + @B(x = "x", z = "z", y = {}) + @C(a = @A(x = {}), b = @B(z = "z", y = {}, x = "x")) + @D() + @E(d = @D()) + public static final void foo() { + } + + @A(x = {1}) + @B(x = "x", y = {1}, z = "z") + @C(a = @A(x = {1}), b = @B(z = "z", y = {1}, x = "x")) + public static final void bar() { + } + + @A(x = {1, 2}) + @B(x = "x", y = {1, 2}, z = "z") + @C(a = @A(x = {1, 2}), b = @B(z = "z", y = {1, 2}, x = "x")) + public static final void baz() { + } +} + +//////////////////// + + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +/** + * public final annotation class B : kotlin/Annotation { + * + * // signature: (Ljava/lang/String;[ILjava/lang/String;)V + * public constructor(x: kotlin/String, vararg y: kotlin/Int (* kotlin/IntArray *), z: kotlin/String) + * + * // getter: x()Ljava/lang/String; + * public final val x: kotlin/String + * public final get + * + * // getter: y()[I + * public final val y: kotlin/IntArray + * public final get + * + * // getter: z()Ljava/lang/String; + * public final val z: kotlin/String + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +public abstract @interface B { + + public abstract java.lang.String x(); + + public abstract int[] y(); + + public abstract java.lang.String z(); +} + +//////////////////// + + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +/** + * public final annotation class C : kotlin/Annotation { + * + * // signature: (LA;LB;)V + * public constructor(a: A, b: B) + * + * // getter: a()LA; + * public final val a: A + * public final get + * + * // getter: b()LB; + * public final val b: B + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +public abstract @interface C { + + public abstract A a(); + + public abstract B b(); +} + +//////////////////// + + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +/** + * public final annotation class D : kotlin/Annotation { + * + * // signature: (Lkotlin/Array;)V + * public constructor(vararg x: kotlin/String (* kotlin/Array *) (* = ... *)) + * + * // getter: x()[Ljava/lang/String; + * public final val x: kotlin/Array + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +public abstract @interface D { + + public abstract java.lang.String[] x() default {"a", "b"}; +} + +//////////////////// + + +@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) +/** + * public final annotation class E : kotlin/Annotation { + * + * // signature: (LD;)V + * public constructor(d: D) + * + * // getter: d()LD; + * public final val d: D + * public final get + * + * // module name: main + * } + */ +@kotlin.Metadata() +public abstract @interface E { + + public abstract D d(); +} diff --git a/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/ClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/ClassFileToSourceStubConverterTestGenerated.java index c47405b6f7a..9057cfe2edd 100644 --- a/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/ClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/ClassFileToSourceStubConverterTestGenerated.java @@ -55,6 +55,12 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi runTest("plugins/kapt3/kapt3-compiler/testData/converter/annotationWithFqNames.kt"); } + @Test + @TestMetadata("annotationWithVaragArguments.kt") + public void testAnnotationWithVaragArguments() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.kt"); + } + @Test @TestMetadata("annotations.kt") public void testAnnotations() throws Exception { diff --git a/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/IrClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/IrClassFileToSourceStubConverterTestGenerated.java index b3ffb2e0b22..01e71cd0522 100644 --- a/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/IrClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/kapt3-compiler/tests-gen/org/jetbrains/kotlin/kapt3/test/runners/IrClassFileToSourceStubConverterTestGenerated.java @@ -55,6 +55,12 @@ public class IrClassFileToSourceStubConverterTestGenerated extends AbstractIrCla runTest("plugins/kapt3/kapt3-compiler/testData/converter/annotationWithFqNames.kt"); } + @Test + @TestMetadata("annotationWithVaragArguments.kt") + public void testAnnotationWithVaragArguments() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.kt"); + } + @Test @TestMetadata("annotations.kt") public void testAnnotations() throws Exception { diff --git a/plugins/kapt4/tests-gen/org/jetbrains/kotlin/kapt4/KotlinKapt4ContextTestGenerated.java b/plugins/kapt4/tests-gen/org/jetbrains/kotlin/kapt4/KotlinKapt4ContextTestGenerated.java index 145b5f83740..97386effa4b 100644 --- a/plugins/kapt4/tests-gen/org/jetbrains/kotlin/kapt4/KotlinKapt4ContextTestGenerated.java +++ b/plugins/kapt4/tests-gen/org/jetbrains/kotlin/kapt4/KotlinKapt4ContextTestGenerated.java @@ -55,6 +55,12 @@ public class KotlinKapt4ContextTestGenerated extends AbstractKotlinKapt4ContextT runTest("plugins/kapt4/../kapt3/kapt3-compiler/testData/converter/annotationWithFqNames.kt"); } + @Test + @TestMetadata("annotationWithVaragArguments.kt") + public void testAnnotationWithVaragArguments() throws Exception { + runTest("plugins/kapt4/../kapt3/kapt3-compiler/testData/converter/annotationWithVaragArguments.kt"); + } + @Test @TestMetadata("annotations.kt") public void testAnnotations() throws Exception {