diff --git a/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver.kt b/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver.kt new file mode 100644 index 00000000000..5f564cf8579 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver.kt @@ -0,0 +1,13 @@ + +fun x() { + +} + +class Foo { + + val x: Foo = Foo() + + operator fun invoke(): Foo { return this } + + fun bar() = x() // Should resolve to invoke +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver.txt b/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver.txt new file mode 100644 index 00000000000..4c0d0fb1b92 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver.txt @@ -0,0 +1,18 @@ +FILE: explicitReceiver.kt + public final function x(): R|kotlin/Unit| { + } + public final class Foo { + public constructor(): super() + + public final property x(val): R|Foo| = #() + public get(): R|Foo| + + public final operator function invoke(): R|Foo| { + return@@@invoke this# + } + + public final function bar(): R|Foo| { + return@@@bar R|/Foo.x|.R|/Foo.invoke|() + } + + } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver2.kt b/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver2.kt new file mode 100644 index 00000000000..dd7c6d005df --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver2.kt @@ -0,0 +1,19 @@ + +class Bar { + operator fun invoke(): Foo { return this } + +} + +fun x() { + +} + +class Foo { + + + operator fun Bar.invoke(): Foo { return this } + + val x: Bar = Bar() + + fun bar() = x() // Should resolve to invoke +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver2.txt b/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver2.txt new file mode 100644 index 00000000000..0d5587e821b --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver2.txt @@ -0,0 +1,26 @@ +FILE: explicitReceiver2.kt + public final class Bar { + public constructor(): super() + + public final operator function invoke(): R|Foo| { + return@@@invoke this# + } + + } + public final function x(): R|kotlin/Unit| { + } + public final class Foo { + public constructor(): super() + + public final operator function invoke R|Bar|.(): R|Foo| { + return@@@invoke this# + } + + public final property x(val): R|Bar| = #() + public get(): R|Bar| + + public final function bar(): R|Foo| { + return@@@bar R|/Foo.x|.R|/Bar.invoke|() + } + + } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/invoke/extension.kt b/compiler/fir/resolve/testData/resolve/expresssions/invoke/extension.kt new file mode 100644 index 00000000000..2c22274f0aa --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/invoke/extension.kt @@ -0,0 +1,11 @@ + + +fun x() {} + +class Foo { + operator fun Int.invoke(): Foo = this@Foo + + val x = 0 + + fun foo() = x() +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/expresssions/invoke/extension.txt b/compiler/fir/resolve/testData/resolve/expresssions/invoke/extension.txt new file mode 100644 index 00000000000..c3fc324e010 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/invoke/extension.txt @@ -0,0 +1,18 @@ +FILE: extension.kt + public final function x(): R|kotlin/Unit| { + } + public final class Foo { + public constructor(): super() + + public final operator function invoke R|kotlin/Int|.(): R|Foo| { + return@@@invoke this@Foo + } + + public final property x(val): R|kotlin/Int| = Int(0) + public get(): + + public final function foo(): R|Foo| { + return@@@foo R|/Foo.x|.R|/Foo.invoke|() + } + + } diff --git a/compiler/fir/resolve/testData/resolve/expresssions/invoke/farInvokeExtension.kt b/compiler/fir/resolve/testData/resolve/expresssions/invoke/farInvokeExtension.kt new file mode 100644 index 00000000000..eaf10f06d4c --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/invoke/farInvokeExtension.kt @@ -0,0 +1,12 @@ + + +fun x() {} + +operator fun Int.invoke(): Foo = this@Foo + +class Foo { + + val x = 0 + + fun foo() = x() +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/expresssions/invoke/farInvokeExtension.txt b/compiler/fir/resolve/testData/resolve/expresssions/invoke/farInvokeExtension.txt new file mode 100644 index 00000000000..e476a04e556 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/invoke/farInvokeExtension.txt @@ -0,0 +1,17 @@ +FILE: farInvokeExtension.kt + public final function x(): R|kotlin/Unit| { + } + public final operator function invoke R|kotlin/Int|.(): R|Foo| { + return@@@invoke this@Foo + } + public final class Foo { + public constructor(): super() + + public final property x(val): R|kotlin/Int| = Int(0) + public get(): + + public final function foo(): R|kotlin/Unit| { + return@@@foo R|/x|() + } + + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index ebcd1d3b291..b9be58bfca1 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -168,6 +168,39 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { public void testWhen() throws Exception { runTest("compiler/fir/resolve/testData/resolve/expresssions/when.kt"); } + + @TestMetadata("compiler/fir/resolve/testData/resolve/expresssions/invoke") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Invoke extends AbstractFirResolveTestCase { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInInvoke() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/fir/resolve/testData/resolve/expresssions/invoke"), Pattern.compile("^([^.]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("explicitReceiver.kt") + public void testExplicitReceiver() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver.kt"); + } + + @TestMetadata("explicitReceiver2.kt") + public void testExplicitReceiver2() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/expresssions/invoke/explicitReceiver2.kt"); + } + + @TestMetadata("extension.kt") + public void testExtension() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/expresssions/invoke/extension.kt"); + } + + @TestMetadata("farInvokeExtension.kt") + public void testFarInvokeExtension() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/expresssions/invoke/farInvokeExtension.kt"); + } + } } @TestMetadata("compiler/fir/resolve/testData/resolve/fromBuilder")