[FIR2IR] Split getOrCreateIrAnonymousInitializer method into two parts

Fir2IrDeclarationStorage should not sometimes create IR declarations
  during lookup requests
This commit is contained in:
Dmitriy Novozhilov
2023-11-14 15:56:42 +02:00
committed by Space Team
parent 736201da1d
commit 7263edf322
3 changed files with 12 additions and 5 deletions
@@ -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 ->
@@ -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)