From 563e649ac3599bc373b3229e19bf15b767db9e1a Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 2 Feb 2022 12:06:31 +0300 Subject: [PATCH] [FIR] Introduce special ReceiverResolution resolution mode for resolution of receivers of calls This resolution mode is needed to determine do we need approximate integer operator calls or not --- .../resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt | 6 +++--- .../src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt | 4 +++- .../body/resolve/FirDeclarationsResolveTransformer.kt | 1 + 3 files changed, 7 insertions(+), 4 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 6e762725b2f..6aef3a1a327 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -133,7 +133,7 @@ class FirCallResolver( private inline fun Q.transformExplicitReceiver(): Q { val explicitReceiver = explicitReceiver as? FirQualifiedAccessExpression - ?: return transformExplicitReceiver(transformer, ResolutionMode.ContextIndependent) as Q + ?: return transformExplicitReceiver(transformer, ResolutionMode.ReceiverResolution) as Q (explicitReceiver.calleeReference as? FirSuperReference)?.let { transformer.transformSuperReceiver(it, explicitReceiver, this) @@ -143,14 +143,14 @@ class FirCallResolver( if (explicitReceiver is FirPropertyAccessExpression) { this.replaceExplicitReceiver( transformer.transformQualifiedAccessExpression( - explicitReceiver, ResolutionMode.ContextIndependent, + explicitReceiver, ResolutionMode.ReceiverResolution, isUsedAsReceiver = true ) as FirExpression ) return this } - return transformExplicitReceiver(transformer, ResolutionMode.ContextIndependent) as Q + return transformExplicitReceiver(transformer, ResolutionMode.ReceiverResolution) as Q } private data class ResolutionResult( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt index 8586af6266d..ee879a212ec 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolutionMode.kt @@ -15,6 +15,7 @@ sealed class ResolutionMode { object ContextDependent : ResolutionMode() object ContextDependentDelegate : ResolutionMode() object ContextIndependent : ResolutionMode() + object ReceiverResolution : ResolutionMode() // TODO: it's better not to use WithExpectedType(FirImplicitTypeRef) class WithExpectedType( @@ -57,7 +58,8 @@ sealed class ResolutionMode { fun ResolutionMode.expectedType(components: BodyResolveComponents, allowFromCast: Boolean = false): FirTypeRef? = when (this) { is ResolutionMode.WithExpectedType -> expectedTypeRef - is ResolutionMode.ContextIndependent -> components.noExpectedType + is ResolutionMode.ContextIndependent, + is ResolutionMode.ReceiverResolution -> components.noExpectedType is ResolutionMode.WithExpectedTypeFromCast -> expectedTypeRef.takeIf { allowFromCast } is ResolutionMode.WithSuggestedType -> suggestedTypeRef else -> null diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index b9a12f10911..d0a2610d8cd 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -764,6 +764,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor } is ResolutionMode.WithExpectedType, is ResolutionMode.ContextIndependent, + is ResolutionMode.ReceiverResolution, is ResolutionMode.WithSuggestedType -> { val expectedTypeRef = when (data) { is ResolutionMode.WithExpectedType -> {