[LL FIR] mark entire delegate as lazy expression
To simplify modification and restoring ^KT-59687
This commit is contained in:
committed by
Space Team
parent
f8b2b4ac21
commit
a81523fa74
+5
-10
@@ -139,9 +139,9 @@ private fun replaceLazyInitializer(target: FirVariable, copy: FirVariable) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun replaceLazyExpression(target: FirWrappedExpression, copy: FirWrappedExpression) {
|
private fun replaceLazyDelegate(target: FirVariable, copy: FirVariable) {
|
||||||
if (target.expression is FirLazyExpression) {
|
if (target.delegate is FirLazyExpression) {
|
||||||
target.replaceExpression(copy.expression)
|
target.replaceDelegate(copy.delegate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,17 +187,12 @@ private fun calculateLazyBodyForProperty(designation: FirDesignation) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
replaceLazyInitializer(firProperty, newProperty)
|
replaceLazyInitializer(firProperty, newProperty)
|
||||||
|
replaceLazyDelegate(firProperty, newProperty)
|
||||||
|
|
||||||
firProperty.getExplicitBackingField()?.let { backingField ->
|
firProperty.getExplicitBackingField()?.let { backingField ->
|
||||||
val newBackingField = newProperty.getExplicitBackingField()!!
|
val newBackingField = newProperty.getExplicitBackingField()!!
|
||||||
replaceLazyInitializer(backingField, newBackingField)
|
replaceLazyInitializer(backingField, newBackingField)
|
||||||
}
|
}
|
||||||
|
|
||||||
(firProperty.delegate as? FirWrappedDelegateExpression)?.let { delegate ->
|
|
||||||
val newDelegate = newProperty.delegate as FirWrappedDelegateExpression
|
|
||||||
replaceLazyExpression(delegate, newDelegate)
|
|
||||||
delegate.replaceDelegateProvider(newDelegate.delegateProvider)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun calculateLazyInitializerForEnumEntry(designation: FirDesignation) {
|
private fun calculateLazyInitializerForEnumEntry(designation: FirDesignation) {
|
||||||
@@ -258,7 +253,7 @@ private fun needCalculatingLazyBodyForProperty(firProperty: FirProperty): Boolea
|
|||||||
firProperty.getter?.let { needCalculatingLazyBodyForFunction(it) } == true
|
firProperty.getter?.let { needCalculatingLazyBodyForFunction(it) } == true
|
||||||
|| firProperty.setter?.let { needCalculatingLazyBodyForFunction(it) } == true
|
|| firProperty.setter?.let { needCalculatingLazyBodyForFunction(it) } == true
|
||||||
|| firProperty.initializer is FirLazyExpression
|
|| firProperty.initializer is FirLazyExpression
|
||||||
|| (firProperty.delegate as? FirWrappedDelegateExpression)?.expression is FirLazyExpression
|
|| firProperty.delegate is FirLazyExpression
|
||||||
|| firProperty.getExplicitBackingField()?.initializer is FirLazyExpression
|
|| firProperty.getExplicitBackingField()?.initializer is FirLazyExpression
|
||||||
|
|
||||||
private enum class FirLazyAnnotationTransformerScope {
|
private enum class FirLazyAnnotationTransformerScope {
|
||||||
|
|||||||
+7
-8
@@ -223,6 +223,7 @@ internal object BodyStateKeepers {
|
|||||||
|
|
||||||
if (!isCallableWithSpecialBody(variable)) {
|
if (!isCallableWithSpecialBody(variable)) {
|
||||||
add(FirVariable::initializerIfUnresolved, FirVariable::replaceInitializer, ::expressionGuard)
|
add(FirVariable::initializerIfUnresolved, FirVariable::replaceInitializer, ::expressionGuard)
|
||||||
|
add(FirVariable::delegateIfUnresolved, FirVariable::replaceDelegate, ::expressionGuard)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,11 +254,6 @@ internal object BodyStateKeepers {
|
|||||||
entity(property.setterIfUnresolved, FUNCTION)
|
entity(property.setterIfUnresolved, FUNCTION)
|
||||||
entity(property.backingFieldIfUnresolved, VARIABLE)
|
entity(property.backingFieldIfUnresolved, VARIABLE)
|
||||||
|
|
||||||
entity(property.delegateIfUnresolved) {
|
|
||||||
add(FirWrappedDelegateExpression::expression, FirWrappedDelegateExpression::replaceExpression, ::expressionGuard)
|
|
||||||
add(FirWrappedDelegateExpression::delegateProvider, FirWrappedDelegateExpression::replaceDelegateProvider, ::expressionGuard)
|
|
||||||
}
|
|
||||||
|
|
||||||
add(FirProperty::controlFlowGraphReference, FirProperty::replaceControlFlowGraphReference)
|
add(FirProperty::controlFlowGraphReference, FirProperty::replaceControlFlowGraphReference)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -324,6 +320,12 @@ private val FirVariable.initializerIfUnresolved: FirExpression?
|
|||||||
else -> initializer
|
else -> initializer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val FirVariable.delegateIfUnresolved: FirExpression?
|
||||||
|
get() = when (this) {
|
||||||
|
is FirProperty -> if (bodyResolveState < FirPropertyBodyResolveState.EVERYTHING_RESOLVED) delegate else null
|
||||||
|
else -> delegate
|
||||||
|
}
|
||||||
|
|
||||||
private val FirProperty.backingFieldIfUnresolved: FirBackingField?
|
private val FirProperty.backingFieldIfUnresolved: FirBackingField?
|
||||||
get() = if (bodyResolveState < FirPropertyBodyResolveState.INITIALIZER_RESOLVED) getExplicitBackingField() else null
|
get() = if (bodyResolveState < FirPropertyBodyResolveState.INITIALIZER_RESOLVED) getExplicitBackingField() else null
|
||||||
|
|
||||||
@@ -333,9 +335,6 @@ private val FirProperty.getterIfUnresolved: FirPropertyAccessor?
|
|||||||
private val FirProperty.setterIfUnresolved: FirPropertyAccessor?
|
private val FirProperty.setterIfUnresolved: FirPropertyAccessor?
|
||||||
get() = if (bodyResolveState < FirPropertyBodyResolveState.EVERYTHING_RESOLVED) setter else null
|
get() = if (bodyResolveState < FirPropertyBodyResolveState.EVERYTHING_RESOLVED) setter else null
|
||||||
|
|
||||||
private val FirProperty.delegateIfUnresolved: FirWrappedDelegateExpression?
|
|
||||||
get() = if (bodyResolveState < FirPropertyBodyResolveState.EVERYTHING_RESOLVED) delegate as? FirWrappedDelegateExpression else null
|
|
||||||
|
|
||||||
private fun delegatedConstructorCallGuard(fir: FirDelegatedConstructorCall): FirDelegatedConstructorCall {
|
private fun delegatedConstructorCallGuard(fir: FirDelegatedConstructorCall): FirDelegatedConstructorCall {
|
||||||
if (fir is FirLazyDelegatedConstructorCall) {
|
if (fir is FirLazyDelegatedConstructorCall) {
|
||||||
return fir
|
return fir
|
||||||
|
|||||||
@@ -1908,12 +1908,18 @@ open class PsiRawFirBuilder(
|
|||||||
expression = delegateExpression
|
expression = delegateExpression
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val lazyDelegateExpression: FirLazyExpression? = buildOrLazy(
|
||||||
|
build = { null },
|
||||||
|
lazy = { buildLazyExpression { source = delegateBuilder.source } },
|
||||||
|
)
|
||||||
|
|
||||||
generateAccessorsByDelegate(
|
generateAccessorsByDelegate(
|
||||||
delegateBuilder,
|
delegateBuilder,
|
||||||
baseModuleData,
|
baseModuleData,
|
||||||
ownerRegularOrAnonymousObjectSymbol,
|
ownerRegularOrAnonymousObjectSymbol,
|
||||||
context,
|
context,
|
||||||
isExtension = receiverTypeReference != null,
|
isExtension = receiverTypeReference != null,
|
||||||
|
lazyDelegateExpression = lazyDelegateExpression,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-8
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.contracts.FirLegacyRawContractDescription
|
|||||||
import org.jetbrains.kotlin.fir.contracts.builder.buildLegacyRawContractDescription
|
import org.jetbrains.kotlin.fir.contracts.builder.buildLegacyRawContractDescription
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
|
import org.jetbrains.kotlin.fir.declarations.FirReceiverParameter
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.*
|
import org.jetbrains.kotlin.fir.declarations.builder.*
|
||||||
@@ -313,6 +314,7 @@ fun <T> FirPropertyBuilder.generateAccessorsByDelegate(
|
|||||||
ownerRegularOrAnonymousObjectSymbol: FirClassSymbol<*>?,
|
ownerRegularOrAnonymousObjectSymbol: FirClassSymbol<*>?,
|
||||||
context: Context<T>,
|
context: Context<T>,
|
||||||
isExtension: Boolean,
|
isExtension: Boolean,
|
||||||
|
lazyDelegateExpression: FirLazyExpression? = null,
|
||||||
) {
|
) {
|
||||||
if (delegateBuilder == null) return
|
if (delegateBuilder == null) return
|
||||||
val delegateFieldSymbol = FirDelegateFieldSymbol(symbol.callableId).also {
|
val delegateFieldSymbol = FirDelegateFieldSymbol(symbol.callableId).also {
|
||||||
@@ -402,17 +404,21 @@ fun <T> FirPropertyBuilder.generateAccessorsByDelegate(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delegateBuilder.delegateProvider = buildFunctionCall {
|
delegate = lazyDelegateExpression ?: run {
|
||||||
explicitReceiver = delegateBuilder.expression
|
delegateBuilder.delegateProvider = buildFunctionCall {
|
||||||
calleeReference = buildSimpleNamedReference {
|
explicitReceiver = delegateBuilder.expression
|
||||||
|
calleeReference = buildSimpleNamedReference {
|
||||||
|
source = fakeSource
|
||||||
|
name = OperatorNameConventions.PROVIDE_DELEGATE
|
||||||
|
}
|
||||||
|
argumentList = buildBinaryArgumentList(thisRef(forDispatchReceiver = true), propertyRef())
|
||||||
|
origin = FirFunctionCallOrigin.Operator
|
||||||
source = fakeSource
|
source = fakeSource
|
||||||
name = OperatorNameConventions.PROVIDE_DELEGATE
|
|
||||||
}
|
}
|
||||||
argumentList = buildBinaryArgumentList(thisRef(forDispatchReceiver = true), propertyRef())
|
|
||||||
origin = FirFunctionCallOrigin.Operator
|
delegateBuilder.build()
|
||||||
source = fakeSource
|
|
||||||
}
|
}
|
||||||
delegate = delegateBuilder.build()
|
|
||||||
if (getter == null || getter is FirDefaultPropertyAccessor) {
|
if (getter == null || getter is FirDefaultPropertyAccessor) {
|
||||||
val annotations = getter?.annotations
|
val annotations = getter?.annotations
|
||||||
val returnTarget = FirFunctionTarget(null, isLambda = false)
|
val returnTarget = FirFunctionTarget(null, isLambda = false)
|
||||||
|
|||||||
Reference in New Issue
Block a user