[FIR2IR] Split getOrCreateIrAnonymousInitializer method into two parts
Fir2IrDeclarationStorage should not sometimes create IR declarations during lookup requests
This commit is contained in:
committed by
Space Team
parent
736201da1d
commit
7263edf322
@@ -585,7 +585,7 @@ class Fir2IrConverter(
|
|||||||
classifierStorage.getOrCreateIrEnumEntry(declaration, parent as IrClass)
|
classifierStorage.getOrCreateIrEnumEntry(declaration, parent as IrClass)
|
||||||
}
|
}
|
||||||
is FirAnonymousInitializer -> {
|
is FirAnonymousInitializer -> {
|
||||||
declarationStorage.getOrCreateIrAnonymousInitializer(declaration, parent as IrClass)
|
declarationStorage.createIrAnonymousInitializer(declaration, parent as IrClass)
|
||||||
}
|
}
|
||||||
is FirTypeAlias -> {
|
is FirTypeAlias -> {
|
||||||
classifierStorage.getCachedTypeAlias(declaration)?.let { irTypeAlias ->
|
classifierStorage.getCachedTypeAlias(declaration)?.let { irTypeAlias ->
|
||||||
|
|||||||
+10
-3
@@ -933,13 +933,20 @@ class Fir2IrDeclarationStorage(
|
|||||||
|
|
||||||
// ------------------------------------ anonymous initializers ------------------------------------
|
// ------------------------------------ anonymous initializers ------------------------------------
|
||||||
|
|
||||||
fun getOrCreateIrAnonymousInitializer(
|
fun createIrAnonymousInitializer(
|
||||||
anonymousInitializer: FirAnonymousInitializer,
|
anonymousInitializer: FirAnonymousInitializer,
|
||||||
containingIrClass: IrClass,
|
containingIrClass: IrClass,
|
||||||
): IrAnonymousInitializer {
|
): IrAnonymousInitializer {
|
||||||
return initializerCache.computeIfAbsent(anonymousInitializer) {
|
val irInitializer = callablesGenerator.createIrAnonymousInitializer(anonymousInitializer, containingIrClass)
|
||||||
callablesGenerator.createIrAnonymousInitializer(anonymousInitializer, containingIrClass)
|
val alreadyContained = initializerCache.put(anonymousInitializer, irInitializer)
|
||||||
|
require(alreadyContained == null) {
|
||||||
|
"IR for anonymous initializer already exits: ${anonymousInitializer.render()}"
|
||||||
}
|
}
|
||||||
|
return irInitializer
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getIrAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer): IrAnonymousInitializer {
|
||||||
|
return initializerCache.getValue(anonymousInitializer)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------ callables ------------------------------------
|
// ------------------------------------ callables ------------------------------------
|
||||||
|
|||||||
@@ -392,7 +392,7 @@ class Fir2IrVisitor(
|
|||||||
anonymousInitializer: FirAnonymousInitializer,
|
anonymousInitializer: FirAnonymousInitializer,
|
||||||
data: Any?
|
data: Any?
|
||||||
): IrElement = whileAnalysing(session, anonymousInitializer) {
|
): IrElement = whileAnalysing(session, anonymousInitializer) {
|
||||||
val irAnonymousInitializer = declarationStorage.getOrCreateIrAnonymousInitializer(anonymousInitializer, conversionScope.lastClass()!!)
|
val irAnonymousInitializer = declarationStorage.getIrAnonymousInitializer(anonymousInitializer)
|
||||||
declarationStorage.enterScope(irAnonymousInitializer.symbol)
|
declarationStorage.enterScope(irAnonymousInitializer.symbol)
|
||||||
irAnonymousInitializer.body = convertToIrBlockBody(anonymousInitializer.body!!)
|
irAnonymousInitializer.body = convertToIrBlockBody(anonymousInitializer.body!!)
|
||||||
declarationStorage.leaveScope(irAnonymousInitializer.symbol)
|
declarationStorage.leaveScope(irAnonymousInitializer.symbol)
|
||||||
|
|||||||
Reference in New Issue
Block a user