From 26d749478981b8009ea36440aa69ddd3c5d82151 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 9 Jun 2023 11:26:27 +0300 Subject: [PATCH] [FIR] Simplify ReceiverValue hierarchy - Get rid of `AbstractExplicitReceiver` (as there is no explicit usages of it) - Get rid of `AbstractExplicitReceiverValue` (as there is only one inheritor of it) - Make `ReceiverValue` an abstract class --- .../kotlin/fir/resolve/calls/FirReceivers.kt | 29 +++++-------------- .../fir/resolve/calls/CandidateFactory.kt | 5 ---- .../fir/resolve/calls/QualifierReceiver.kt | 4 +-- 3 files changed, 9 insertions(+), 29 deletions(-) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt index d46f6c82b53..838cee38737 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.fir.expressions.builder.buildThisReceiverExpression import org.jetbrains.kotlin.fir.references.builder.buildImplicitThisReference import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.scope import org.jetbrains.kotlin.fir.resolve.smartcastScope import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator @@ -34,14 +33,13 @@ import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.SmartcastStability -import org.jetbrains.kotlin.utils.addToStdlib.applyIf -interface ReceiverValue { - val type: ConeKotlinType +abstract class ReceiverValue { + abstract val type: ConeKotlinType - val receiverExpression: FirExpression + abstract val receiverExpression: FirExpression - fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirTypeScope? = type.scope( + open fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirTypeScope? = type.scope( useSiteSession = useSiteSession, scopeSession = scopeSession, fakeOverrideTypeCalculator = FakeOverrideTypeCalculator.DoNothing, @@ -49,23 +47,12 @@ interface ReceiverValue { ) } -abstract class AbstractExplicitReceiver { - abstract val explicitReceiver: FirExpression -} - -abstract class AbstractExplicitReceiverValue : AbstractExplicitReceiver(), ReceiverValue { +class ExpressionReceiverValue(override val receiverExpression: FirExpression) : ReceiverValue() { override val type: ConeKotlinType // NB: safe cast is necessary here - get() = explicitReceiver.typeRef.coneTypeSafe() - ?: ConeErrorType(ConeIntermediateDiagnostic("No type calculated for: ${explicitReceiver.renderWithType()}")) // TODO: assert here + get() = receiverExpression.typeRef.coneTypeSafe() + ?: ConeErrorType(ConeIntermediateDiagnostic("No type calculated for: ${receiverExpression.renderWithType()}")) // TODO: assert here - final override val receiverExpression: FirExpression - get() = explicitReceiver -} - -class ExpressionReceiverValue( - override val explicitReceiver: FirExpression -) : AbstractExplicitReceiverValue(), ReceiverValue { override fun scope(useSiteSession: FirSession, scopeSession: ScopeSession): FirTypeScope? { var receiverExpr: FirExpression? = receiverExpression // Unwrap `x!!` to `x` and use the resulted expression to derive receiver type. This is necessary so that smartcast types inside @@ -99,7 +86,7 @@ sealed class ImplicitReceiverValue>( private val mutable: Boolean, val contextReceiverNumber: Int = -1, private val inaccessibleReceiver: Boolean = false -) : ReceiverValue { +) : ReceiverValue() { final override var type: ConeKotlinType = type private set diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt index 94e3e8a52c1..be6f61c9b88 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt @@ -116,11 +116,6 @@ class CandidateFactory private constructor( } } - private fun ReceiverValue?.isCandidateFromCompanionObjectTypeScope(): Boolean { - val expressionReceiverValue = this as? ExpressionReceiverValue ?: return false - return expressionReceiverValue.explicitReceiver.isCandidateFromCompanionObjectTypeScope() - } - private fun FirExpression?.isCandidateFromCompanionObjectTypeScope(): Boolean { val resolvedQualifier = this as? FirResolvedQualifier ?: return false val originClassOfCandidate = this.typeRef.coneType.classId ?: return false diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/QualifierReceiver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/QualifierReceiver.kt index 73f3e76591e..d555bef703c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/QualifierReceiver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/QualifierReceiver.kt @@ -41,9 +41,7 @@ fun createQualifierReceiver( } } -abstract class QualifierReceiver( - final override val explicitReceiver: FirResolvedQualifier -) : AbstractExplicitReceiver() { +abstract class QualifierReceiver(val explicitReceiver: FirResolvedQualifier) { abstract fun classifierScope(): FirScope? abstract fun callableScope(): FirScope? }