From ab258767f8f94bb2b113066086fa9390c5a905c2 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 18 Apr 2019 10:57:23 +0300 Subject: [PATCH] FIR resolve: add extra test & comments to multiple receiver resolve --- .../kotlin/fir/resolve/calls/CallResolver.kt | 4 +-- .../testData/resolve/expresssions/access.kt | 6 +++++ .../testData/resolve/expresssions/access.txt | 4 +++ .../resolve/expresssions/memberExtension.kt | 15 +++++++++++ .../resolve/expresssions/memberExtension.txt | 26 +++++++++++++++++++ .../fir/FirResolveTestCaseGenerated.java | 5 ++++ 6 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 compiler/fir/resolve/testData/resolve/expresssions/memberExtension.kt create mode 100644 compiler/fir/resolve/testData/resolve/expresssions/memberExtension.txt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt index c6743ce9137..de26e440f82 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt @@ -146,8 +146,8 @@ abstract class SessionBasedTowerLevel(val session: FirSession) : TowerScopeLevel // This is more like "dispatch receiver-based tower level" // Here we always have an explicit or implicit dispatch receiver, and can access members of its scope // (which is separated from currently accessible scope, see below) -// So: dispatch receiver = given explicit or implicit receiver -// So: extension receiver = NONE +// So: dispatch receiver = given explicit or implicit receiver (always present) +// So: extension receiver = either none, if dispatch receiver = explicit receiver, or given explicit receiver, otherwise class MemberScopeTowerLevel( session: FirSession, val dispatchReceiver: ReceiverValue diff --git a/compiler/fir/resolve/testData/resolve/expresssions/access.kt b/compiler/fir/resolve/testData/resolve/expresssions/access.kt index 02f825df9f5..b96a0e0900a 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/access.kt +++ b/compiler/fir/resolve/testData/resolve/expresssions/access.kt @@ -10,15 +10,21 @@ class Foo { class Bar { val x = "" + // NB: unused fun Foo.abc() = x fun bar(): Bar = this + // NB: unused operator fun String.plus(bar: Bar): String { return "" } + // NB! abc() here is resolved to member Foo.abc(), and not to extension member of Bar fun Foo.check() = abc() + bar() + + // NB! + here is resolved to member String.plus (not to extension member above) + fun Foo.check2() = "" + bar() } fun Foo.ext() = x diff --git a/compiler/fir/resolve/testData/resolve/expresssions/access.txt b/compiler/fir/resolve/testData/resolve/expresssions/access.txt index e9b1098b266..e35dd672c48 100644 --- a/compiler/fir/resolve/testData/resolve/expresssions/access.txt +++ b/compiler/fir/resolve/testData/resolve/expresssions/access.txt @@ -40,6 +40,10 @@ FILE: access.kt ^check R|/Foo.abc|().#(R|/bar|()) } + public final fun R|Foo|.check2(): R|kotlin/String| { + ^check2 String().R|kotlin/String.plus|(R|/bar|()) + } + } public final fun R|Foo|.ext(): R|kotlin/Int| { ^ext R|/Foo.x| diff --git a/compiler/fir/resolve/testData/resolve/expresssions/memberExtension.kt b/compiler/fir/resolve/testData/resolve/expresssions/memberExtension.kt new file mode 100644 index 00000000000..9b4f207b9d9 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/memberExtension.kt @@ -0,0 +1,15 @@ +class Foo { + fun bar(arg: Bar) { + arg.foo() + } +} + +fun Bar.foo() {} + +class Bar { + fun Foo.foo() {} + + fun bar(arg: Foo) { + arg.foo() + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/expresssions/memberExtension.txt b/compiler/fir/resolve/testData/resolve/expresssions/memberExtension.txt new file mode 100644 index 00000000000..6fe44208564 --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/expresssions/memberExtension.txt @@ -0,0 +1,26 @@ +FILE: memberExtension.kt + public final class Foo : R|kotlin/Any| { + public constructor(): R|Foo| { + super() + } + + public final fun bar(arg: R|Bar|): R|kotlin/Unit| { + R|/arg|.R|/foo|() + } + + } + public final fun R|Bar|.foo(): R|kotlin/Unit| { + } + public final class Bar : R|kotlin/Any| { + public constructor(): R|Bar| { + super() + } + + public final fun R|Foo|.foo(): R|kotlin/Unit| { + } + + public final fun bar(arg: R|Foo|): R|kotlin/Unit| { + R|/arg|.R|/Bar.foo|() + } + + } 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 dae6d941285..c0e38b21d50 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -222,6 +222,11 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { runTest("compiler/fir/resolve/testData/resolve/expresssions/localImplicitBodies.kt"); } + @TestMetadata("memberExtension.kt") + public void testMemberExtension() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/expresssions/memberExtension.kt"); + } + @TestMetadata("objectVsProperty.kt") public void testObjectVsProperty() throws Exception { runTest("compiler/fir/resolve/testData/resolve/expresssions/objectVsProperty.kt");