[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
This commit is contained in:
Dmitriy Novozhilov
2022-02-02 12:06:31 +03:00
committed by teamcity
parent b980f5ab32
commit 563e649ac3
3 changed files with 7 additions and 4 deletions
@@ -133,7 +133,7 @@ class FirCallResolver(
private inline fun <reified Q : FirQualifiedAccess> Q.transformExplicitReceiver(): Q { private inline fun <reified Q : FirQualifiedAccess> Q.transformExplicitReceiver(): Q {
val explicitReceiver = val explicitReceiver =
explicitReceiver as? FirQualifiedAccessExpression explicitReceiver as? FirQualifiedAccessExpression
?: return transformExplicitReceiver(transformer, ResolutionMode.ContextIndependent) as Q ?: return transformExplicitReceiver(transformer, ResolutionMode.ReceiverResolution) as Q
(explicitReceiver.calleeReference as? FirSuperReference)?.let { (explicitReceiver.calleeReference as? FirSuperReference)?.let {
transformer.transformSuperReceiver(it, explicitReceiver, this) transformer.transformSuperReceiver(it, explicitReceiver, this)
@@ -143,14 +143,14 @@ class FirCallResolver(
if (explicitReceiver is FirPropertyAccessExpression) { if (explicitReceiver is FirPropertyAccessExpression) {
this.replaceExplicitReceiver( this.replaceExplicitReceiver(
transformer.transformQualifiedAccessExpression( transformer.transformQualifiedAccessExpression(
explicitReceiver, ResolutionMode.ContextIndependent, explicitReceiver, ResolutionMode.ReceiverResolution,
isUsedAsReceiver = true isUsedAsReceiver = true
) as FirExpression ) as FirExpression
) )
return this return this
} }
return transformExplicitReceiver(transformer, ResolutionMode.ContextIndependent) as Q return transformExplicitReceiver(transformer, ResolutionMode.ReceiverResolution) as Q
} }
private data class ResolutionResult( private data class ResolutionResult(
@@ -15,6 +15,7 @@ sealed class ResolutionMode {
object ContextDependent : ResolutionMode() object ContextDependent : ResolutionMode()
object ContextDependentDelegate : ResolutionMode() object ContextDependentDelegate : ResolutionMode()
object ContextIndependent : ResolutionMode() object ContextIndependent : ResolutionMode()
object ReceiverResolution : ResolutionMode()
// TODO: it's better not to use WithExpectedType(FirImplicitTypeRef) // TODO: it's better not to use WithExpectedType(FirImplicitTypeRef)
class WithExpectedType( class WithExpectedType(
@@ -57,7 +58,8 @@ sealed class ResolutionMode {
fun ResolutionMode.expectedType(components: BodyResolveComponents, allowFromCast: Boolean = false): FirTypeRef? = when (this) { fun ResolutionMode.expectedType(components: BodyResolveComponents, allowFromCast: Boolean = false): FirTypeRef? = when (this) {
is ResolutionMode.WithExpectedType -> expectedTypeRef 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.WithExpectedTypeFromCast -> expectedTypeRef.takeIf { allowFromCast }
is ResolutionMode.WithSuggestedType -> suggestedTypeRef is ResolutionMode.WithSuggestedType -> suggestedTypeRef
else -> null else -> null
@@ -764,6 +764,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
} }
is ResolutionMode.WithExpectedType, is ResolutionMode.WithExpectedType,
is ResolutionMode.ContextIndependent, is ResolutionMode.ContextIndependent,
is ResolutionMode.ReceiverResolution,
is ResolutionMode.WithSuggestedType -> { is ResolutionMode.WithSuggestedType -> {
val expectedTypeRef = when (data) { val expectedTypeRef = when (data) {
is ResolutionMode.WithExpectedType -> { is ResolutionMode.WithExpectedType -> {