diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeserializeDescriptorReference.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeserializeDescriptorReference.kt index 0a2454ae9eb..1721d850673 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeserializeDescriptorReference.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeserializeDescriptorReference.kt @@ -5,10 +5,13 @@ package org.jetbrains.kotlin.backend.common.serialization +import org.jetbrains.kotlin.backend.common.descriptors.WrappedClassConstructorDescriptor +import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.backend.common.serialization.UniqIdKey import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.backend.common.serialization.resolveFakeOverrideMaybeAbstract +import org.jetbrains.kotlin.descriptors.impl.EnumEntrySyntheticClassDescriptor import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/SerializeDescriptorReference.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/SerializeDescriptorReference.kt index 60c36eb6c83..8fcdb32a65c 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/SerializeDescriptorReference.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/SerializeDescriptorReference.kt @@ -10,6 +10,8 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.util.isAccessor import org.jetbrains.kotlin.ir.util.isGetter import org.jetbrains.kotlin.ir.util.isSetter +import org.jetbrains.kotlin.ir.util.nameForIrSerialization +import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.descriptorUtil.classId @@ -18,6 +20,12 @@ open class DescriptorReferenceSerializer( val serializeString: (String) -> KotlinIr.String, mangler: KotlinMangler): KotlinMangler by mangler { + private fun isEnumSpecialMember(descriptor: DeclarationDescriptor): Boolean { + if (descriptor !is SimpleFunctionDescriptor) return false + + return DescriptorFactory.isEnumValueOfMethod(descriptor) || DescriptorFactory.isEnumValuesMethod(descriptor) + } + // Not all exported descriptors are deserialized, some a synthesized anew during metadata deserialization. // Those created descriptors can't carry the uniqIdIndex, since it is available only for deserialized descriptors. // So we record the uniq id of some other "discoverable" descriptor for which we know for sure that it will be @@ -51,10 +59,9 @@ open class DescriptorReferenceSerializer( val isAccessor = declaration.isAccessor val isBackingField = declaration is IrField && declaration.correspondingProperty != null val isFakeOverride = declaration.origin == IrDeclarationOrigin.FAKE_OVERRIDE - val isDefaultConstructor = - descriptor is ClassConstructorDescriptor && containingDeclaration is ClassDescriptor && containingDeclaration.kind == ClassKind.OBJECT + val isDefaultConstructor = descriptor is ClassConstructorDescriptor && containingDeclaration is ClassDescriptor && (containingDeclaration.kind == ClassKind.OBJECT) val isEnumEntry = descriptor is ClassDescriptor && descriptor.kind == ClassKind.ENUM_ENTRY - val isEnumSpecial = declaration.origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER + val isEnumSpecial = isEnumSpecialMember(descriptor) val isTypeParameter = declaration is IrTypeParameter && declaration.parent is IrClass // The corresponding descriptor in deserialized metadata has constructors = emptyList() etc. diff --git a/compiler/testData/codegen/box/enum/enumMultiModule.kt b/compiler/testData/codegen/box/enum/enumMultiModule.kt new file mode 100644 index 00000000000..5971013a250 --- /dev/null +++ b/compiler/testData/codegen/box/enum/enumMultiModule.kt @@ -0,0 +1,22 @@ +// WITH_RUNTIME +// MODULE: lib +// FILE: common.kt + +enum class FooEnum(val s: String) { + O("O"), + FAIL("FAIL"), + K("K"); +} + + +// MODULE: bar(lib) +// FILE: second.kt + +fun bar(): String = FooEnum.valueOf("O").s + FooEnum.values()[2].s + +// MODULE: main(bar) +// FILE: main.kt + +fun box(): String { + return bar() +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index c75d5baa3d7..9bb6c5b407a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -10199,6 +10199,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/enum/enumInheritedFromTrait.kt"); } + @TestMetadata("enumMultiModule.kt") + public void testEnumMultiModule() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumMultiModule.kt"); + } + @TestMetadata("enumShort.kt") public void testEnumShort() throws Exception { runTest("compiler/testData/codegen/box/enum/enumShort.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 7c2162b8f37..a8f9663d78a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -10199,6 +10199,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/enum/enumInheritedFromTrait.kt"); } + @TestMetadata("enumMultiModule.kt") + public void testEnumMultiModule() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumMultiModule.kt"); + } + @TestMetadata("enumShort.kt") public void testEnumShort() throws Exception { runTest("compiler/testData/codegen/box/enum/enumShort.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 8d06a6dceee..8aa1a306646 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -10199,6 +10199,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/enum/enumInheritedFromTrait.kt"); } + @TestMetadata("enumMultiModule.kt") + public void testEnumMultiModule() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumMultiModule.kt"); + } + @TestMetadata("enumShort.kt") public void testEnumShort() throws Exception { runTest("compiler/testData/codegen/box/enum/enumShort.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 47118bade90..bddd8fce440 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -7904,6 +7904,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/enum/enumInheritedFromTrait.kt"); } + @TestMetadata("enumMultiModule.kt") + public void testEnumMultiModule() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumMultiModule.kt"); + } + @TestMetadata("enumShort.kt") public void testEnumShort() throws Exception { runTest("compiler/testData/codegen/box/enum/enumShort.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 7ae94f197ff..81ceb9797c0 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -8989,6 +8989,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/enum/enumInheritedFromTrait.kt"); } + @TestMetadata("enumMultiModule.kt") + public void testEnumMultiModule() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumMultiModule.kt"); + } + @TestMetadata("enumShort.kt") public void testEnumShort() throws Exception { runTest("compiler/testData/codegen/box/enum/enumShort.kt");