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 10b30037998..c7e816bfd18 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 @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.descriptors.FirPackageFragmentDescriptor import org.jetbrains.kotlin.fir.expressions.FirVariable import org.jetbrains.kotlin.fir.render +import org.jetbrains.kotlin.fir.resolve.FirProvider import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.getOrPut import org.jetbrains.kotlin.fir.service @@ -44,8 +45,12 @@ class Fir2IrDeclarationStorage( ) { private val firSymbolProvider = session.service() + private val firProvider = session.service() + private val fragmentCache = mutableMapOf() + private val fileCache = mutableMapOf() + private val classCache = mutableMapOf() private val typeParameterCache = mutableMapOf() @@ -62,6 +67,10 @@ class Fir2IrDeclarationStorage( private val unitType = session.builtinTypes.unitType.toIrType(session, this) + fun registerFile(firFile: FirFile, irFile: IrFile) { + fileCache[firFile] = irFile + } + fun enterScope(descriptor: DeclarationDescriptor) { irSymbolTable.enterScope(descriptor) if (descriptor is WrappedSimpleFunctionDescriptor || @@ -219,8 +228,13 @@ class Fir2IrDeclarationStorage( null } } else { - val packageFqName = callableId.packageName - getIrExternalPackageFragment(packageFqName) + val containerFile = firProvider.getFirCallableContainerFile(firBasedSymbol) + if (containerFile != null) { + fileCache[containerFile] + } else { + val packageFqName = callableId.packageName + getIrExternalPackageFragment(packageFqName) + } } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 1eadd8fd5cc..44dcfe9f5c5 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor -import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.* @@ -142,6 +141,7 @@ class Fir2IrVisitor( sourceManager.getOrCreateFileEntry(file.psi as KtFile), moduleDescriptor.findPackageFragmentForFile(file) ).withParent { + declarationStorage.registerFile(file, this) file.declarations.forEach { val irDeclaration = it.toIrDeclaration() ?: return@forEach declarations += irDeclaration