[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 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,
@@ -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,
@@ -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<FirNamedFunctionSymbol>()
// 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
@@ -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(
@@ -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
}