[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:
committed by
Space Team
parent
12c02897e1
commit
5a46563a2c
+38
-5
@@ -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,
|
||||
|
||||
+4
-5
@@ -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
|
||||
|
||||
+1
-1
@@ -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(
|
||||
|
||||
-11
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user