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 {
this.type = type
}
isImplicit = true
}
class ImplicitDispatchReceiverValue internal constructor(
@@ -198,7 +198,7 @@ object CheckDslScopeViolation : ResolutionStage() {
(candidate.symbol as? FirNamedFunctionSymbol)?.name == OperatorNameConventions.INVOKE
) {
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(
candidate,
sink,
@@ -28,6 +28,7 @@ abstract class FirThisReceiverExpression : FirQualifiedAccessExpression() {
abstract override val dispatchReceiver: FirExpression
abstract override val extensionReceiver: FirExpression
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)
@@ -36,6 +36,7 @@ class FirThisReceiverExpressionBuilder : FirQualifiedAccessBuilder, FirAnnotatio
override val annotations: MutableList<FirAnnotation> = mutableListOf()
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
lateinit var calleeReference: FirThisReference
var isImplicit: Boolean = false
override fun build(): FirThisReceiverExpression {
return FirThisReceiverExpressionImpl(
@@ -44,6 +45,7 @@ class FirThisReceiverExpressionBuilder : FirQualifiedAccessBuilder, FirAnnotatio
annotations,
typeArguments,
calleeReference,
isImplicit,
)
}
@@ -28,6 +28,7 @@ internal class FirThisReceiverExpressionImpl(
override val annotations: MutableList<FirAnnotation>,
override val typeArguments: MutableList<FirTypeProjection>,
override var calleeReference: FirThisReference,
override val isImplicit: Boolean,
) : FirThisReceiverExpression() {
override var explicitReceiver: FirExpression? = null
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
@@ -221,6 +221,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
builder(thisReceiverExpression) {
parents += qualifiedAccessBuilder
default("isImplicit", "false")
}
builder(variableAssignment) {
@@ -625,6 +625,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
thisReceiverExpression.configure {
+field("calleeReference", thisReference)
+booleanField("isImplicit")
}
whenExpression.configure {