diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 0dd71c216ca..5d7db2bc5d9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -635,11 +635,13 @@ val IrFunctionReference.typeSubstitutionMap: Map val IrFunctionAccessExpression.typeSubstitutionMap: Map get() = getTypeSubstitutionMap(symbol.owner) -fun SymbolTable.referenceMember(descriptor: DeclarationDescriptor): IrSymbol = +// Note: there is not enough information in a descriptor to choose between an enum entry and its corresponding class, +// so the entry itself is chosen in that case. +fun SymbolTable.referenceMember(descriptor: DeclarationDescriptor, correspondingClassForEnum: Boolean = false): IrSymbol = descriptor.accept( object : DeclarationDescriptorVisitorEmptyBodies() { override fun visitClassDescriptor(descriptor: ClassDescriptor, data: Unit?) = - if (DescriptorUtils.isEnumEntry(descriptor)) + if (DescriptorUtils.isEnumEntry(descriptor) && !correspondingClassForEnum) referenceEnumEntry(descriptor) else referenceClass(descriptor) diff --git a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmDescriptorUniqIdAware.kt b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmDescriptorUniqIdAware.kt index a5efa529e68..ec09d80e4be 100644 --- a/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmDescriptorUniqIdAware.kt +++ b/compiler/ir/serialization.jvm/src/org/jetbrains/kotlin/ir/backend/jvm/serialization/JvmDescriptorUniqIdAware.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.common.serialization.tryGetExtension import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent +import org.jetbrains.kotlin.ir.declarations.IrEnumEntry import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf import org.jetbrains.kotlin.serialization.deserialization.descriptors.* @@ -60,7 +61,7 @@ class JvmDescriptorUniqIdAware(val symbolTable: SymbolTable, val stubGenerator: current.parent = symbolTable.findOrDeclareExternalPackageFragment(nextDescriptor) break } else { - val next = referenceOrDeclare(nextDescriptor) + val next = referenceOrDeclare(nextDescriptor, correspondingClassForEnum = true) current.parent = next as IrDeclarationParent currentDescriptor = nextDescriptor current = next @@ -69,8 +70,8 @@ class JvmDescriptorUniqIdAware(val symbolTable: SymbolTable, val stubGenerator: return result } - private fun referenceOrDeclare(descriptor: DeclarationDescriptor): IrDeclaration = - symbolTable.referenceMember(descriptor).also { + private fun referenceOrDeclare(descriptor: DeclarationDescriptor, correspondingClassForEnum: Boolean = false): IrDeclaration = + symbolTable.referenceMember(descriptor, correspondingClassForEnum).also { if (!it.isBound) { stubGenerator.getDeclaration(it) }