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 d4349063cd2..ab7ace69753 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 @@ -429,17 +429,50 @@ class Fir2IrDeclarationStorage( fun originalDeclarationForDelegated(irDeclaration: IrDeclaration): FirDeclaration? = delegatedReverseCache[irDeclaration] fun getOrCreateIrFunction( - function: FirSimpleFunction, + function: FirFunction, irParent: IrDeclarationParent?, + predefinedOrigin: IrDeclarationOrigin? = null, isLocal: Boolean = false, + fakeOverrideOwnerLookupTag: ConeClassLikeLookupTag? = null ): IrSimpleFunction { getCachedIrFunction(function)?.let { return it } - return callablesGenerator.createIrFunction( + return createAndCacheIrFunction(function, irParent, predefinedOrigin, isLocal, fakeOverrideOwnerLookupTag) + } + + private fun createAndCacheIrFunction( + function: FirFunction, + irParent: IrDeclarationParent?, + predefinedOrigin: IrDeclarationOrigin? = null, + isLocal: Boolean = false, + fakeOverrideOwnerLookupTag: ConeClassLikeLookupTag? = null + ): IrSimpleFunction { + val irFunction = callablesGenerator.createIrFunction( function, irParent, + predefinedOrigin, isLocal = isLocal, - fakeOverrideOwnerLookupTag = function.containingClassLookupTag() + fakeOverrideOwnerLookupTag = fakeOverrideOwnerLookupTag ) + when { + irFunction.visibility == DescriptorVisibilities.LOCAL -> { + localStorage.putLocalFunction(function, irFunction) + } + + function.isFakeOverride(fakeOverrideOwnerLookupTag) -> { + val originalFunction = function.unwrapFakeOverrides() + val key = FakeOverrideIdentifier( + originalFunction.symbol, + fakeOverrideOwnerLookupTag ?: function.containingClassLookupTag()!! + ) + irFakeOverridesForFirFakeOverrideMap[key] = irFunction + } + + else -> { + functionCache[function] = irFunction + } + } + + return irFunction } fun getCachedIrAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer): IrAnonymousInitializer? = @@ -715,7 +748,7 @@ class Fir2IrDeclarationStorage( val irParent = findIrParent(fir) val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED val declarationOrigin = computeDeclarationOrigin(firFunctionSymbol, parentOrigin) - callablesGenerator.createIrFunction(fir, irParent, predefinedOrigin = declarationOrigin).symbol + createAndCacheIrFunction(fir, irParent, predefinedOrigin = declarationOrigin).symbol } is FirSimpleFunction -> { val unmatchedOwner = fakeOverrideOwnerLookupTag != firFunctionSymbol.containingClassLookupTag() @@ -727,7 +760,7 @@ class Fir2IrDeclarationStorage( fakeOverrideOwnerLookupTag, getCachedIrDeclaration = ::getCachedIrFunction, createIrDeclaration = { parent, origin -> - callablesGenerator.createIrFunction( + createAndCacheIrFunction( fir, parent, predefinedOrigin = origin, fakeOverrideOwnerLookupTag = fakeOverrideOwnerLookupTag, 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 28ab41b5e64..fbcd4c1da02 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 @@ -396,7 +396,7 @@ class Fir2IrVisitor( override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?): IrElement = whileAnalysing(session, simpleFunction) { val irFunction = if (simpleFunction.visibility == Visibilities.Local) { - callablesGenerator.createIrFunction( + declarationStorage.getOrCreateIrFunction( simpleFunction, irParent = conversionScope.parent(), predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION, isLocal = true ) } else { @@ -418,7 +418,7 @@ class Fir2IrVisitor( data: Any? ): IrElement = whileAnalysing(session, anonymousFunction) { return anonymousFunction.convertWithOffsets { startOffset, endOffset -> - val irFunction = callablesGenerator.createIrFunction( + val irFunction = declarationStorage.getOrCreateIrFunction( anonymousFunction, irParent = conversionScope.parent(), predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION, diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt index ee66a1faf31..deb10926b1a 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt @@ -205,11 +205,10 @@ class DelegatedMemberGenerator(private val components: Fir2IrComponents) : Fir2I firSubClass: FirClass, delegateOverride: FirSimpleFunction ): IrSimpleFunction { - val delegateFunction = - callablesGenerator.createIrFunction( - delegateOverride, subClass, predefinedOrigin = IrDeclarationOrigin.DELEGATED_MEMBER, - fakeOverrideOwnerLookupTag = firSubClass.symbol.toLookupTag() - ) + val delegateFunction = declarationStorage.getOrCreateIrFunction( + delegateOverride, subClass, predefinedOrigin = IrDeclarationOrigin.DELEGATED_MEMBER, + fakeOverrideOwnerLookupTag = firSubClass.symbol.toLookupTag() + ) val baseSymbols = mutableListOf() // the overridden symbols should be collected only after all fake overrides for all superclases are created and bound to their // overridden symbols, otherwise in some cases they will be left in inconsistent state leading to the errors in IR diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index 4efbf7b4ab6..05ed532e565 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -122,7 +122,7 @@ class FakeOverrideGenerator( createFakeOverriddenIfNeeded( firClass, irClass, isLocal, functionSymbol, declarationStorage::getCachedIrFunction, - callablesGenerator::createIrFunction, + declarationStorage::getOrCreateIrFunction, createFakeOverrideSymbol = { firFunction, callableSymbol -> val symbol = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(callableSymbol, firClass.symbol.classId) FirFakeOverrideGenerator.createSubstitutionOverrideFunction( diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt index 5b9fb3a415e..1985959eb5f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt @@ -345,7 +345,6 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi } if (visibility == Visibilities.Local) { - localStorage.putLocalFunction(function, created) return created } if (function.symbol.callableId.isKFunctionInvoke()) { @@ -353,16 +352,6 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi created.overriddenSymbols += declarationStorage.getIrFunctionSymbol(it) as IrSimpleFunctionSymbol } } - if (function.isFakeOverride(fakeOverrideOwnerLookupTag)) { - val originalFunction = function.unwrapFakeOverrides() - val key = Fir2IrDeclarationStorage.FakeOverrideIdentifier( - originalFunction.symbol, - fakeOverrideOwnerLookupTag ?: function.containingClassLookupTag()!! - ) - irFakeOverridesForFirFakeOverrideMap[key] = created - } else { - functionCache[function] = created - } return created }