[LL FIR] mark entire delegate as lazy expression

To simplify modification and restoring

^KT-59687
This commit is contained in:
Dmitrii Gridin
2023-07-01 22:59:12 +02:00
committed by Space Team
parent f8b2b4ac21
commit a81523fa74
4 changed files with 32 additions and 26 deletions
@@ -1908,12 +1908,18 @@ open class PsiRawFirBuilder(
expression = delegateExpression
}
val lazyDelegateExpression: FirLazyExpression? = buildOrLazy(
build = { null },
lazy = { buildLazyExpression { source = delegateBuilder.source } },
)
generateAccessorsByDelegate(
delegateBuilder,
baseModuleData,
ownerRegularOrAnonymousObjectSymbol,
context,
isExtension = receiverTypeReference != null,
lazyDelegateExpression = lazyDelegateExpression,
)
}
}
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.contracts.FirLegacyRawContractDescription
import org.jetbrains.kotlin.fir.contracts.builder.buildLegacyRawContractDescription
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
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.FirVariable
import org.jetbrains.kotlin.fir.declarations.builder.*
@@ -313,6 +314,7 @@ fun <T> FirPropertyBuilder.generateAccessorsByDelegate(
ownerRegularOrAnonymousObjectSymbol: FirClassSymbol<*>?,
context: Context<T>,
isExtension: Boolean,
lazyDelegateExpression: FirLazyExpression? = null,
) {
if (delegateBuilder == null) return
val delegateFieldSymbol = FirDelegateFieldSymbol(symbol.callableId).also {
@@ -402,17 +404,21 @@ fun <T> FirPropertyBuilder.generateAccessorsByDelegate(
}
}
delegateBuilder.delegateProvider = buildFunctionCall {
explicitReceiver = delegateBuilder.expression
calleeReference = buildSimpleNamedReference {
delegate = lazyDelegateExpression ?: run {
delegateBuilder.delegateProvider = buildFunctionCall {
explicitReceiver = delegateBuilder.expression
calleeReference = buildSimpleNamedReference {
source = fakeSource
name = OperatorNameConventions.PROVIDE_DELEGATE
}
argumentList = buildBinaryArgumentList(thisRef(forDispatchReceiver = true), propertyRef())
origin = FirFunctionCallOrigin.Operator
source = fakeSource
name = OperatorNameConventions.PROVIDE_DELEGATE
}
argumentList = buildBinaryArgumentList(thisRef(forDispatchReceiver = true), propertyRef())
origin = FirFunctionCallOrigin.Operator
source = fakeSource
delegateBuilder.build()
}
delegate = delegateBuilder.build()
if (getter == null || getter is FirDefaultPropertyAccessor) {
val annotations = getter?.annotations
val returnTarget = FirFunctionTarget(null, isLambda = false)