[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 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,
|
||||||
|
|||||||
+4
-5
@@ -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
|
||||||
|
|||||||
+1
-1
@@ -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(
|
||||||
|
|||||||
-11
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user