From 609906a0b106775b0e48c38e5e601ef9bd038cdc Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Wed, 13 Mar 2024 12:17:59 +0100 Subject: [PATCH] [FIR] Extract function for receiver resolution --- .../jetbrains/kotlin/fir/FirCallResolver.kt | 2 +- .../FirExpressionsResolveTransformer.kt | 55 +++++++++---------- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index 86ca680076f..6d1d3f529dc 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -264,7 +264,7 @@ class FirCallResolver( val callee = qualifiedAccess.calleeReference as? FirSimpleNamedReference ?: return qualifiedAccess @Suppress("NAME_SHADOWING") - val qualifiedAccess = qualifiedAccess.let(transformer::transformExplicitReceiver) + val qualifiedAccess = qualifiedAccess.let(transformer::transformExplicitReceiverOf) val nonFatalDiagnosticFromExpression = (qualifiedAccess as? FirPropertyAccessExpression)?.nonFatalDiagnostics val basicResult by lazy(LazyThreadSafetyMode.NONE) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index c2d8d010daf..10ca607d05a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -199,8 +199,8 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT return result } - fun transformExplicitReceiver(qualifiedAccessExpression: Q): Q { - val explicitReceiver = qualifiedAccessExpression.explicitReceiver as? FirQualifiedAccessExpression + fun transformExplicitReceiverOf(qualifiedAccessExpression: Q): Q { + val explicitReceiver = qualifiedAccessExpression.explicitReceiver if (explicitReceiver is FirQualifiedAccessExpression) { val superReference = explicitReceiver.calleeReference as? FirSuperReference if (superReference != null) { @@ -208,16 +208,26 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT return qualifiedAccessExpression } } - if (explicitReceiver is FirPropertyAccessExpression) { + + if (explicitReceiver != null) { qualifiedAccessExpression.replaceExplicitReceiver( - transformQualifiedAccessExpression( - explicitReceiver, ResolutionMode.ReceiverResolution, isUsedAsReceiver = true, isUsedAsGetClassReceiver = false - ) + explicitReceiver.transformAsExplicitReceiver(ResolutionMode.ReceiverResolution, isUsedAsGetClassReceiver = false) ) - return qualifiedAccessExpression } - @Suppress("UNCHECKED_CAST") - return qualifiedAccessExpression.transformExplicitReceiver(transformer, ResolutionMode.ReceiverResolution) as Q + + return qualifiedAccessExpression + } + + private fun FirExpression.transformAsExplicitReceiver( + resolutionMode: ResolutionMode, + isUsedAsGetClassReceiver: Boolean, + ): FirExpression { + return when (this) { + is FirPropertyAccessExpression -> transformQualifiedAccessExpression( + this, resolutionMode, isUsedAsReceiver = true, isUsedAsGetClassReceiver = isUsedAsGetClassReceiver + ) + else -> transformSingle(this@FirExpressionsResolveTransformer, resolutionMode) + } } override fun transformPropertyAccessExpression( @@ -456,7 +466,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT // and 'someDelegate' explicit receiver is resolved at 1st stage // See also FirDeclarationsResolveTransformer.transformWrappedDelegateExpression val withResolvedExplicitReceiver = - if (callResolutionMode == CallResolutionMode.PROVIDE_DELEGATE) functionCall else transformExplicitReceiver(functionCall) + if (callResolutionMode == CallResolutionMode.PROVIDE_DELEGATE) functionCall else transformExplicitReceiverOf(functionCall) withResolvedExplicitReceiver.also { it.replaceArgumentList(it.argumentList.transform(this, ResolutionMode.ContextDependent)) dataFlowAnalyzer.exitCallArguments() @@ -1101,18 +1111,13 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT callableReferenceAccess.transformAnnotations(transformer, data) val explicitReceiver = callableReferenceAccess.explicitReceiver - val transformedLHS = when (explicitReceiver) { - is FirPropertyAccessExpression -> - transformQualifiedAccessExpression( - explicitReceiver, ResolutionMode.ReceiverResolution.ForCallableReference, isUsedAsReceiver = true, isUsedAsGetClassReceiver = false - ) - else -> - explicitReceiver?.transformSingle(this, ResolutionMode.ReceiverResolution.ForCallableReference) - }.apply { - if (this is FirResolvedQualifier && callableReferenceAccess.hasQuestionMarkAtLHS) { - replaceIsNullableLHSForCallableReference(true) + val transformedLHS = explicitReceiver + ?.transformAsExplicitReceiver(ResolutionMode.ReceiverResolution.ForCallableReference, false) + .apply { + if (this is FirResolvedQualifier && callableReferenceAccess.hasQuestionMarkAtLHS) { + replaceIsNullableLHSForCallableReference(true) + } } - } transformedLHS?.let { callableReferenceAccess.replaceExplicitReceiver(transformedLHS) } @@ -1142,13 +1147,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT val transformedGetClassCall = run { val argument = getClassCall.argument - val replacedArgument: FirExpression = - if (argument is FirPropertyAccessExpression) - transformQualifiedAccessExpression( - argument, dataForLhs, isUsedAsReceiver = true, isUsedAsGetClassReceiver = true - ) - else - argument.transform(this, dataForLhs) + val replacedArgument: FirExpression = argument.transformAsExplicitReceiver(dataForLhs, isUsedAsGetClassReceiver = true) getClassCall.argumentList.transformArguments(object : FirTransformer() { @Suppress("UNCHECKED_CAST")