[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:
+4
-2
@@ -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)
|
||||||
|
|||||||
+23
-6
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -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)
|
||||||
|
|||||||
+1
-1
@@ -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
-1
@@ -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
|
||||||
|
|||||||
+4
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user