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 25a3a47d044..1ff087177db 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 @@ -19,6 +19,8 @@ import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhaseWithCallableMembers import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.toLookupTag import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET @@ -30,6 +32,7 @@ import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterSymbolImpl import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.StandardClassIds @@ -68,9 +71,19 @@ class Fir2IrClassifierStorage( @OptIn(IrSymbolInternals::class) fun preCacheBuiltinClasses() { - for ((classId, irBuiltinSymbol) in typeConverter.classIdToSymbolMap) { + fun getResolvedClass(classId: ClassId): FirRegularClass? { // toSymbol() can return null when using an old stdlib that's missing some types - val firClass = classId.toSymbol(session)?.fir as FirRegularClass? ?: continue + val firClass = classId.toSymbol(session)?.fir as FirRegularClass? ?: return null + + // Built-in classes may come from sources in the Kotlin project, and so have unresolved types in signatures. + // Still, we need return types for all members to make a list of 'IrDeclarations'. Also see 'Fir2IrLazyClass.declarations'. + firClass.lazyResolveToPhaseWithCallableMembers(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + + return firClass + } + + for ((classId, irBuiltinSymbol) in typeConverter.classIdToSymbolMap) { + val firClass = getResolvedClass(classId) ?: continue val irClass = irBuiltinSymbol.owner classCache[firClass] = irClass classifiersGenerator.processClassHeader(firClass, irClass) @@ -78,7 +91,7 @@ class Fir2IrClassifierStorage( } for ((primitiveClassId, primitiveArrayId) in StandardClassIds.primitiveArrayTypeByElementType) { // toSymbol() can return null when using an old stdlib that's missing some types - val firClass = primitiveArrayId.toLookupTag().toSymbol(session)?.fir as FirRegularClass? ?: continue + val firClass = getResolvedClass(primitiveArrayId) ?: continue val irType = typeConverter.classIdToTypeMap[primitiveClassId] val irClass = irBuiltIns.primitiveArrayForType[irType]!!.owner classCache[firClass] = irClass diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt index 7393a25c94d..bdfef1b9dc1 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt @@ -12,13 +12,16 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.containingClassLookupTag +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.scopes.getFunctions import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.ir.BuiltInOperatorNames import org.jetbrains.kotlin.ir.IrBuiltIns @@ -655,15 +658,21 @@ class IrBuiltInsOverFir( } private fun findFunction(functionSymbol: FirNamedFunctionSymbol): IrSimpleFunctionSymbol { + functionSymbol.lazyResolveToPhase(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + val irParent = findIrParent(functionSymbol) return components.declarationStorage.getOrCreateIrFunction(functionSymbol.fir, irParent).symbol } private fun findProperties(packageName: FqName, name: Name): List { - return symbolProvider.getTopLevelPropertySymbols(packageName, name).map { firOpSymbol -> - val irParent = findIrParent(firOpSymbol) - components.declarationStorage.getOrCreateIrProperty(firOpSymbol.fir, irParent).symbol - } + return symbolProvider.getTopLevelPropertySymbols(packageName, name).map { findProperty(it) } + } + + private fun findProperty(propertySymbol: FirPropertySymbol): IrPropertySymbol { + propertySymbol.lazyResolveToPhase(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + + val irParent = findIrParent(propertySymbol) + return components.declarationStorage.getOrCreateIrProperty(propertySymbol.fir, irParent).symbol } private fun findIrParent(firSymbol: FirCallableSymbol<*>): IrDeclarationParent? {