From fd4e59f2794257e96ad94adb1abde6a2fc97824a Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 12 Jun 2023 15:41:14 +0200 Subject: [PATCH] Kapt+JVM_IR: do not generate bodies of enum entries #KT-59247 Fixed --- .../backend/jvm/lower/EnumClassLowering.kt | 2 +- .../psi2ir/generators/ClassGenerator.kt | 2 +- ...onymousObjectInEnumSuperConstructor.ir.txt | 29 +++++++++++++++++++ .../anonymousObjectInEnumSuperConstructor.kt | 11 +++++++ .../anonymousObjectInEnumSuperConstructor.txt | 24 +++++++++++++++ ...ileToSourceStubConverterTestGenerated.java | 6 ++++ ...ileToSourceStubConverterTestGenerated.java | 6 ++++ 7 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.ir.txt create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.kt create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.txt diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt index 466b03f275e..c49446a228c 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt @@ -144,7 +144,7 @@ private class EnumClassLowering(private val context: JvmBackendContext) : ClassL private fun buildEnumEntryField(enumEntry: IrEnumEntry): IrField = context.cachedDeclarations.getFieldForEnumEntry(enumEntry).apply { - initializer = IrExpressionBodyImpl(enumEntry.initializerExpression!!.expression.patchDeclarationParents(this)) + initializer = enumEntry.initializerExpression?.let { IrExpressionBodyImpl(it.expression.patchDeclarationParents(this)) } annotations = annotations + enumEntry.annotations } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt index 179bfc13783..f215a5272b6 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -531,7 +531,7 @@ internal class ClassGenerator( ).buildWithScope { irEnumEntry -> irEnumEntry.parent = irEnumClass - if (!enumEntryDescriptor.isExpect) { + if (!enumEntryDescriptor.isExpect && context.configuration.generateBodies) { irEnumEntry.initializerExpression = context.irFactory.createExpressionBody( createBodyGenerator(irEnumEntry.symbol) diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.ir.txt b/plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.ir.txt new file mode 100644 index 00000000000..ef860e4e2a8 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.ir.txt @@ -0,0 +1,29 @@ +@kotlin.Metadata() +public abstract interface Callback { + + @org.jetbrains.annotations.NotNull() + public abstract java.lang.String invoke(); +} + +//////////////////// + + +@kotlin.Metadata() +public enum Foo { + /*public static final*/ FOO /* = new Foo() */; + @org.jetbrains.annotations.NotNull() + private final Callback callback = null; + + Foo(Callback callback) { + } + + @org.jetbrains.annotations.NotNull() + public final Callback getCallback() { + return null; + } + + @org.jetbrains.annotations.NotNull() + public static kotlin.enums.EnumEntries getEntries() { + return null; + } +} diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.kt b/plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.kt new file mode 100644 index 00000000000..8211e308d47 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.kt @@ -0,0 +1,11 @@ +interface Callback { + fun invoke(): String +} + +enum class Foo(val callback: Callback) { + FOO( + object : Callback { + override fun invoke(): String = "OK" + } + ) +} diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.txt b/plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.txt new file mode 100644 index 00000000000..b700d995842 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.txt @@ -0,0 +1,24 @@ +@kotlin.Metadata() +public abstract interface Callback { + + @org.jetbrains.annotations.NotNull() + public abstract java.lang.String invoke(); +} + +//////////////////// + + +@kotlin.Metadata() +public enum Foo { + /*public static final*/ FOO /* = new Foo() */; + @org.jetbrains.annotations.NotNull() + private final Callback callback = null; + + Foo(Callback callback) { + } + + @org.jetbrains.annotations.NotNull() + public final Callback getCallback() { + return null; + } +} 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 a726219e170..8a83b04b400 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 @@ -91,6 +91,12 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi runTest("plugins/kapt3/kapt3-compiler/testData/converter/anonymousInitializer.kt"); } + @Test + @TestMetadata("anonymousObjectInEnumSuperConstructor.kt") + public void testAnonymousObjectInEnumSuperConstructor() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.kt"); + } + @Test @TestMetadata("comments.kt") public void testComments() 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 8e5ac939d83..2ea3229bd85 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 @@ -91,6 +91,12 @@ public class IrClassFileToSourceStubConverterTestGenerated extends AbstractIrCla runTest("plugins/kapt3/kapt3-compiler/testData/converter/anonymousInitializer.kt"); } + @Test + @TestMetadata("anonymousObjectInEnumSuperConstructor.kt") + public void testAnonymousObjectInEnumSuperConstructor() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/anonymousObjectInEnumSuperConstructor.kt"); + } + @Test @TestMetadata("comments.kt") public void testComments() throws Exception {