[FIR] Resolve infix calls to infix functions only

Implements INFIX_MODIFIER_REQUIRED diagnostics
This commit is contained in:
Andrey Zinovyev
2021-05-14 15:22:43 +03:00
committed by TeamCityServer
parent df14deb5a0
commit b1c8669b43
46 changed files with 174 additions and 94 deletions
@@ -28,6 +28,7 @@ abstract class FirComponentCall : FirFunctionCall() {
abstract override val extensionReceiver: FirExpression
abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference
abstract override val origin: FirFunctionCallOrigin
abstract override val explicitReceiver: FirExpression
abstract val componentIndex: Int
@@ -29,6 +29,7 @@ abstract class FirFunctionCall : FirQualifiedAccessExpression(), FirCall {
abstract override val extensionReceiver: FirExpression
abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference
abstract val origin: FirFunctionCallOrigin
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitFunctionCall(this, data)
@@ -29,6 +29,7 @@ abstract class FirImplicitInvokeCall : FirFunctionCall() {
abstract override val extensionReceiver: FirExpression
abstract override val argumentList: FirArgumentList
abstract override val calleeReference: FirNamedReference
abstract override val origin: FirFunctionCallOrigin
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitImplicitInvokeCall(this, data)
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirFunctionCallOrigin
import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder
import org.jetbrains.kotlin.fir.references.FirNamedReference
@@ -34,5 +35,6 @@ interface FirAbstractFunctionCallBuilder : FirQualifiedAccessBuilder, FirCallBui
abstract override var argumentList: FirArgumentList
abstract var typeRef: FirTypeRef
abstract var calleeReference: FirNamedReference
abstract var origin: FirFunctionCallOrigin
override fun build(): FirFunctionCall
}
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCallOrigin
import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirComponentCallImpl
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirFunctionCallOrigin
import org.jetbrains.kotlin.fir.expressions.builder.FirAbstractFunctionCallBuilder
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
@@ -42,6 +43,7 @@ open class FirFunctionCallBuilder : FirAbstractFunctionCallBuilder, FirAnnotatio
override var extensionReceiver: FirExpression = FirNoReceiverExpression
override var argumentList: FirArgumentList = FirEmptyArgumentList
override lateinit var calleeReference: FirNamedReference
override var origin: FirFunctionCallOrigin = FirFunctionCallOrigin.REGULAR
@OptIn(FirImplementationDetail::class)
override fun build(): FirFunctionCall {
@@ -55,6 +57,7 @@ open class FirFunctionCallBuilder : FirAbstractFunctionCallBuilder, FirAnnotatio
extensionReceiver,
argumentList,
calleeReference,
origin,
)
}
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCallOrigin
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.expressions.builder.FirAbstractFunctionCallBuilder
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
@@ -62,6 +63,13 @@ open class FirImplicitInvokeCallBuilder : FirAbstractFunctionCallBuilder, FirAnn
set(_) {
throw IllegalStateException()
}
@Deprecated("Modification of 'origin' has no impact for FirImplicitInvokeCallBuilder", level = DeprecationLevel.HIDDEN)
override var origin: FirFunctionCallOrigin
get() = throw IllegalStateException()
set(_) {
throw IllegalStateException()
}
}
@OptIn(ExperimentalContracts::class)
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCallOrigin
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
@@ -38,6 +39,7 @@ internal class FirComponentCallImpl(
) : FirComponentCall() {
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
override var calleeReference: FirNamedReference = FirSimpleNamedReference(source, Name.identifier("component$componentIndex"), null)
override val origin: FirFunctionCallOrigin = FirFunctionCallOrigin.REGULAR
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeRef.accept(visitor, data)
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirFunctionCallOrigin
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.FirTypeProjection
@@ -32,6 +33,7 @@ open class FirFunctionCallImpl @FirImplementationDetail constructor(
override var extensionReceiver: FirExpression,
override var argumentList: FirArgumentList,
override var calleeReference: FirNamedReference,
override val origin: FirFunctionCallOrigin,
) : FirFunctionCall() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeRef.accept(visitor, data)
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirFunctionCallOrigin
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirReference
@@ -34,6 +35,7 @@ internal class FirImplicitInvokeCallImpl(
override var calleeReference: FirNamedReference,
) : FirImplicitInvokeCall() {
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
override val origin: FirFunctionCallOrigin = FirFunctionCallOrigin.REGULAR
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
typeRef.accept(visitor, data)
@@ -0,0 +1,10 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions
enum class FirFunctionCallOrigin {
REGULAR, INFIX, OPERATOR
}
@@ -176,7 +176,12 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
useTypes(emptyArgumentListType)
}
builder(functionCall, init = configurationForFunctionCallBuilder)
builder(functionCall) {
configurationForFunctionCallBuilder()
default("origin") {
value = "FirFunctionCallOrigin.REGULAR"
}
}
builder(implicitInvokeCall, init = configurationForFunctionCallBuilder)
builder(qualifiedAccessExpression) {
@@ -153,6 +153,18 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
kind = OpenClass
}
fun ImplementationContext.defaultFunctionOrigin() {
default("origin", "FirFunctionCallOrigin.REGULAR")
}
impl(implicitInvokeCall) {
defaultFunctionOrigin()
}
impl(componentCall) {
defaultFunctionOrigin()
}
impl(qualifiedAccessExpression)
noImpl(expressionWithSmartcast)
@@ -207,6 +207,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
functionCall.configure {
+field("calleeReference", namedReference)
+field("origin", functionCallOrigin)
}
comparisonExpression.configure {
@@ -86,3 +86,5 @@ val annotationResolveStatusType = generatedType("expressions", "FirAnnotationRes
val exhaustivenessStatusType = generatedType("expressions", "ExhaustivenessStatus")
val callableReferenceMappedArgumentsType = type("fir.resolve.calls", "CallableReferenceMappedArguments")
val functionCallOrigin = type("fir.expressions", "FirFunctionCallOrigin")