diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt index 15143d87b4f..6f9f9f24302 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirReceivers.kt @@ -124,6 +124,7 @@ private fun receiverExpression(symbol: FirBasedSymbol<*>, type: ConeKotlinType): typeRef = buildResolvedTypeRef { this.type = type } + isImplicit = true } class ImplicitDispatchReceiverValue internal constructor( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt index 9bd5bfc6b5b..724b13ea659 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt @@ -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, diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirThisReceiverExpression.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirThisReceiverExpression.kt index 44bc0f32bb9..dda40e56949 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirThisReceiverExpression.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirThisReceiverExpression.kt @@ -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 accept(visitor: FirVisitor, data: D): R = visitor.visitThisReceiverExpression(this, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirThisReceiverExpressionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirThisReceiverExpressionBuilder.kt index 1b26827dc95..344c8a48ece 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirThisReceiverExpressionBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirThisReceiverExpressionBuilder.kt @@ -36,6 +36,7 @@ class FirThisReceiverExpressionBuilder : FirQualifiedAccessBuilder, FirAnnotatio override val annotations: MutableList = mutableListOf() override val typeArguments: MutableList = 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, ) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt index d37261f18bb..f0cddc32b5a 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirThisReceiverExpressionImpl.kt @@ -28,6 +28,7 @@ internal class FirThisReceiverExpressionImpl( override val annotations: MutableList, override val typeArguments: MutableList, override var calleeReference: FirThisReference, + override val isImplicit: Boolean, ) : FirThisReceiverExpression() { override var explicitReceiver: FirExpression? = null override var dispatchReceiver: FirExpression = FirNoReceiverExpression diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt index 2e3b2048461..0ca51518baa 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt @@ -221,6 +221,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree builder(thisReceiverExpression) { parents += qualifiedAccessBuilder + default("isImplicit", "false") } builder(variableAssignment) { diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 5a2fbc176ba..9c4bd6ba31b 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -625,6 +625,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild thisReceiverExpression.configure { +field("calleeReference", thisReference) + +booleanField("isImplicit") } whenExpression.configure {