[FIR2IR] Extract logic of IR declarations generation into separate component. Part 3

Move caching of created IrFunctions back to Fir2IrDeclarationStorage
Fix all call-sites
This commit is contained in:
Dmitriy Novozhilov
2023-08-28 11:48:51 +03:00
committed by Space Team
parent 12c02897e1
commit 5a46563a2c
5 changed files with 45 additions and 24 deletions
@@ -429,17 +429,50 @@ class Fir2IrDeclarationStorage(
fun originalDeclarationForDelegated(irDeclaration: IrDeclaration): FirDeclaration? = delegatedReverseCache[irDeclaration] fun originalDeclarationForDelegated(irDeclaration: IrDeclaration): FirDeclaration? = delegatedReverseCache[irDeclaration]
fun getOrCreateIrFunction( fun getOrCreateIrFunction(
function: FirSimpleFunction, function: FirFunction,
irParent: IrDeclarationParent?, irParent: IrDeclarationParent?,
predefinedOrigin: IrDeclarationOrigin? = null,
isLocal: Boolean = false, isLocal: Boolean = false,
fakeOverrideOwnerLookupTag: ConeClassLikeLookupTag? = null
): IrSimpleFunction { ): IrSimpleFunction {
getCachedIrFunction(function)?.let { return it } 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, function,
irParent, irParent,
predefinedOrigin,
isLocal = isLocal, 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? = fun getCachedIrAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer): IrAnonymousInitializer? =
@@ -715,7 +748,7 @@ class Fir2IrDeclarationStorage(
val irParent = findIrParent(fir) val irParent = findIrParent(fir)
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
val declarationOrigin = computeDeclarationOrigin(firFunctionSymbol, parentOrigin) val declarationOrigin = computeDeclarationOrigin(firFunctionSymbol, parentOrigin)
callablesGenerator.createIrFunction(fir, irParent, predefinedOrigin = declarationOrigin).symbol createAndCacheIrFunction(fir, irParent, predefinedOrigin = declarationOrigin).symbol
} }
is FirSimpleFunction -> { is FirSimpleFunction -> {
val unmatchedOwner = fakeOverrideOwnerLookupTag != firFunctionSymbol.containingClassLookupTag() val unmatchedOwner = fakeOverrideOwnerLookupTag != firFunctionSymbol.containingClassLookupTag()
@@ -727,7 +760,7 @@ class Fir2IrDeclarationStorage(
fakeOverrideOwnerLookupTag, fakeOverrideOwnerLookupTag,
getCachedIrDeclaration = ::getCachedIrFunction, getCachedIrDeclaration = ::getCachedIrFunction,
createIrDeclaration = { parent, origin -> createIrDeclaration = { parent, origin ->
callablesGenerator.createIrFunction( createAndCacheIrFunction(
fir, parent, fir, parent,
predefinedOrigin = origin, predefinedOrigin = origin,
fakeOverrideOwnerLookupTag = fakeOverrideOwnerLookupTag, fakeOverrideOwnerLookupTag = fakeOverrideOwnerLookupTag,
@@ -396,7 +396,7 @@ class Fir2IrVisitor(
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?): IrElement = whileAnalysing(session, simpleFunction) { override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?): IrElement = whileAnalysing(session, simpleFunction) {
val irFunction = if (simpleFunction.visibility == Visibilities.Local) { val irFunction = if (simpleFunction.visibility == Visibilities.Local) {
callablesGenerator.createIrFunction( declarationStorage.getOrCreateIrFunction(
simpleFunction, irParent = conversionScope.parent(), predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION, isLocal = true simpleFunction, irParent = conversionScope.parent(), predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION, isLocal = true
) )
} else { } else {
@@ -418,7 +418,7 @@ class Fir2IrVisitor(
data: Any? data: Any?
): IrElement = whileAnalysing(session, anonymousFunction) { ): IrElement = whileAnalysing(session, anonymousFunction) {
return anonymousFunction.convertWithOffsets { startOffset, endOffset -> return anonymousFunction.convertWithOffsets { startOffset, endOffset ->
val irFunction = callablesGenerator.createIrFunction( val irFunction = declarationStorage.getOrCreateIrFunction(
anonymousFunction, anonymousFunction,
irParent = conversionScope.parent(), irParent = conversionScope.parent(),
predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION, predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION,
@@ -205,11 +205,10 @@ class DelegatedMemberGenerator(private val components: Fir2IrComponents) : Fir2I
firSubClass: FirClass, firSubClass: FirClass,
delegateOverride: FirSimpleFunction delegateOverride: FirSimpleFunction
): IrSimpleFunction { ): IrSimpleFunction {
val delegateFunction = val delegateFunction = declarationStorage.getOrCreateIrFunction(
callablesGenerator.createIrFunction( delegateOverride, subClass, predefinedOrigin = IrDeclarationOrigin.DELEGATED_MEMBER,
delegateOverride, subClass, predefinedOrigin = IrDeclarationOrigin.DELEGATED_MEMBER, fakeOverrideOwnerLookupTag = firSubClass.symbol.toLookupTag()
fakeOverrideOwnerLookupTag = firSubClass.symbol.toLookupTag() )
)
val baseSymbols = mutableListOf<FirNamedFunctionSymbol>() val baseSymbols = mutableListOf<FirNamedFunctionSymbol>()
// the overridden symbols should be collected only after all fake overrides for all superclases are created and bound to their // 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 // overridden symbols, otherwise in some cases they will be left in inconsistent state leading to the errors in IR
@@ -122,7 +122,7 @@ class FakeOverrideGenerator(
createFakeOverriddenIfNeeded( createFakeOverriddenIfNeeded(
firClass, irClass, isLocal, functionSymbol, firClass, irClass, isLocal, functionSymbol,
declarationStorage::getCachedIrFunction, declarationStorage::getCachedIrFunction,
callablesGenerator::createIrFunction, declarationStorage::getOrCreateIrFunction,
createFakeOverrideSymbol = { firFunction, callableSymbol -> createFakeOverrideSymbol = { firFunction, callableSymbol ->
val symbol = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(callableSymbol, firClass.symbol.classId) val symbol = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(callableSymbol, firClass.symbol.classId)
FirFakeOverrideGenerator.createSubstitutionOverrideFunction( FirFakeOverrideGenerator.createSubstitutionOverrideFunction(
@@ -345,7 +345,6 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
} }
if (visibility == Visibilities.Local) { if (visibility == Visibilities.Local) {
localStorage.putLocalFunction(function, created)
return created return created
} }
if (function.symbol.callableId.isKFunctionInvoke()) { if (function.symbol.callableId.isKFunctionInvoke()) {
@@ -353,16 +352,6 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
created.overriddenSymbols += declarationStorage.getIrFunctionSymbol(it) as IrSimpleFunctionSymbol 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 return created
} }