[FIR2IR] Extract logic of IR declarations generation into separate component. Part 8

Move caching of created IrParameter, IrVariable and IrLocalDelegatedProperty
  back to Fir2IrDeclarationStorage
This commit is contained in:
Dmitriy Novozhilov
2023-08-29 10:40:55 +03:00
committed by Space Team
parent 8d9fa0fdde
commit 6e2123c2b6
3 changed files with 58 additions and 19 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin.GeneratedByPlugin
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
@@ -1113,6 +1114,53 @@ class Fir2IrDeclarationStorage(
}
}
fun createAndCacheParameter(
valueParameter: FirValueParameter,
index: Int = UNDEFINED_PARAMETER_INDEX,
useStubForDefaultValueStub: Boolean = true,
typeOrigin: ConversionTypeOrigin = ConversionTypeOrigin.DEFAULT,
skipDefaultParameter: Boolean = false,
// Use this parameter if you want to insert the actual default value instead of the stub (overrides useStubForDefaultValueStub parameter).
// This parameter is intended to be used for default values of annotation parameters where they are needed and
// may produce incorrect results for values that may be encountered outside annotations.
// Does not do anything if valueParameter.defaultValue is already FirExpressionStub.
forcedDefaultValueConversion: Boolean = false,
): IrValueParameter {
return callablesGenerator.createIrParameter(
valueParameter,
index,
useStubForDefaultValueStub,
typeOrigin,
skipDefaultParameter,
forcedDefaultValueConversion
).also {
localStorage.putParameter(valueParameter, it)
}
}
fun createAndCacheIrVariable(
variable: FirVariable,
irParent: IrDeclarationParent,
givenOrigin: IrDeclarationOrigin? = null
): IrVariable {
return callablesGenerator.createIrVariable(variable, irParent, givenOrigin).also {
localStorage.putVariable(variable, it)
}
}
fun createAndCacheIrLocalDelegatedProperty(
property: FirProperty,
irParent: IrDeclarationParent
): IrLocalDelegatedProperty {
val irProperty = callablesGenerator.createIrLocalDelegatedProperty(property, irParent)
val symbol = irProperty.symbol
delegateVariableForPropertyCache[symbol] = irProperty.delegate.symbol
getterForPropertyCache[symbol] = irProperty.getter.symbol
irProperty.setter?.let { setterForPropertyCache[symbol] = it.symbol }
localStorage.putDelegatedProperty(property, irProperty)
return irProperty
}
companion object {
internal val ENUM_SYNTHETIC_NAMES = mapOf(
@@ -220,7 +220,7 @@ class Fir2IrVisitor(
declarationStorage.enterScope(irScript.symbol)
irScript.explicitCallParameters = script.parameters.map { parameter ->
callablesGenerator.createIrVariable(
declarationStorage.createAndCacheIrVariable(
parameter,
irScript,
givenOrigin = IrDeclarationOrigin.SCRIPT_CALL_PARAMETER
@@ -278,7 +278,7 @@ class Fir2IrVisitor(
irBuiltIns.unitType, IrStatementOrigin.DESTRUCTURING_DECLARATION
).also {
it.statements.add(
callablesGenerator.createIrVariable(statement, conversionScope.parentFromStack()).also {
declarationStorage.createAndCacheIrVariable(statement, conversionScope.parentFromStack()).also {
it.initializer = statement.initializer?.toIrStatement() as? IrExpression
}
)
@@ -442,7 +442,7 @@ class Fir2IrVisitor(
assert(variable.isLocal)
val delegate = variable.delegate
if (delegate != null) {
val irProperty = callablesGenerator.createIrLocalDelegatedProperty(variable, conversionScope.parentFromStack())
val irProperty = declarationStorage.createAndCacheIrLocalDelegatedProperty(variable, conversionScope.parentFromStack())
irProperty.delegate.initializer = convertToIrExpression(delegate, isDelegate = true)
conversionScope.withFunction(irProperty.getter) {
memberGenerator.convertFunctionContent(irProperty.getter, variable.getter, null)
@@ -458,7 +458,7 @@ class Fir2IrVisitor(
val isNextVariable = initializer is FirFunctionCall &&
initializer.calleeReference.toResolvedNamedFunctionSymbol()?.callableId?.isIteratorNext() == true &&
variable.source?.isChildOfForLoop == true
val irVariable = callablesGenerator.createIrVariable(
val irVariable = declarationStorage.createAndCacheIrVariable(
variable, conversionScope.parentFromStack(),
if (isNextVariable) {
if (variable.name.isSpecial && variable.name == SpecialNames.DESTRUCT) {
@@ -1423,7 +1423,7 @@ class Fir2IrVisitor(
override fun visitCatch(catch: FirCatch, data: Any?): IrElement {
return catch.convertWithOffsets { startOffset, endOffset ->
val catchParameter = callablesGenerator.createIrVariable(
val catchParameter = declarationStorage.createAndCacheIrVariable(
catch.parameter, conversionScope.parentFromStack(), IrDeclarationOrigin.CATCH_PARAMETER
)
IrCatchImpl(startOffset, endOffset, catchParameter, catch.block.convertToIrBlock(forceUnitType = false))
@@ -197,7 +197,7 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
addContextReceiverParametersTo(contextReceivers, parent, this)
function.valueParameters.mapIndexedTo(this) { index, valueParameter ->
createIrParameter(
declarationStorage.createAndCacheParameter(
valueParameter, index + contextReceiverParametersCount,
useStubForDefaultValueStub = function !is FirConstructor || containingClass?.name != Name.identifier("Enum"),
typeOrigin,
@@ -830,7 +830,6 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
annotationGenerator.generate(this, valueParameter)
}
}
localStorage.putParameter(valueParameter, irParameter)
return irParameter
}
@@ -879,7 +878,7 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
fun createIrVariable(
variable: FirVariable,
irParent: IrDeclarationParent,
givenOrigin: IrDeclarationOrigin? = null
givenOrigin: IrDeclarationOrigin?
): IrVariable = convertCatching(variable) {
val type = variable.irTypeForPotentiallyComponentCall()
// Some temporary variables are produced in RawFirBuilder, but we consistently use special names for them.
@@ -897,7 +896,6 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
)
}
irVariable.parent = irParent
localStorage.putVariable(variable, irVariable)
return irVariable
}
@@ -926,28 +924,21 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
startOffset, endOffset, IrDeclarationOrigin.PROPERTY_DELEGATE,
NameUtils.propertyDelegateName(property.name), property.delegate!!.resolvedType.toIrType(),
isVar = false, isConst = false, isLateinit = false
).also {
delegateVariableForPropertyCache[symbol] = it.symbol
}
)
delegate.parent = irParent
getter = createIrPropertyAccessor(
property.getter, property, this, type, irParent, false,
IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR, startOffset, endOffset, dontUseSignature = true
).also {
getterForPropertyCache[symbol] = it.symbol
}
)
if (property.isVar) {
setter = createIrPropertyAccessor(
property.setter, property, this, type, irParent, true,
IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR, startOffset, endOffset, dontUseSignature = true
).also {
setterForPropertyCache[symbol] = it.symbol
}
)
}
annotationGenerator.generate(this, property)
}
}
localStorage.putDelegatedProperty(property, irProperty)
return irProperty
}