diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 60adab87126..f89a96c37f3 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol +import org.jetbrains.kotlin.fir.symbols.Fir2IrEnumEntrySymbol import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol @@ -23,6 +24,7 @@ import org.jetbrains.kotlin.ir.descriptors.* import org.jetbrains.kotlin.ir.expressions.impl.IrEnumConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl @@ -322,19 +324,26 @@ class Fir2IrClassifierStorage( fun getCachedIrEnumEntry(enumEntry: FirEnumEntry): IrEnumEntry? = enumEntryCache[enumEntry] + private fun declareIrEnumEntry(signature: IdSignature?, factory: (IrEnumEntrySymbol) -> IrEnumEntry): IrEnumEntry { + if (signature == null) { + val descriptor = WrappedEnumEntryDescriptor() + return symbolTable.declareEnumEntry(0, 0, IrDeclarationOrigin.DEFINED, descriptor, factory).apply { descriptor.bind(this) } + } + return symbolTable.declareEnumEntry(signature, { Fir2IrEnumEntrySymbol(signature) }, factory) + } + fun createIrEnumEntry( enumEntry: FirEnumEntry, irParent: IrClass?, origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED ): IrEnumEntry { return enumEntry.convertWithOffsets { startOffset, endOffset -> - val desc = WrappedEnumEntryDescriptor() - declarationStorage.enterScope(desc) - val result = symbolTable.declareEnumEntry(startOffset, endOffset, origin, desc) { symbol -> + val signature = signatureComposer.composeSignature(enumEntry) + val result = declareIrEnumEntry(signature) { symbol -> IrEnumEntryImpl( startOffset, endOffset, origin, symbol, enumEntry.name ).apply { - desc.bind(this) + declarationStorage.enterScope(descriptor) val irType = enumEntry.returnTypeRef.toIrType() if (irParent != null) { this.parent = irParent @@ -350,9 +359,9 @@ class Fir2IrClassifierStorage( IrEnumConstructorCallImpl(startOffset, endOffset, irType, irParent.constructors.first().symbol) ) } + declarationStorage.leaveScope(descriptor) } } - declarationStorage.leaveScope(desc) enumEntryCache[enumEntry] = result result } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt index 5d2c97efec1..9c7e3570446 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt @@ -49,6 +49,10 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu hashId = mangler.run { property.signatureMangle } setExpected(property.isExpect) } + + override fun visitEnumEntry(enumEntry: FirEnumEntry) { + setExpected(enumEntry.isExpect) + } } private val CallableId.relativeCallableName: FqName diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index dcccc3a22e7..635c7eb0b3a 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -515,6 +515,12 @@ open class SymbolTable( factory ) + fun declareEnumEntry( + sig: IdSignature, + symbolFactory: () -> IrEnumEntrySymbol, + enumEntryFactory: (IrEnumEntrySymbol) -> IrEnumEntry + ): IrEnumEntry = enumEntrySymbolTable.declare(sig, symbolFactory, enumEntryFactory) + fun declareEnumEntryIfNotExists(descriptor: ClassDescriptor, factory: (IrEnumEntrySymbol) -> IrEnumEntry): IrEnumEntry { return enumEntrySymbolTable.declareIfNotExists(descriptor, { createEnumEntrySymbol(descriptor) }, factory) }