From b3c8e83c58893cbfdccf3105148f08d625e5e3f5 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 30 Jan 2019 10:54:27 +0300 Subject: [PATCH] FIR: make override resolve in use-site session (and module) Related to KT-24078 --- .../FirAccessResolveTransformer.kt | 23 +++++++---- .../mppMemberType/common/common.kt | 5 +++ .../mppMemberType/common/common.txt | 14 +++++++ .../fir/multiModule/mppMemberType/jvm/jvm.kt | 26 ++++++++++++ .../fir/multiModule/mppMemberType/jvm/jvm.txt | 34 ++++++++++++++++ .../fir/multiModule/mppMembers/jvm/jvm.txt | 2 +- .../mppSuperTypes/common/common.kt | 5 +++ .../mppSuperTypes/common/common.txt | 11 +++++ .../fir/multiModule/mppSuperTypes/jvm/jvm.kt | 30 ++++++++++++++ .../fir/multiModule/mppSuperTypes/jvm/jvm.txt | 40 +++++++++++++++++++ .../FirMultiModuleResolveTestGenerated.java | 10 +++++ 11 files changed, 191 insertions(+), 9 deletions(-) create mode 100644 idea/testData/fir/multiModule/mppMemberType/common/common.kt create mode 100644 idea/testData/fir/multiModule/mppMemberType/common/common.txt create mode 100644 idea/testData/fir/multiModule/mppMemberType/jvm/jvm.kt create mode 100644 idea/testData/fir/multiModule/mppMemberType/jvm/jvm.txt create mode 100644 idea/testData/fir/multiModule/mppSuperTypes/common/common.kt create mode 100644 idea/testData/fir/multiModule/mppSuperTypes/common/common.txt create mode 100644 idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.kt create mode 100644 idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.txt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAccessResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAccessResolveTransformer.kt index 67c3fc60610..1f97194f04d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAccessResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAccessResolveTransformer.kt @@ -12,11 +12,16 @@ import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl +import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.scopes.FirPosition import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope import org.jetbrains.kotlin.fir.scopes.impl.FirTopLevelDeclaredMemberScope import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol +import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol +import org.jetbrains.kotlin.fir.types.impl.ConeAbbreviatedTypeImpl +import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.compose @@ -31,15 +36,17 @@ class FirAccessResolveTransformer : FirAbstractTreeTransformerWithSuperTypes(rev override fun transformRegularClass(regularClass: FirRegularClass, data: Nothing?): CompositeTransformResult { return withScopeCleanup { - lookupSuperTypes(regularClass).asReversed().mapNotNullTo(towerScope.scopes) { - val symbol = it.symbol - if (symbol is FirClassSymbol) { - FirClassDeclaredMemberScope(symbol.fir, symbol.fir.session) - } else { - null + val useSiteSession = regularClass.session + lookupSuperTypes(regularClass).asReversed() + .mapNotNullTo(towerScope.scopes) { useSiteSuperType -> + val symbol = useSiteSuperType.symbol + if (symbol is FirClassSymbol) { + FirClassDeclaredMemberScope(symbol.fir, useSiteSession) + } else { + null + } } - } - towerScope.scopes += FirClassDeclaredMemberScope(regularClass, regularClass.session) + towerScope.scopes += FirClassDeclaredMemberScope(regularClass, useSiteSession) super.transformRegularClass(regularClass, data) } } diff --git a/idea/testData/fir/multiModule/mppMemberType/common/common.kt b/idea/testData/fir/multiModule/mppMemberType/common/common.kt new file mode 100644 index 00000000000..13847ba8b16 --- /dev/null +++ b/idea/testData/fir/multiModule/mppMemberType/common/common.kt @@ -0,0 +1,5 @@ +expect class MyList { + fun get(i: Int): Int +} + +open class Wrapper(val list: MyList) \ No newline at end of file diff --git a/idea/testData/fir/multiModule/mppMemberType/common/common.txt b/idea/testData/fir/multiModule/mppMemberType/common/common.txt new file mode 100644 index 00000000000..b34bfbd9e81 --- /dev/null +++ b/idea/testData/fir/multiModule/mppMemberType/common/common.txt @@ -0,0 +1,14 @@ +FILE: common.kt + public final expect class MyList { + public constructor(): super() + + public final function get(i: R|kotlin/Int|): R|kotlin/Int| + + } + public open class Wrapper { + public constructor(list: R|MyList|): super() + + public final property list(val): R|MyList| + public get(): R|MyList| + + } diff --git a/idea/testData/fir/multiModule/mppMemberType/jvm/jvm.kt b/idea/testData/fir/multiModule/mppMemberType/jvm/jvm.kt new file mode 100644 index 00000000000..e8fc2000f4e --- /dev/null +++ b/idea/testData/fir/multiModule/mppMemberType/jvm/jvm.kt @@ -0,0 +1,26 @@ +actual class MyList { + actual fun get(i: Int): Int = i + + fun set(i: Int, v: Int) {} +} + +class DerivedList : MyList() { + fun useMember() { + get(1) + set(2, 3) + } +} + +fun useList(list: MyList) { + // We should deal with receiver to resolve this + list.get(1) + list.set(2, 3) +} + +class DerivedWrapper : Wrapper() { + fun use() { + // We should deal with receiver to resolve this + list.get(1) + list.set(2, 3) + } +} \ No newline at end of file diff --git a/idea/testData/fir/multiModule/mppMemberType/jvm/jvm.txt b/idea/testData/fir/multiModule/mppMemberType/jvm/jvm.txt new file mode 100644 index 00000000000..e9a987049ba --- /dev/null +++ b/idea/testData/fir/multiModule/mppMemberType/jvm/jvm.txt @@ -0,0 +1,34 @@ +FILE: jvm.kt + public final actual class MyList { + public constructor(): super() + + public final actual function get(i: R|kotlin/Int|): R|kotlin/Int| { + return@@@get # + } + + public final function set(i: R|kotlin/Int|, v: R|kotlin/Int|): R|kotlin/Unit| { + } + + } + public final class DerivedList : R|MyList| { + public constructor(): super() + + public final function useMember(): R|kotlin/Unit| { + R|/MyList.get|(Int(1)) + R|/MyList.set|(Int(2), Int(3)) + } + + } + public final function useList(list: R|MyList|): R|kotlin/Unit| { + #.#(Int(1)) + #.#(Int(2), Int(3)) + } + public final class DerivedWrapper : R|Wrapper| { + public constructor(): super() + + public final function use(): R|kotlin/Unit| { + #.#(Int(1)) + #.#(Int(2), Int(3)) + } + + } diff --git a/idea/testData/fir/multiModule/mppMembers/jvm/jvm.txt b/idea/testData/fir/multiModule/mppMembers/jvm/jvm.txt index 3d369922587..4dc1e2ef687 100644 --- a/idea/testData/fir/multiModule/mppMembers/jvm/jvm.txt +++ b/idea/testData/fir/multiModule/mppMembers/jvm/jvm.txt @@ -14,7 +14,7 @@ FILE: jvm.kt public final function test(): R|kotlin/Unit| { R|/A.foo|() - #() + R|/A.bar|() } } diff --git a/idea/testData/fir/multiModule/mppSuperTypes/common/common.kt b/idea/testData/fir/multiModule/mppSuperTypes/common/common.kt new file mode 100644 index 00000000000..8d04bbe4141 --- /dev/null +++ b/idea/testData/fir/multiModule/mppSuperTypes/common/common.kt @@ -0,0 +1,5 @@ +expect open class A() { + fun foo() +} + +open class B : A() \ No newline at end of file diff --git a/idea/testData/fir/multiModule/mppSuperTypes/common/common.txt b/idea/testData/fir/multiModule/mppSuperTypes/common/common.txt new file mode 100644 index 00000000000..5012d250b47 --- /dev/null +++ b/idea/testData/fir/multiModule/mppSuperTypes/common/common.txt @@ -0,0 +1,11 @@ +FILE: common.kt + public open expect class A { + public constructor(): super() + + public final function foo(): R|kotlin/Unit| + + } + public open class B : R|A| { + public constructor(): super() + + } diff --git a/idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.kt b/idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.kt new file mode 100644 index 00000000000..19c6b639ff0 --- /dev/null +++ b/idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.kt @@ -0,0 +1,30 @@ +abstract class X { + fun bar() {} +} + +interface Y { + fun baz() {} +} + +actual open class A : X(), Y { + actual fun foo() {} +} + +class C : B() { + fun test() { + foo() + // This cannot be resolved yet due to lack of search symbols / projections + bar() + // This cannot be resolved yet due to lack of interface lookup + baz() + } +} + +class D : A() { + fun test() { + foo() + bar() + // This cannot be resolved yet due to lack of interface lookup + baz() + } +} \ No newline at end of file diff --git a/idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.txt b/idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.txt new file mode 100644 index 00000000000..8f6292a4c4d --- /dev/null +++ b/idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.txt @@ -0,0 +1,40 @@ +FILE: jvm.kt + public abstract class X { + public constructor(): super() + + public final function bar(): R|kotlin/Unit| { + } + + } + public abstract interface Y { + public open function baz(): R|kotlin/Unit| { + } + + } + public open actual class A : R|X|, R|Y| { + public constructor(): super() + + public final actual function foo(): R|kotlin/Unit| { + } + + } + public final class C : R|B| { + public constructor(): super() + + public final function test(): R|kotlin/Unit| { + R|/A.foo|() + #() + #() + } + + } + public final class D : R|A| { + public constructor(): super() + + public final function test(): R|kotlin/Unit| { + R|/A.foo|() + R|/X.bar|() + #() + } + + } diff --git a/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java index a2c4267168e..bf4cd9c656e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java @@ -34,8 +34,18 @@ public class FirMultiModuleResolveTestGenerated extends AbstractFirMultiModuleRe runTest("idea/testData/fir/multiModule/basic/"); } + @TestMetadata("mppMemberType") + public void testMppMemberType() throws Exception { + runTest("idea/testData/fir/multiModule/mppMemberType/"); + } + @TestMetadata("mppMembers") public void testMppMembers() throws Exception { runTest("idea/testData/fir/multiModule/mppMembers/"); } + + @TestMetadata("mppSuperTypes") + public void testMppSuperTypes() throws Exception { + runTest("idea/testData/fir/multiModule/mppSuperTypes/"); + } }