From 9f750d30366414c7c3766efb3f60703fae7c76ab Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Tue, 12 Mar 2024 13:19:18 +0100 Subject: [PATCH] [Tests] Reproduce current behavior of operator/infix resolution #KT-66504 #KT-66453 #KT-58260 --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++ ...sticCompilerFE10TestDataTestGenerated.java | 6 ++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 ++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 ++ .../resolve/operatorAndInfixResolve.fir.kt | 80 +++++++++++++++++++ .../tests/resolve/operatorAndInfixResolve.kt | 80 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++ 7 files changed, 190 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.fir.kt create mode 100644 compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 484e3af46e6..d924db68ffd 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -32066,6 +32066,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/resolve/objectLiteralAsArgument.kt"); } + @Test + @TestMetadata("operatorAndInfixResolve.kt") + public void testOperatorAndInfixResolve() { + runTest("compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.kt"); + } + @Test @TestMetadata("parameterAsDefaultValueInLocalFunction.kt") public void testParameterAsDefaultValueInLocalFunction() { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 023c1cc6fc5..4e926eeb716 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -32066,6 +32066,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/resolve/objectLiteralAsArgument.kt"); } + @Test + @TestMetadata("operatorAndInfixResolve.kt") + public void testOperatorAndInfixResolve() { + runTest("compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.kt"); + } + @Test @TestMetadata("parameterAsDefaultValueInLocalFunction.kt") public void testParameterAsDefaultValueInLocalFunction() { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index c3fe05bf190..500ea3e70d2 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -29758,6 +29758,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/resolve/objectLiteralAsArgument.kt"); } + @Test + @TestMetadata("operatorAndInfixResolve.kt") + public void testOperatorAndInfixResolve() { + runTest("compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.kt"); + } + @Test @TestMetadata("parameterAsDefaultValueInLocalFunction.kt") public void testParameterAsDefaultValueInLocalFunction() { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 5ebeadaa289..53d2426d181 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -29770,6 +29770,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/resolve/objectLiteralAsArgument.kt"); } + @Test + @TestMetadata("operatorAndInfixResolve.kt") + public void testOperatorAndInfixResolve() { + runTest("compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.kt"); + } + @Test @TestMetadata("parameterAsDefaultValueInLocalFunction.kt") public void testParameterAsDefaultValueInLocalFunction() { diff --git a/compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.fir.kt b/compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.fir.kt new file mode 100644 index 00000000000..787972dcc39 --- /dev/null +++ b/compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.fir.kt @@ -0,0 +1,80 @@ +// ISSUE: KT-66453 +// WITH_STDLIB +import kotlin.reflect.KProperty + +class X(x: String) { + companion object { + operator fun get(x: String) {} + operator fun get(x: X) = X + operator fun set(x: String, v: String) {} + operator fun unaryPlus() = this + operator fun not() = this + operator fun plus(x: String) {} + operator fun rangeTo(x: String) {} + operator fun contains(x: String) = true + operator fun invoke() {} + operator fun plusAssign(x: String) {} + operator fun compareTo(x: String) = 0 + operator fun iterator() = iterator { } + operator fun getValue(thisRef: Any?, property: KProperty<*>) = "" + + infix fun foo(x: String) {} + } +} + +var Y = "" + +fun test() { + class X(y: Int) + class Y + + X("") + X(1) + + // All the following usages of X must resolve to the local class because it's used + // as receiver. + X.get("") + X[""] + + X.set("", "") + X[""] = "" + X[""] += "" + + X.unaryPlus() + +X + + X.not() + !X + + X.plus("") + X + "" + + X.rangeTo("") + X.."" + + X.contains("") + "" in X + + X.invoke() + X() + + X.plusAssign("") + X += "" + X[X] += "" + + // Must resolve to property + Y = "" + Y += "" + + X.compareTo("") + X > "" + + X.foo("") + X foo "" + + X.interator() + for (x in X) {} + + // It seems it's okay to resolve to outer X because we assign `X` to delegate field where it's not used as receiver + val delegated by X +} diff --git a/compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.kt b/compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.kt new file mode 100644 index 00000000000..df8bfebf062 --- /dev/null +++ b/compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.kt @@ -0,0 +1,80 @@ +// ISSUE: KT-66453 +// WITH_STDLIB +import kotlin.reflect.KProperty + +class X(x: String) { + companion object { + operator fun get(x: String) {} + operator fun get(x: X) = X + operator fun set(x: String, v: String) {} + operator fun unaryPlus() = this + operator fun not() = this + operator fun plus(x: String) {} + operator fun rangeTo(x: String) {} + operator fun contains(x: String) = true + operator fun invoke() {} + operator fun plusAssign(x: String) {} + operator fun compareTo(x: String) = 0 + operator fun iterator() = iterator { } + operator fun getValue(thisRef: Any?, property: KProperty<*>) = "" + + infix fun foo(x: String) {} + } +} + +var Y = "" + +fun test() { + class X(y: Int) + class Y + + X("") + X(1) + + // All the following usages of X must resolve to the local class because it's used + // as receiver. + X.get("") + X[""] + + X.set("", "") + X[""] = "" + X[""] += "" + + X.unaryPlus() + +X + + X.not() + !X + + X.plus("") + X + "" + + X.rangeTo("") + X.."" + + X.contains("") + "" in X + + X.invoke() + X() + + X.plusAssign("") + X += "" + X[X] += "" + + // Must resolve to property + Y = "" + Y += "" + + X.compareTo("") + X > "" + + X.foo("") + X foo "" + + X.interator() + for (x in X) {} + + // It seems it's okay to resolve to outer X because we assign `X` to delegate field where it's not used as receiver + val delegated by X +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 464877eb2a3..a46faf1e2b4 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -32066,6 +32066,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/resolve/objectLiteralAsArgument.kt"); } + @Test + @TestMetadata("operatorAndInfixResolve.kt") + public void testOperatorAndInfixResolve() { + runTest("compiler/testData/diagnostics/tests/resolve/operatorAndInfixResolve.kt"); + } + @Test @TestMetadata("parameterAsDefaultValueInLocalFunction.kt") public void testParameterAsDefaultValueInLocalFunction() {