From eab68642695e8b2cce97e667968547e6666af3be Mon Sep 17 00:00:00 2001 From: Ivan Gavrilovic Date: Thu, 19 Dec 2019 11:59:59 +0000 Subject: [PATCH] KT-35536: Fix enum constants in KAPT Enum constants are Pair, so make sure to unpack them correctly. --- .../stubs/ClassFileToSourceStubConverter.kt | 17 ++++++++++ .../converter/unsafePropertyInitializers.kt | 9 +++++ .../converter/unsafePropertyInitializers.txt | 34 +++++++++++++++++++ 3 files changed, 60 insertions(+) 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 f74eff0c39e..f234ffa0217 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 @@ -47,7 +47,9 @@ import org.jetbrains.kotlin.kapt3.stubs.ErrorTypeCorrector.TypeKind.METHOD_PARAM import org.jetbrains.kotlin.kapt3.stubs.ErrorTypeCorrector.TypeKind.RETURN_TYPE import org.jetbrains.kotlin.kapt3.util.* import org.jetbrains.kotlin.load.java.sources.JavaSourceElement +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegatingBindingTrace @@ -1194,6 +1196,21 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati treeMaker.Select(treeMaker.Type(enumType), treeMaker.name(valueName)) } + is Pair<*, *> -> { + assert(value.first is ClassId) + assert(value.second is Name) + val valueName = with((value.second as Name).identifier) { + if (isValidIdentifier(this)) { + this + } else { + kaptContext.compiler.log.report(kaptContext.kaptError("'$this' is an invalid Java enum value name")) + "InvalidFieldName" + } + } + val asSingleFqName = (value.first as ClassId).asSingleFqName() + + treeMaker.Select(treeMaker.FqName(asSingleFqName), treeMaker.name(value.second.toString())) + } is List<*> -> treeMaker.NewArray(null, JavacList.nil(), mapJList(value) { convertLiteralExpression(it) }) is Type -> treeMaker.Select(treeMaker.Type(value), treeMaker.name("class")) diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/unsafePropertyInitializers.kt b/plugins/kapt3/kapt3-compiler/testData/converter/unsafePropertyInitializers.kt index 0a802b38a4d..6c4637b7bba 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/unsafePropertyInitializers.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/unsafePropertyInitializers.kt @@ -21,4 +21,13 @@ object Foo { object Boo { val z = foo() fun foo() = "abc" +} + +class HavingState { + val state = State.START +} + +enum class State { + START, + FINISH, } \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/unsafePropertyInitializers.txt b/plugins/kapt3/kapt3-compiler/testData/converter/unsafePropertyInitializers.txt index cc80a16adc4..cc468684854 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/unsafePropertyInitializers.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/unsafePropertyInitializers.txt @@ -116,3 +116,37 @@ public final class Foo { super(); } } + +//////////////////// + + +import java.lang.System; + +@kotlin.Metadata() +public final class HavingState { + @org.jetbrains.annotations.NotNull() + private final State state = State.START; + + @org.jetbrains.annotations.NotNull() + public final State getState() { + return null; + } + + public HavingState() { + super(); + } +} + +//////////////////// + + +import java.lang.System; + +@kotlin.Metadata() +public enum State { + /*public static final*/ START /* = new State() */, + /*public static final*/ FINISH /* = new State() */; + + State() { + } +} \ No newline at end of file