From 78e20c1098aa62408e948243233f86658c826fa4 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Fri, 28 May 2021 12:33:19 +0300 Subject: [PATCH] [KAPT] Keep original expressions in annotations vararg #KT-29929 Fixed --- .../stubs/ClassFileToSourceStubConverter.kt | 4 +++- .../converter/annotationsWithConstants.kt | 21 ++++++++++++++++ .../converter/annotationsWithConstants.txt | 24 +++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt index ac1f92d7345..1cf80e14547 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt @@ -1280,6 +1280,8 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati null } is KtCollectionLiteralExpression -> singleArg.getInnerExpressions() + is KtDotQualifiedExpression -> listOf(singleArg) + null -> args else -> null } @@ -1317,7 +1319,7 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati if (constantValue is List<*>) { val callArgs = unwrapArgumentExpression() // So we make sure something is absent in the constant value - if (callArgs != null && callArgs.size != constantValue.size) { + if (callArgs != null && callArgs.size > constantValue.size) { val literalExpressions = mapJList(callArgs, ::tryParseTypeLiteralExpression) if (literalExpressions.size == callArgs.size) { return treeMaker.NewArray(null, null, literalExpressions) diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/annotationsWithConstants.kt b/plugins/kapt3/kapt3-compiler/testData/converter/annotationsWithConstants.kt index 2d2712affbc..c51f0edc5cd 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/annotationsWithConstants.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/annotationsWithConstants.kt @@ -44,11 +44,26 @@ public class B { public final static String a9 = "A"; } +//FILE: lib/OnClick.java +package lib; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface OnClick { + int[] value() default {}; +} + //FILE: test.kt package app import lib.R as LibR import lib.R.id.textView +import lib.OnClick annotation class Bind(val id: Int) @@ -133,6 +148,12 @@ class MyActivity { @MultiValueByte(ids = byteArrayOf(B.a2)) fun multi5() {} + @OnClick(B.id.textView) + fun multiJava1() {} + + @OnClick(B.id.textView, app.R.layout.mainActivity) + fun multiJava2() {} + const val propA = B.id.textView val propB = B.id.textView var propC = B.id.textView diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/annotationsWithConstants.txt b/plugins/kapt3/kapt3-compiler/testData/converter/annotationsWithConstants.txt index 6805a8c3550..a6510b8253f 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/annotationsWithConstants.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/annotationsWithConstants.txt @@ -285,6 +285,14 @@ public final class MyActivity { public final void multi5() { } + @lib.OnClick(value = {app.B.id.textView}) + public final void multiJava1() { + } + + @lib.OnClick(value = {app.B.id.textView, app.R.layout.mainActivity}) + public final void multiJava2() { + } + public final int getPropB() { return 0; } @@ -343,6 +351,22 @@ public class R2 { package lib; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(value = ElementType.METHOD) +@Retention(value = RetentionPolicy.RUNTIME) +public @interface OnClick { + + int[] value() default {}; +} + +//////////////////// + +package lib; + public class R { public R() {