[FIR] Fix NO_RECEIVER_ALLOWED

If we do create an implicit invoke call, and
then put the receiver into the argument list,
we should mark it.
This commit is contained in:
Nikolay Lunyak
2024-01-22 12:34:39 +02:00
committed by Space Team
parent eb11901d43
commit 9b786d35f8
12 changed files with 38 additions and 9 deletions
@@ -36,6 +36,7 @@ abstract class FirImplicitInvokeCall : FirFunctionCall() {
abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference
abstract override val origin: FirFunctionCallOrigin
abstract val isCallWithExplicitReceiver: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitImplicitInvokeCall(this, data)
@@ -35,6 +35,7 @@ open class FirImplicitInvokeCallBuilder : FirAbstractFunctionCallBuilder, FirAnn
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
override var argumentList: FirArgumentList = FirEmptyArgumentList
override lateinit var calleeReference: FirNamedReference
open var isCallWithExplicitReceiver: Boolean = false
override fun build(): FirImplicitInvokeCall {
return FirImplicitInvokeCallImpl(
@@ -49,6 +50,7 @@ open class FirImplicitInvokeCallBuilder : FirAbstractFunctionCallBuilder, FirAnn
nonFatalDiagnostics.toMutableOrEmpty(),
argumentList,
calleeReference,
isCallWithExplicitReceiver,
)
}
@@ -38,6 +38,7 @@ internal class FirImplicitInvokeCallImpl(
override var nonFatalDiagnostics: MutableOrEmptyList<ConeDiagnostic>,
override var argumentList: FirArgumentList,
override var calleeReference: FirNamedReference,
override val isCallWithExplicitReceiver: Boolean,
) : FirImplicitInvokeCall() {
override val origin: FirFunctionCallOrigin = FirFunctionCallOrigin.Operator
@@ -227,7 +227,10 @@ object BuilderConfigurator : AbstractFirBuilderConfigurator<FirTreeBuilder>(FirT
}
}
builder(integerLiteralOperatorCall, config = configurationForFunctionCallBuilder)
builder(implicitInvokeCall, config = configurationForFunctionCallBuilder)
builder(implicitInvokeCall) {
configurationForFunctionCallBuilder()
defaultFalse("isCallWithExplicitReceiver")
}
builder(getClassCall) {
parents += callBuilder
@@ -408,6 +408,10 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
shouldBeAnInterface()
}
implicitInvokeCall.configure {
+booleanField("isCallWithExplicitReceiver")
}
constructor.configure {
+annotations
+symbol("FirConstructorSymbol")