[FIR] Make default values for value parameters lazy in RawFirBuilder

Sixth step for ^KT-52615

Merge-request: KT-MR-7926
Merged-by: Egor Kulikov <Egor.Kulikov@jetbrains.com>
This commit is contained in:
Egor Kulikov
2022-12-08 13:32:37 +00:00
committed by Space Team
parent dbb02a9bfb
commit dbfe33c00d
10 changed files with 45 additions and 15 deletions
@@ -75,8 +75,10 @@ private class LLFirDesignatedBodyResolveTransformerForReturnTypeCalculatorImpl(
simpleFunction: FirSimpleFunction, simpleFunction: FirSimpleFunction,
data: ResolutionMode data: ResolutionMode
): FirSimpleFunction { ): FirSimpleFunction {
simpleFunction.processCallable { if (FirLazyBodiesCalculator.needCalculatingLazyBodyForFunction(simpleFunction)) {
FirLazyBodiesCalculator.calculateLazyBodiesForFunction(it) simpleFunction.processCallable {
FirLazyBodiesCalculator.calculateLazyBodiesForFunction(it)
}
} }
return super.transformSimpleFunction(simpleFunction, data) return super.transformSimpleFunction(simpleFunction, data)
@@ -37,9 +37,18 @@ internal object FirLazyBodiesCalculator {
firFile.transform<FirElement, PersistentList<FirDeclaration>>(FirLazyBodiesCalculatorTransformer, persistentListOf()) firFile.transform<FirElement, PersistentList<FirDeclaration>>(FirLazyBodiesCalculatorTransformer, persistentListOf())
} }
private fun replaceValueParameterDefaultValues(valueParameters: List<FirValueParameter>, newValueParameters: List<FirValueParameter>) {
require(valueParameters.size == newValueParameters.size)
for ((valueParameter, newValueParameter) in valueParameters.zip(newValueParameters)) {
if (newValueParameter.defaultValue != null) {
valueParameter.replaceDefaultValue(newValueParameter.defaultValue)
}
}
}
fun calculateLazyBodiesForFunction(designation: FirDeclarationDesignation) { fun calculateLazyBodiesForFunction(designation: FirDeclarationDesignation) {
val simpleFunction = designation.declaration as FirSimpleFunction val simpleFunction = designation.declaration as FirSimpleFunction
if (simpleFunction.body !is FirLazyBlock) return require(needCalculatingLazyBodyForFunction(simpleFunction))
val newFunction = RawFirNonLocalDeclarationBuilder.buildWithFunctionSymbolRebind( val newFunction = RawFirNonLocalDeclarationBuilder.buildWithFunctionSymbolRebind(
session = simpleFunction.moduleData.session, session = simpleFunction.moduleData.session,
scopeProvider = simpleFunction.moduleData.session.kotlinScopeProvider, scopeProvider = simpleFunction.moduleData.session.kotlinScopeProvider,
@@ -49,13 +58,14 @@ internal object FirLazyBodiesCalculator {
simpleFunction.apply { simpleFunction.apply {
replaceBody(newFunction.body) replaceBody(newFunction.body)
replaceContractDescription(newFunction.contractDescription) replaceContractDescription(newFunction.contractDescription)
replaceValueParameterDefaultValues(valueParameters, newFunction.valueParameters)
} }
} }
fun calculateLazyBodyForConstructor(designation: FirDeclarationDesignation) { fun calculateLazyBodyForConstructor(designation: FirDeclarationDesignation) {
val constructor = designation.declaration as FirConstructor val constructor = designation.declaration as FirConstructor
require(constructor.psi is KtConstructor<*>) require(constructor.psi is KtConstructor<*>)
require(constructor.body is FirLazyBlock || constructor.delegatedConstructor is FirLazyDelegatedConstructorCall) require(needCalculatingLazyBodyForConstructor(constructor))
val newConstructor = RawFirNonLocalDeclarationBuilder.buildWithFunctionSymbolRebind( val newConstructor = RawFirNonLocalDeclarationBuilder.buildWithFunctionSymbolRebind(
session = constructor.moduleData.session, session = constructor.moduleData.session,
@@ -67,6 +77,7 @@ internal object FirLazyBodiesCalculator {
constructor.apply { constructor.apply {
replaceBody(newConstructor.body) replaceBody(newConstructor.body)
replaceDelegatedConstructor(newConstructor.delegatedConstructor) replaceDelegatedConstructor(newConstructor.delegatedConstructor)
replaceValueParameterDefaultValues(valueParameters, newConstructor.valueParameters)
} }
} }
@@ -147,9 +158,15 @@ internal object FirLazyBodiesCalculator {
} }
} }
fun needCalculatingLazyBodyForConstructor(firConstructor: FirConstructor): Boolean =
needCalculatingLazyBodyForFunction(firConstructor) || firConstructor.delegatedConstructor is FirLazyDelegatedConstructorCall
fun needCalculatingLazyBodyForFunction(firFunction: FirFunction): Boolean =
firFunction.body is FirLazyBlock || firFunction.valueParameters.any { it.defaultValue is FirLazyExpression }
fun needCalculatingLazyBodyForProperty(firProperty: FirProperty): Boolean = fun needCalculatingLazyBodyForProperty(firProperty: FirProperty): Boolean =
firProperty.getter?.body is FirLazyBlock firProperty.getter?.let { needCalculatingLazyBodyForFunction(it) } == true
|| firProperty.setter?.body is FirLazyBlock || firProperty.setter?.let { needCalculatingLazyBodyForFunction(it) } == true
|| firProperty.initializer is FirLazyExpression || firProperty.initializer is FirLazyExpression
|| (firProperty.delegate as? FirWrappedDelegateExpression)?.expression is FirLazyExpression || (firProperty.delegate as? FirWrappedDelegateExpression)?.expression is FirLazyExpression
|| firProperty.getExplicitBackingField()?.initializer is FirLazyExpression || firProperty.getExplicitBackingField()?.initializer is FirLazyExpression
@@ -179,7 +196,7 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentLis
simpleFunction: FirSimpleFunction, simpleFunction: FirSimpleFunction,
data: PersistentList<FirDeclaration> data: PersistentList<FirDeclaration>
): FirSimpleFunction { ): FirSimpleFunction {
if (simpleFunction.body is FirLazyBlock) { if (FirLazyBodiesCalculator.needCalculatingLazyBodyForFunction(simpleFunction)) {
val designation = FirDeclarationDesignation(data, simpleFunction) val designation = FirDeclarationDesignation(data, simpleFunction)
FirLazyBodiesCalculator.calculateLazyBodiesForFunction(designation) FirLazyBodiesCalculator.calculateLazyBodiesForFunction(designation)
} }
@@ -190,7 +207,7 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer<PersistentLis
constructor: FirConstructor, constructor: FirConstructor,
data: PersistentList<FirDeclaration> data: PersistentList<FirDeclaration>
): FirConstructor { ): FirConstructor {
if (constructor.body is FirLazyBlock || constructor.delegatedConstructor is FirLazyDelegatedConstructorCall) { if (FirLazyBodiesCalculator.needCalculatingLazyBodyForConstructor(constructor)) {
val designation = FirDeclarationDesignation(data, constructor) val designation = FirDeclarationDesignation(data, constructor)
FirLazyBodiesCalculator.calculateLazyBodyForConstructor(designation) FirLazyBodiesCalculator.calculateLazyBodyForConstructor(designation)
} }
@@ -179,6 +179,10 @@ class FirJavaValueParameter @FirImplementationDetail constructor(
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {
} }
override fun replaceDefaultValue(newDefaultValue: FirExpression?) {
error("Java value parameter cannot has default value")
}
override fun replaceGetter(newGetter: FirPropertyAccessor?) { override fun replaceGetter(newGetter: FirPropertyAccessor?) {
} }
@@ -586,10 +586,7 @@ open class RawFirBuilder(
this.name = name this.name = name
symbol = FirValueParameterSymbol(name) symbol = FirValueParameterSymbol(name)
defaultValue = if (hasDefaultValue()) { defaultValue = if (hasDefaultValue()) {
disabledLazyMode { buildOrLazyExpression(null, { { this@toFirValueParameter.defaultValue }.toFirExpression("Should have default value") })
// TODO build lazy initializers here
{ this@toFirValueParameter.defaultValue }.toFirExpression("Should have default value")
}
} else null } else null
isCrossinline = hasModifier(CROSSINLINE_KEYWORD) isCrossinline = hasModifier(CROSSINLINE_KEYWORD)
isNoinline = hasModifier(NOINLINE_KEYWORD) isNoinline = hasModifier(NOINLINE_KEYWORD)
@@ -57,7 +57,7 @@ FILE: enums.kt
} }
public? final? enum class PseudoInsn : R|kotlin/Enum<PseudoInsn>| { public? final? enum class PseudoInsn : R|kotlin/Enum<PseudoInsn>| {
private constructor(signature: String = String(()V)): R|PseudoInsn| { private constructor(signature: String = LAZY_EXPRESSION): R|PseudoInsn| {
LAZY_super<R|kotlin/Enum<PseudoInsn>|> LAZY_super<R|kotlin/Enum<PseudoInsn>|>
} }
@@ -1,3 +1,3 @@
FILE: namedArgument.kt FILE: namedArgument.kt
public? final? fun foo(first: String = String(), second: Boolean = Boolean(true), third: Double = Double(3.1415)): R|kotlin/Unit| { LAZY_BLOCK } public? final? fun foo(first: String = LAZY_EXPRESSION, second: Boolean = LAZY_EXPRESSION, third: Double = LAZY_EXPRESSION): R|kotlin/Unit| { LAZY_BLOCK }
public? final? fun test(): R|kotlin/Unit| { LAZY_BLOCK } public? final? fun test(): R|kotlin/Unit| { LAZY_BLOCK }
@@ -79,6 +79,8 @@ abstract class FirValueParameter : FirVariable(), FirControlFlowGraphOwner {
abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?)
abstract fun replaceDefaultValue(newDefaultValue: FirExpression?)
abstract override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirValueParameter abstract override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirValueParameter
abstract override fun <D> transformStatus(transformer: FirTransformer<D>, data: D): FirValueParameter abstract override fun <D> transformStatus(transformer: FirTransformer<D>, data: D): FirValueParameter
@@ -195,4 +195,8 @@ internal class FirDefaultSetterValueParameter(
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {
controlFlowGraphReference = newControlFlowGraphReference controlFlowGraphReference = newControlFlowGraphReference
} }
override fun replaceDefaultValue(newDefaultValue: FirExpression?) {
defaultValue = newDefaultValue
}
} }
@@ -172,4 +172,8 @@ internal class FirValueParameterImpl(
override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) { override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?) {
controlFlowGraphReference = newControlFlowGraphReference controlFlowGraphReference = newControlFlowGraphReference
} }
override fun replaceDefaultValue(newDefaultValue: FirExpression?) {
defaultValue = newDefaultValue
}
} }
@@ -393,7 +393,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
valueParameter.configure { valueParameter.configure {
+symbol("FirValueParameterSymbol") +symbol("FirValueParameterSymbol")
+field("defaultValue", expression, nullable = true) +field("defaultValue", expression, nullable = true, withReplace = true)
+field("containingFunctionSymbol", functionSymbolType, "*").apply { +field("containingFunctionSymbol", functionSymbolType, "*").apply {
withBindThis = false withBindThis = false
} }