diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBytecodeTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBytecodeTextTestGenerated.java index 8d3a791316d..460f0616d26 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBytecodeTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBytecodeTextTestGenerated.java @@ -2253,6 +2253,18 @@ public class FirLightTreeBytecodeTextTestGenerated extends AbstractFirLightTreeB public void testKt18731_2() throws Exception { runTest("compiler/testData/codegen/bytecodeText/enum/kt18731_2.kt"); } + + @Test + @TestMetadata("kt57671_1.kt") + public void testKt57671_1() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/enum/kt57671_1.kt"); + } + + @Test + @TestMetadata("kt57671_2.kt") + public void testKt57671_2() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/enum/kt57671_2.kt"); + } } @Nested diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBytecodeTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBytecodeTextTestGenerated.java index 7a13117eb5e..0f002c7f3ba 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBytecodeTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBytecodeTextTestGenerated.java @@ -2253,6 +2253,18 @@ public class FirPsiBytecodeTextTestGenerated extends AbstractFirPsiBytecodeTextT public void testKt18731_2() throws Exception { runTest("compiler/testData/codegen/bytecodeText/enum/kt18731_2.kt"); } + + @Test + @TestMetadata("kt57671_1.kt") + public void testKt57671_1() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/enum/kt57671_1.kt"); + } + + @Test + @TestMetadata("kt57671_2.kt") + public void testKt57671_2() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/enum/kt57671_2.kt"); + } } @Nested diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumExternalEntriesLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumExternalEntriesLowering.kt index 6d0ed3fba6a..5d587908b6f 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumExternalEntriesLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumExternalEntriesLowering.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin +import org.jetbrains.kotlin.backend.jvm.ir.isInCurrentModule import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.declarations.addField @@ -111,13 +112,20 @@ class EnumExternalEntriesLowering(private val context: JvmBackendContext) : File return IrGetFieldImpl(expression.startOffset, expression.endOffset, field.symbol, field.type) } - private fun IrClass.hasEnumEntriesFunction() = functions.any { - it.name.toString() == "" - && it.dispatchReceiverParameter == null - && it.extensionReceiverParameter == null - && it.valueParameters.isEmpty() + private fun IrClass.hasEnumEntriesFunction(): Boolean { + // Enums from other modules are always loaded with a property `entries` which has a getter ``. + // Enums from the current module will have a property `entries` if they are unlowered yet (i.e. enum is declared in another file + // which will be lowered after the file with the call site), or a function `` if they are already lowered. + return functions.any { it.isGetEntries() } + || (properties.any { it.getter?.isGetEntries() == true } && isInCurrentModule()) } + private fun IrSimpleFunction.isGetEntries(): Boolean = + name.toString() == "" + && dispatchReceiverParameter == null + && extensionReceiverParameter == null + && valueParameters.isEmpty() + override fun visitClassNew(declaration: IrClass): IrStatement { val oldState = state val mappingState = EntriesMappingState() diff --git a/compiler/testData/codegen/bytecodeText/enum/kt57671_1.kt b/compiler/testData/codegen/bytecodeText/enum/kt57671_1.kt new file mode 100644 index 00000000000..f1dd7596926 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/enum/kt57671_1.kt @@ -0,0 +1,13 @@ +// TARGET_BACKEND: JVM_IR +// FILE: 1.kt + +enum class E + +// FILE: 2.kt + +@OptIn(ExperimentalStdlibApi::class) +fun test() { + E.entries +} + +// 0 EntriesMappings diff --git a/compiler/testData/codegen/bytecodeText/enum/kt57671_2.kt b/compiler/testData/codegen/bytecodeText/enum/kt57671_2.kt new file mode 100644 index 00000000000..fadf7fb457c --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/enum/kt57671_2.kt @@ -0,0 +1,13 @@ +// TARGET_BACKEND: JVM_IR +// FILE: 1.kt + +@OptIn(ExperimentalStdlibApi::class) +fun test() { + E.entries +} + +// FILE: 2.kt + +enum class E + +// 0 EntriesMappings diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java index 652dcfa5458..8cfe593d5f5 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java @@ -2253,6 +2253,18 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest { public void testKt18731_2() throws Exception { runTest("compiler/testData/codegen/bytecodeText/enum/kt18731_2.kt"); } + + @Test + @TestMetadata("kt57671_1.kt") + public void testKt57671_1() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/enum/kt57671_1.kt"); + } + + @Test + @TestMetadata("kt57671_2.kt") + public void testKt57671_2() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/enum/kt57671_2.kt"); + } } @Nested