FIR: add isImplicit to FirThisReceiverExpression

This commit is contained in:
Tianyu Geng
2021-09-27 10:58:40 -07:00
committed by TeamCityServer
parent a297ee66d4
commit 5ccc5591f5
7 changed files with 8 additions and 1 deletions
@@ -124,6 +124,7 @@ private fun receiverExpression(symbol: FirBasedSymbol<*>, type: ConeKotlinType):
typeRef = buildResolvedTypeRef { typeRef = buildResolvedTypeRef {
this.type = type this.type = type
} }
isImplicit = true
} }
class ImplicitDispatchReceiverValue internal constructor( class ImplicitDispatchReceiverValue internal constructor(
@@ -198,7 +198,7 @@ object CheckDslScopeViolation : ResolutionStage() {
(candidate.symbol as? FirNamedFunctionSymbol)?.name == OperatorNameConventions.INVOKE (candidate.symbol as? FirNamedFunctionSymbol)?.name == OperatorNameConventions.INVOKE
) { ) {
val firstArg = candidate.argumentMapping?.keys?.firstOrNull() as? FirThisReceiverExpression ?: return val firstArg = candidate.argumentMapping?.keys?.firstOrNull() as? FirThisReceiverExpression ?: return
if (firstArg.source != null) return // Having no source means it's implicit. if (!firstArg.isImplicit) return
firstArg.checkImpl( firstArg.checkImpl(
candidate, candidate,
sink, sink,
@@ -28,6 +28,7 @@ abstract class FirThisReceiverExpression : FirQualifiedAccessExpression() {
abstract override val dispatchReceiver: FirExpression abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression abstract override val extensionReceiver: FirExpression
abstract override val calleeReference: FirThisReference abstract override val calleeReference: FirThisReference
abstract val isImplicit: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitThisReceiverExpression(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitThisReceiverExpression(this, data)
@@ -36,6 +36,7 @@ class FirThisReceiverExpressionBuilder : FirQualifiedAccessBuilder, FirAnnotatio
override val annotations: MutableList<FirAnnotation> = mutableListOf() override val annotations: MutableList<FirAnnotation> = mutableListOf()
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf() override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
lateinit var calleeReference: FirThisReference lateinit var calleeReference: FirThisReference
var isImplicit: Boolean = false
override fun build(): FirThisReceiverExpression { override fun build(): FirThisReceiverExpression {
return FirThisReceiverExpressionImpl( return FirThisReceiverExpressionImpl(
@@ -44,6 +45,7 @@ class FirThisReceiverExpressionBuilder : FirQualifiedAccessBuilder, FirAnnotatio
annotations, annotations,
typeArguments, typeArguments,
calleeReference, calleeReference,
isImplicit,
) )
} }
@@ -28,6 +28,7 @@ internal class FirThisReceiverExpressionImpl(
override val annotations: MutableList<FirAnnotation>, override val annotations: MutableList<FirAnnotation>,
override val typeArguments: MutableList<FirTypeProjection>, override val typeArguments: MutableList<FirTypeProjection>,
override var calleeReference: FirThisReference, override var calleeReference: FirThisReference,
override val isImplicit: Boolean,
) : FirThisReceiverExpression() { ) : FirThisReceiverExpression() {
override var explicitReceiver: FirExpression? = null override var explicitReceiver: FirExpression? = null
override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var dispatchReceiver: FirExpression = FirNoReceiverExpression
@@ -221,6 +221,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
builder(thisReceiverExpression) { builder(thisReceiverExpression) {
parents += qualifiedAccessBuilder parents += qualifiedAccessBuilder
default("isImplicit", "false")
} }
builder(variableAssignment) { builder(variableAssignment) {
@@ -625,6 +625,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
thisReceiverExpression.configure { thisReceiverExpression.configure {
+field("calleeReference", thisReference) +field("calleeReference", thisReference)
+booleanField("isImplicit")
} }
whenExpression.configure { whenExpression.configure {