From 07a8ae7e7165401abf9bee2dc172a8b453c21135 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Tue, 18 May 2021 18:19:46 +0300 Subject: [PATCH] [FIR] Mark more calls origin as OPERATOR --- .../converter/ExpressionsConverter.kt | 4 +++- .../kotlin/fir/builder/RawFirBuilder.kt | 2 ++ .../kotlin/fir/builder/BaseFirBuilder.kt | 9 +++++++++ .../kotlin/fir/builder/ConversionUtils.kt | 5 +++++ .../fir/resolve/calls/ResolutionStages.kt | 2 ++ .../ConeConditionalEffectToFirVisitor.kt | 1 + .../impl/FirImplicitInvokeCallImpl.kt | 2 +- .../generator/ImplementationConfigurator.kt | 8 ++------ .../diagnostics/tests/Operators.fir.kt | 20 +++++++++---------- .../disallowImplInTypeParameter.fir.kt | 7 ------- .../disallowImplInTypeParameter.kt | 1 + ...noOperatorModifierOnProvideDelegate.fir.kt | 2 +- .../irrelevantImplMutableListKotlin.fir.kt | 3 ++- .../modifiers/operatorInfix/Simple.fir.kt | 8 ++++---- .../tests/operatorsOverloading/kt11300.fir.kt | 8 +++++--- .../tests/regressions/kt26303.fir.kt | 18 ----------------- .../diagnostics/tests/regressions/kt26303.kt | 1 + .../invoke/errors/ambiguityForInvoke.fir.kt | 4 ++-- 18 files changed, 51 insertions(+), 54 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/delegatedProperty/disallowImplInTypeParameter.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/regressions/kt26303.fir.kt diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index 1f2985e33bb..256c86892b3 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -388,10 +388,11 @@ class ExpressionsConverter( buildFunctionCall { source = unaryExpression.toFirSourceElement() calleeReference = buildSimpleNamedReference { - source = this@buildFunctionCall.source + source = operationReference?.toFirSourceElement() ?: this@buildFunctionCall.source name = conventionCallName } explicitReceiver = receiver + origin = FirFunctionCallOrigin.OPERATOR } } else -> throw IllegalStateException("Unexpected expression: ${unaryExpression.asText}") @@ -843,6 +844,7 @@ class ExpressionsConverter( arguments += indices getArgument?.let { arguments += it } } + origin = FirFunctionCallOrigin.OPERATOR } } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index a53b4c3a1aa..f54f651dfc4 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1968,6 +1968,7 @@ open class RawFirBuilder( name = conventionCallName } explicitReceiver = receiver + origin = FirFunctionCallOrigin.OPERATOR } } else -> throw IllegalStateException("Unexpected expression: ${expression.text}") @@ -2064,6 +2065,7 @@ open class RawFirBuilder( arguments += getArgument } } + origin = FirFunctionCallOrigin.OPERATOR } } diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index 5326344fa19..e1a0258848b 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -520,6 +520,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte } else { generateResolvedAccessExpression(desugaredSource, initialValueVar) } + origin = FirFunctionCallOrigin.OPERATOR } // resultVar is only used for prefix increment/decrement. @@ -643,6 +644,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte } else { generateResolvedAccessExpression(desugaredSource, initialValueVar) } + origin = FirFunctionCallOrigin.OPERATOR } // resultVar is only used for prefix increment/decrement. @@ -759,6 +761,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte arguments += generateResolvedAccessExpression(indexVar.source, indexVar) } } + origin = FirFunctionCallOrigin.OPERATOR } // initialValueVar is only used for postfix increment/decrement (stores the argument value before increment/decrement). @@ -781,6 +784,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte } else { generateResolvedAccessExpression(desugaredSource, initialValueVar) } + origin = FirFunctionCallOrigin.OPERATOR } // resultVar is only used for prefix increment/decrement. @@ -809,6 +813,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte resultInitializer } } + origin = FirFunctionCallOrigin.OPERATOR } } @@ -979,6 +984,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte ConeSimpleDiagnostic("No value for array set", DiagnosticKind.Syntax) ) } + origin = FirFunctionCallOrigin.OPERATOR } } @@ -1021,6 +1027,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte calleeReference = buildSimpleNamedReference { name = OperatorNameConventions.SET } + origin = FirFunctionCallOrigin.OPERATOR argumentList = buildArgumentList { for (indexVariable in indexVariables) { arguments += indexVariable.toQualifiedAccess() @@ -1036,6 +1043,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte arguments += indexVariable.toQualifiedAccess() } } + origin = FirFunctionCallOrigin.OPERATOR } val operatorCall = buildFunctionCall { @@ -1052,6 +1060,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte ) ) } + origin = FirFunctionCallOrigin.OPERATOR } arguments += operatorCall } diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index f5d406389c5..c8e6b022359 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -193,6 +193,7 @@ fun FirExpression.generateContainsOperation( name = OperatorNameConventions.NOT } explicitReceiver = containsCall + origin = FirFunctionCallOrigin.OPERATOR } } @@ -242,6 +243,7 @@ private fun FirExpression.createConventionCall( } explicitReceiver = this@createConventionCall argumentList = buildUnaryArgumentList(argument) + origin = FirFunctionCallOrigin.OPERATOR } } @@ -396,6 +398,7 @@ fun FirPropertyBuilder.generateAccessorsByDelegate( name = PROVIDE_DELEGATE } argumentList = buildBinaryArgumentList(thisRef(forDispatchReceiver = true), propertyRef()) + origin = FirFunctionCallOrigin.OPERATOR } delegate = delegateBuilder.build() if (stubMode) return @@ -421,6 +424,7 @@ fun FirPropertyBuilder.generateAccessorsByDelegate( name = GET_VALUE } argumentList = buildBinaryArgumentList(thisRef(), propertyRef()) + origin = FirFunctionCallOrigin.OPERATOR } target = returnTarget } @@ -473,6 +477,7 @@ fun FirPropertyBuilder.generateAccessorsByDelegate( } } } + origin = FirFunctionCallOrigin.OPERATOR } ) if (annotations != null) { 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 8d4efad8fc1..c40cf8739d7 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 @@ -276,6 +276,8 @@ internal object CheckCallModifiers : CheckerStage() { sink.reportDiagnostic(InfixCallOfNonInfixFunction(functionSymbol)) callInfo.callSite.origin == FirFunctionCallOrigin.OPERATOR && !functionSymbol.fir.isOperator -> sink.reportDiagnostic(OperatorCallOfNonOperatorFunction(functionSymbol)) + callInfo.isImplicitInvoke && !functionSymbol.fir.isOperator -> + sink.reportDiagnostic(OperatorCallOfNonOperatorFunction(functionSymbol)) } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/contracts/ConeConditionalEffectToFirVisitor.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/contracts/ConeConditionalEffectToFirVisitor.kt index 207282cde9d..c024c2d6fcb 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/contracts/ConeConditionalEffectToFirVisitor.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/contracts/ConeConditionalEffectToFirVisitor.kt @@ -51,6 +51,7 @@ private class ConeConditionalEffectToFirVisitor( return buildFunctionCall { calleeReference = buildSimpleNamedReference { name = OperatorNameConventions.NOT } this.explicitReceiver = explicitReceiver + origin = FirFunctionCallOrigin.OPERATOR } } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirImplicitInvokeCallImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirImplicitInvokeCallImpl.kt index f62c1fea9b1..4f1a352defa 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirImplicitInvokeCallImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirImplicitInvokeCallImpl.kt @@ -35,7 +35,7 @@ internal class FirImplicitInvokeCallImpl( override var calleeReference: FirNamedReference, ) : FirImplicitInvokeCall() { override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) - override val origin: FirFunctionCallOrigin = FirFunctionCallOrigin.REGULAR + override val origin: FirFunctionCallOrigin = FirFunctionCallOrigin.OPERATOR override fun acceptChildren(visitor: FirVisitor, data: D) { typeRef.accept(visitor, data) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 87fcb2e69f4..ca9ba3c00db 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -153,16 +153,12 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() kind = OpenClass } - fun ImplementationContext.defaultFunctionOrigin() { - default("origin", "FirFunctionCallOrigin.REGULAR") - } - impl(implicitInvokeCall) { - defaultFunctionOrigin() + default("origin", "FirFunctionCallOrigin.OPERATOR") } impl(componentCall) { - defaultFunctionOrigin() + default("origin", "FirFunctionCallOrigin.REGULAR") } impl(qualifiedAccessExpression) diff --git a/compiler/testData/diagnostics/tests/Operators.fir.kt b/compiler/testData/diagnostics/tests/Operators.fir.kt index 6a3cfcde7eb..2afea5cb2d6 100644 --- a/compiler/testData/diagnostics/tests/Operators.fir.kt +++ b/compiler/testData/diagnostics/tests/Operators.fir.kt @@ -53,10 +53,10 @@ fun test() { a + b a - b - a[1] + a[1] a["str"] - a[1] = "A" + a[1] = "A" a["str"] = "str" a.plus(b) @@ -73,25 +73,25 @@ fun test() { Example()..Example() Example2()..Example2() - a < b - a >= b + a < b + a >= b c > d - a in b + a in b c in d - a++ - a-- + a++ + a-- c++ c-- - !a + !a !c - a() + a() c() - Example()() + Example()() Example2()() } diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/disallowImplInTypeParameter.fir.kt b/compiler/testData/diagnostics/tests/delegatedProperty/disallowImplInTypeParameter.fir.kt deleted file mode 100644 index 6c6e19266f8..00000000000 --- a/compiler/testData/diagnostics/tests/delegatedProperty/disallowImplInTypeParameter.fir.kt +++ /dev/null @@ -1,7 +0,0 @@ -import kotlin.reflect.KProperty0 - -val a: Int by A() - -class A { - fun getValue(t: Any?, p: KProperty0<*>): Int = 1 -} diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/disallowImplInTypeParameter.kt b/compiler/testData/diagnostics/tests/delegatedProperty/disallowImplInTypeParameter.kt index 9b320bd7f82..dbae38eee33 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/disallowImplInTypeParameter.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/disallowImplInTypeParameter.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL import kotlin.reflect.KProperty0 val a: Int by A() diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/noOperatorModifierOnProvideDelegate.fir.kt b/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/noOperatorModifierOnProvideDelegate.fir.kt index 5f1e4692894..6cc2b6c2221 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/noOperatorModifierOnProvideDelegate.fir.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/provideDelegate/noOperatorModifierOnProvideDelegate.fir.kt @@ -13,6 +13,6 @@ fun String.provideDelegate(a: Any?, p: KProperty<*>) = StringDelegate(this) operator fun String.getValue(a: Any?, p: KProperty<*>) = this val test1: String by "OK" -val test2: Int by "OK" +val test2: Int by "OK" val test3 by "OK" diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/irrelevantImplMutableListKotlin.fir.kt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/irrelevantImplMutableListKotlin.fir.kt index 502a18f78b9..394926bd709 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/irrelevantImplMutableListKotlin.fir.kt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/irrelevantImplMutableListKotlin.fir.kt @@ -99,7 +99,8 @@ public class A extends AImpl implements List { fun main() { val x = X() - x[0] + //todo get only one candidate - AImpl.get, no kotlin.collection.List for some reason + x[0] x.size x.remove("") x.remove(1) diff --git a/compiler/testData/diagnostics/tests/modifiers/operatorInfix/Simple.fir.kt b/compiler/testData/diagnostics/tests/modifiers/operatorInfix/Simple.fir.kt index 4ac6682ba1d..a926b463753 100644 --- a/compiler/testData/diagnostics/tests/modifiers/operatorInfix/Simple.fir.kt +++ b/compiler/testData/diagnostics/tests/modifiers/operatorInfix/Simple.fir.kt @@ -28,18 +28,18 @@ fun test() { var a = Example() val b = Example() - consumeString(a()) - consumeString(a[1]) + consumeString(a()) + consumeString(a[1]) val (x, y) = Example() consumeString(x) consumeString(y) - consumeExample2(++a) + consumeExample2(++a) consumeString(a plus b) } fun consumeInt(i: Int) {} fun consumeString(s: String) {} -fun consumeExample2(e: Example2) {} \ No newline at end of file +fun consumeExample2(e: Example2) {} diff --git a/compiler/testData/diagnostics/tests/operatorsOverloading/kt11300.fir.kt b/compiler/testData/diagnostics/tests/operatorsOverloading/kt11300.fir.kt index b09a1166905..0d1ef4a52ad 100644 --- a/compiler/testData/diagnostics/tests/operatorsOverloading/kt11300.fir.kt +++ b/compiler/testData/diagnostics/tests/operatorsOverloading/kt11300.fir.kt @@ -7,7 +7,9 @@ class A { fun main() { val a = A() - a[1]++ - a[1] += 3 - a[1] = a[1] + 3 + a[1]++ + //fir prefers plusAssign call if neither get+set nor plusAssign resolverd + //hence UNRESOLVED_REFERENCE here + a[1] += 3 + a[1] = a[1] + 3 } diff --git a/compiler/testData/diagnostics/tests/regressions/kt26303.fir.kt b/compiler/testData/diagnostics/tests/regressions/kt26303.fir.kt deleted file mode 100644 index 22954d9768e..00000000000 --- a/compiler/testData/diagnostics/tests/regressions/kt26303.fir.kt +++ /dev/null @@ -1,18 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_PARAMETER -// FILE: a.kt - -package foo - -operator fun Int.invoke() = null -fun Int.foo() = null - -// FILE: b.kt - -package bar - -import foo.foo as invoke -import foo.invoke - -fun main(args: Array) { - 42() -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/regressions/kt26303.kt b/compiler/testData/diagnostics/tests/regressions/kt26303.kt index 6bf3c46aaa5..468af16b5d8 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt26303.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt26303.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER // FILE: a.kt diff --git a/compiler/testData/diagnostics/tests/resolve/invoke/errors/ambiguityForInvoke.fir.kt b/compiler/testData/diagnostics/tests/resolve/invoke/errors/ambiguityForInvoke.fir.kt index 67eacd217bc..dd8b318e300 100644 --- a/compiler/testData/diagnostics/tests/resolve/invoke/errors/ambiguityForInvoke.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/invoke/errors/ambiguityForInvoke.fir.kt @@ -5,7 +5,7 @@ fun Int.invoke(i: Int, a: Any) {} fun Int.invoke(a: Any, i: Int) {} fun foo(i: Int) { - i(1, 1) + i(1, 1) - 5(1, 2) + 5(1, 2) }