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 232ef801df8..cd033602b08 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 @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.constructors +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name class Fir2IrClassifierStorage( @@ -141,6 +142,13 @@ class Fir2IrClassifierStorage( } } + internal fun getCachedLocalClass(classId: ClassId): IrClass? { + require(classId.isLocal) { + "As the function name implies, it ought to be used to look up _local_ classes." + } + return localStorage.getLocalClass(classId) + } + private fun FirRegularClass.enumClassModality(): Modality { return when { declarations.any { it is FirCallableMemberDeclaration<*> && it.modality == Modality.ABSTRACT } -> { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index 64530a99caf..6673f718c97 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -201,16 +201,21 @@ class Fir2IrDeclarationStorage( } } - internal fun findIrParent(packageFqName: FqName, parentClassId: ClassId?, firBasedSymbol: FirBasedSymbol<*>): IrDeclarationParent? { - return if (parentClassId != null) { - // TODO: this will never work for local classes - val parentFirSymbol = firSymbolProvider.getClassLikeSymbolByFqName(parentClassId) - if (parentFirSymbol is FirClassSymbol) { - val parentIrSymbol = classifierStorage.getIrClassSymbol(parentFirSymbol) - parentIrSymbol.owner + private fun findIrClass(classId: ClassId): IrClass? = + if (classId.isLocal) { + classifierStorage.getCachedLocalClass(classId) + } else { + val firSymbol = firSymbolProvider.getClassLikeSymbolByFqName(classId) + if (firSymbol is FirClassSymbol) { + classifierStorage.getIrClassSymbol(firSymbol).owner } else { null } + } + + internal fun findIrParent(packageFqName: FqName, parentClassId: ClassId?, firBasedSymbol: FirBasedSymbol<*>): IrDeclarationParent? { + return if (parentClassId != null) { + findIrClass(parentClassId) } else { val containerFile = when (firBasedSymbol) { is FirCallableSymbol -> firProvider.getFirCallableContainerFile(firBasedSymbol) @@ -1039,13 +1044,12 @@ class Fir2IrDeclarationStorage( is FirEnumEntry -> { classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return it.symbol } val containingFile = firProvider.getFirCallableContainerFile(firVariableSymbol) - val parentClassSymbol = firVariableSymbol.callableId.classId?.let { firSymbolProvider.getClassLikeSymbolByFqName(it) } - val irParentClass = (parentClassSymbol?.fir as? FirClass<*>)?.let { classifierStorage.getCachedIrClass(it) } + val irParentClass = firVariableSymbol.callableId.classId?.let { findIrClass(it) } classifierStorage.createIrEnumEntry( firDeclaration, irParent = irParentClass, origin = if (containingFile != null) IrDeclarationOrigin.DEFINED else - (parentClassSymbol?.fir as? FirClass<*>)?.irOrigin(firProvider) ?: IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB + irParentClass?.origin ?: IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB ).symbol } is FirValueParameter -> { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrLocalStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrLocalStorage.kt index b8f52059222..ea710414f04 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrLocalStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrLocalStorage.kt @@ -5,14 +5,12 @@ package org.jetbrains.kotlin.fir.backend -import org.jetbrains.kotlin.fir.declarations.FirClass -import org.jetbrains.kotlin.fir.declarations.FirFunction -import org.jetbrains.kotlin.fir.declarations.FirValueParameter -import org.jetbrains.kotlin.fir.declarations.FirVariable +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrValueParameter import org.jetbrains.kotlin.ir.declarations.IrVariable +import org.jetbrains.kotlin.name.ClassId class Fir2IrLocalStorage { @@ -49,6 +47,10 @@ class Fir2IrLocalStorage { return localClassCache[localClass] } + fun getLocalClass(classId: ClassId): IrClass? { + return localClassCache.entries.find { (firClass, _) -> firClass.classId == classId }?.value + } + fun getLocalFunction(localFunction: FirFunction<*>): IrSimpleFunction? { for (cache in cacheStack.asReversed()) { val local = cache.getLocalFunction(localFunction) diff --git a/compiler/testData/codegen/box/objects/companionObjectAccess/multipleCompanionsWithAccessors/anonymousObjectInPropertyInitializer.kt b/compiler/testData/codegen/box/objects/companionObjectAccess/multipleCompanionsWithAccessors/anonymousObjectInPropertyInitializer.kt index d5eb51c8f09..21eaacccfd8 100644 --- a/compiler/testData/codegen/box/objects/companionObjectAccess/multipleCompanionsWithAccessors/anonymousObjectInPropertyInitializer.kt +++ b/compiler/testData/codegen/box/objects/companionObjectAccess/multipleCompanionsWithAccessors/anonymousObjectInPropertyInitializer.kt @@ -1,5 +1,4 @@ // !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField -// IGNORE_BACKEND_FIR: JVM_IR // FILE: anonymousObjectInPropertyInitializer.kt import c.C