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 057585073f9..f60052974ba 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 @@ -24300,6 +24300,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/operatorsOverloading/plusAssignOnVarAndCollections.kt"); } + @Test + @TestMetadata("PropertyInvoke.kt") + public void testPropertyInvoke() throws Exception { + runTest("compiler/testData/diagnostics/tests/operatorsOverloading/PropertyInvoke.kt"); + } + @Test @TestMetadata("unresolvedOperator.kt") public void testUnresolvedOperator() throws Exception { 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 0bf89957d17..4459dfa2320 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 @@ -24300,6 +24300,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/operatorsOverloading/plusAssignOnVarAndCollections.kt"); } + @Test + @TestMetadata("PropertyInvoke.kt") + public void testPropertyInvoke() throws Exception { + runTest("compiler/testData/diagnostics/tests/operatorsOverloading/PropertyInvoke.kt"); + } + @Test @TestMetadata("unresolvedOperator.kt") public void testUnresolvedOperator() throws Exception { 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 893e46395ca..ab63b898718 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 @@ -24300,6 +24300,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/operatorsOverloading/plusAssignOnVarAndCollections.kt"); } + @Test + @TestMetadata("PropertyInvoke.kt") + public void testPropertyInvoke() throws Exception { + runTest("compiler/testData/diagnostics/tests/operatorsOverloading/PropertyInvoke.kt"); + } + @Test @TestMetadata("unresolvedOperator.kt") public void testUnresolvedOperator() throws Exception { 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 9ed440dfb39..262e08729cd 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 @@ -24306,6 +24306,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/operatorsOverloading/plusAssignOnVarAndCollections.kt"); } + @Test + @TestMetadata("PropertyInvoke.kt") + public void testPropertyInvoke() throws Exception { + runTest("compiler/testData/diagnostics/tests/operatorsOverloading/PropertyInvoke.kt"); + } + @Test @TestMetadata("unresolvedOperator.kt") public void testUnresolvedOperator() throws Exception { diff --git a/compiler/testData/diagnostics/tests/operatorsOverloading/PropertyInvoke.fir.kt b/compiler/testData/diagnostics/tests/operatorsOverloading/PropertyInvoke.fir.kt new file mode 100644 index 00000000000..a82647a9c1c --- /dev/null +++ b/compiler/testData/diagnostics/tests/operatorsOverloading/PropertyInvoke.fir.kt @@ -0,0 +1,82 @@ +class I { } + +operator fun I.invoke(): E = E() +operator fun I.invoke(x: Int): E = E() +operator fun I.invoke(x: Int, y: Int): E = E() + +// operators over variables + +class A { } +var a = A() + +val A.inc: I get() = I() +fun useInc() { a++ } + +val A.dec: I get() = I() +fun useDec() { a-- } + +val A.plusAssign: I get() = I() +fun usePlusAssign() { a += 1 } + +val A.minusAssign: I get() = I() +fun useMinusAssign() { a -= 1 } + +val A.timesAssign: I get() = I() +fun useTimesAssign() { a *= 1 } + +val A.divAssign: I get() = I() +fun useDivAssign() { a /= 1 } + +val A.remAssign: I get() = I() +fun useRemAssign() { a %= 1 } + +// operators over values + +class E { } +val e = E() + +val E.unaryPlus: I get() = I() +val useUnaryPlus = +e + +val E.unaryMinus: I get() = I() +val useUnaryMinus = -e + +val E.not: I get() = I() +val useNot = !e + +val E.plus: I get() = I() +val usePlus = e + 1 + +val E.minus: I get() = I() +val useMinus = e - 1 + +val E.times: I get() = I() +val useTimes = e * 1 + +val E.div: I get() = I() +val useDiv = e / 1 + +val E.rem: I get() = I() +val useRem = e % 1 + +val E.get: I get() = I() +val useGet = e[1] + +val E.set: I get() = I() +fun useSet() { e[1] = 3 } + +val E.contains: I get() = I() +val useContains = 1 in e +val useNotContains = 1 !in e + +val E.invoke: I get() = I() +val useInvoke = e() + +val E.rangeTo: I get() = I() +val useRangeTo = e .. 3 + +val E.rangeUntil: I get() = I() +val useRangeUntil = e ..< 3 + +val E.compareTo: I get() = I() +val useCompareTo = e > 2 diff --git a/compiler/testData/diagnostics/tests/operatorsOverloading/PropertyInvoke.kt b/compiler/testData/diagnostics/tests/operatorsOverloading/PropertyInvoke.kt new file mode 100644 index 00000000000..ee38390b33d --- /dev/null +++ b/compiler/testData/diagnostics/tests/operatorsOverloading/PropertyInvoke.kt @@ -0,0 +1,82 @@ +class I { } + +operator fun I.invoke(): E = E() +operator fun I.invoke(x: Int): E = E() +operator fun I.invoke(x: Int, y: Int): E = E() + +// operators over variables + +class A { } +var a = A() + +val A.inc: I get() = I() +fun useInc() { a++ } + +val A.dec: I get() = I() +fun useDec() { a-- } + +val A.plusAssign: I get() = I() +fun usePlusAssign() { a += 1 } + +val A.minusAssign: I get() = I() +fun useMinusAssign() { a -= 1 } + +val A.timesAssign: I get() = I() +fun useTimesAssign() { a *= 1 } + +val A.divAssign: I get() = I() +fun useDivAssign() { a /= 1 } + +val A.remAssign: I get() = I() +fun useRemAssign() { a %= 1 } + +// operators over values + +class E { } +val e = E() + +val E.unaryPlus: I get() = I() +val useUnaryPlus = +e + +val E.unaryMinus: I get() = I() +val useUnaryMinus = -e + +val E.not: I get() = I() +val useNot = !e + +val E.plus: I get() = I() +val usePlus = e + 1 + +val E.minus: I get() = I() +val useMinus = e - 1 + +val E.times: I get() = I() +val useTimes = e * 1 + +val E.div: I get() = I() +val useDiv = e / 1 + +val E.rem: I get() = I() +val useRem = e % 1 + +val E.get: I get() = I() +val useGet = e[1] + +val E.set: I get() = I() +fun useSet() { e[1] = 3 } + +val E.contains: I get() = I() +val useContains = 1 in e +val useNotContains = 1 !in e + +val E.invoke: I get() = I() +val useInvoke = e() + +val E.rangeTo: I get() = I() +val useRangeTo = e .. 3 + +val E.rangeUntil: I get() = I() +val useRangeUntil = e ..< 3 + +val E.compareTo: I get() = I() +val useCompareTo = e > 2 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 a8a5c696996..29393e92871 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 @@ -26180,6 +26180,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/operatorsOverloading/plusAssignOnVarAndCollections.kt"); } + @Test + @TestMetadata("PropertyInvoke.kt") + public void testPropertyInvoke() throws Exception { + runTest("compiler/testData/diagnostics/tests/operatorsOverloading/PropertyInvoke.kt"); + } + @Test @TestMetadata("unresolvedOperator.kt") public void testUnresolvedOperator() throws Exception {