diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index 14b0660e6d2..4e1065053db 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.symbols.AccessorSymbol +import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.ir.IrElement @@ -302,9 +303,10 @@ internal fun IrClass.findMatchingOverriddenSymbolsFromSupertypes( visited: MutableSet = mutableSetOf() ): List { for (superType in superTypes) { - val superTypeClass = superType.classOrNull - if (superTypeClass is IrClassSymbolImpl || superTypeClass is IrClassPublicSymbolImpl) { - superTypeClass.owner.findMatchingOverriddenSymbolsFromThisAndSupertypes(irBuiltIns, target, result, visited) + when (val superTypeClass = superType.classOrNull) { + is IrClassSymbolImpl, is IrClassPublicSymbolImpl, is Fir2IrClassSymbol -> { + superTypeClass.owner.findMatchingOverriddenSymbolsFromThisAndSupertypes(irBuiltIns, target, result, visited) + } } } return result 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 285e76cc108..17f31e98d4f 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 @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.* 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.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol @@ -159,15 +160,15 @@ class Fir2IrClassifierStorage( parent: IrDeclarationParent? = null, origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED ): IrClass { - val descriptor = WrappedClassDescriptor() val visibility = regularClass.visibility val modality = if (regularClass.classKind == ClassKind.ENUM_CLASS) { regularClass.enumClassModality() } else { regularClass.modality ?: Modality.FINAL } + val signature = signatureComposer.composeSignature(regularClass) val irClass = regularClass.convertWithOffsets { startOffset, endOffset -> - symbolTable.declareClass(descriptor) { symbol -> + symbolTable.declareClass(signature, { Fir2IrClassSymbol(signature) }) { symbol -> IrClassImpl( startOffset, endOffset, @@ -185,8 +186,8 @@ class Fir2IrClassifierStorage( isExpect = regularClass.isExpect, isFun = regularClass.isFun ).apply { - metadata = FirMetadataSource.Class(regularClass, descriptor) - descriptor.bind(this) + val descriptor = symbol.descriptor + metadata = FirMetadataSource.Class(regularClass, descriptor as WrappedClassDescriptor) } } } @@ -207,19 +208,19 @@ class Fir2IrClassifierStorage( name: Name = Name.special(""), irParent: IrDeclarationParent? = null ): IrClass { - val descriptor = WrappedClassDescriptor() val origin = IrDeclarationOrigin.DEFINED val modality = Modality.FINAL + val signature = signatureComposer.composeSignature(anonymousObject) val result = anonymousObject.convertWithOffsets { startOffset, endOffset -> - symbolTable.declareClass(descriptor) { symbol -> + symbolTable.declareClass(signature, { Fir2IrClassSymbol(signature) }) { symbol -> IrClassImpl( startOffset, endOffset, origin, symbol, name, // NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects anonymousObject.classKind.takeIf { it == ClassKind.ENUM_ENTRY } ?: ClassKind.CLASS, visibility, modality ).apply { - metadata = FirMetadataSource.Class(anonymousObject, descriptor) - descriptor.bind(this) + val descriptor = symbol.descriptor + metadata = FirMetadataSource.Class(anonymousObject, descriptor as WrappedClassDescriptor) setThisReceiver(anonymousObject.typeParameters) if (irParent != null) { this.parent = irParent 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 b067675f2c9..dcccc3a22e7 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 @@ -398,6 +398,18 @@ open class SymbolTable( ) } + fun declareClass( + sig: IdSignature, + symbolFactory: () -> IrClassSymbol, + classFactory: (IrClassSymbol) -> IrClass + ): IrClass { + return classSymbolTable.declare( + sig, + symbolFactory, + classFactory + ) + } + fun declareClassIfNotExists(descriptor: ClassDescriptor, classFactory: (IrClassSymbol) -> IrClass): IrClass { return classSymbolTable.declareIfNotExists(descriptor, { createClassSymbol(descriptor) }, classFactory) }