diff --git a/compiler/fir/resolve/build.gradle.kts b/compiler/fir/resolve/build.gradle.kts index 617738dde11..23f7a034679 100644 --- a/compiler/fir/resolve/build.gradle.kts +++ b/compiler/fir/resolve/build.gradle.kts @@ -38,6 +38,8 @@ sourceSets { projectTest { workingDir = rootDir + jvmArgs!!.removeIf { it.contains("-Xmx") } + maxHeapSize = "3g" } testsJar() \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt index bd43f572d15..8c77256eb6b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt @@ -29,9 +29,13 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority: B return result } - protected fun lookupSuperTypes(klass: FirRegularClass, lookupInterfaces: Boolean): List { + protected fun lookupSuperTypes( + klass: FirRegularClass, + lookupInterfaces: Boolean, + deep: Boolean + ): List { return mutableListOf().also { - if (lookupInterfaces) klass.symbol.collectSuperTypes(it) + if (lookupInterfaces) klass.symbol.collectSuperTypes(it, deep) else klass.symbol.collectSuperClasses(it) } } @@ -63,21 +67,22 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority: B } } - private fun ConeClassLikeSymbol.collectSuperTypes(list: MutableList) { + private fun ConeClassLikeSymbol.collectSuperTypes(list: MutableList, deep: Boolean) { when (this) { is ConeClassSymbol -> { val superClassTypes = this.superTypes.mapNotNull { it.computePartialExpansion() } list += superClassTypes - superClassTypes.forEach { - if (it !is ConeClassErrorType) { - it.symbol.collectSuperTypes(list) + if (deep) + superClassTypes.forEach { + if (it !is ConeClassErrorType) { + it.symbol.collectSuperTypes(list, deep) + } } - } } is ConeTypeAliasSymbol -> { val expansion = expansionType?.computePartialExpansion() ?: return - expansion.symbol.collectSuperTypes(list) + expansion.symbol.collectSuperTypes(list, deep) } else -> error("?!id:1") } 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 67f3f503928..293c5966873 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 @@ -55,7 +55,7 @@ class FirAccessResolveTransformer : FirAbstractTreeTransformerWithSuperTypes(rev private fun FirRegularClass.buildUseSiteScope(useSiteSession: FirSession = session): FirClassUseSiteScope { val superTypeScope = FirCompositeScope(mutableListOf()) val declaredScope = FirClassDeclaredMemberScope(this, useSiteSession) - lookupSuperTypes(this, lookupInterfaces = true).asReversed() + lookupSuperTypes(this, lookupInterfaces = true, deep = false) .mapNotNullTo(superTypeScope.scopes) { useSiteSuperType -> if (useSiteSuperType is ConeClassErrorType) return@mapNotNullTo null val symbol = useSiteSuperType.symbol diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index ad71a0d5edb..6d1ffc05939 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -63,7 +63,7 @@ open class FirTypeResolveTransformer( return withScopeCleanup { val firProvider = FirProvider.getInstance(regularClass.session) val classId = regularClass.symbol.classId - lookupSuperTypes(regularClass, lookupInterfaces = false).asReversed().mapTo(towerScope.scopes) { + lookupSuperTypes(regularClass, lookupInterfaces = false, deep = true).asReversed().mapTo(towerScope.scopes) { val symbol = it.symbol if (symbol is FirBasedSymbol<*>) { FirNestedClassifierScope(symbol.classId, FirProvider.getInstance(symbol.fir.session)) diff --git a/compiler/fir/resolve/testData/resolve/overrides/three.kt b/compiler/fir/resolve/testData/resolve/overrides/three.kt new file mode 100644 index 00000000000..c904e1f9c2e --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/overrides/three.kt @@ -0,0 +1,22 @@ +abstract class A { + fun foo() {} +} + +interface Y { + fun baz() {} +} + +open class B : A(), Y { + fun bar() { + foo() + baz() + } +} + +class C : B() { + fun test() { + foo() + bar() + baz() + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/overrides/three.txt b/compiler/fir/resolve/testData/resolve/overrides/three.txt new file mode 100644 index 00000000000..12b0e163daa --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/overrides/three.txt @@ -0,0 +1,32 @@ +FILE: three.kt + public abstract class A { + public constructor(): super() + + public final function foo(): R|kotlin/Unit| { + } + + } + public abstract interface Y { + public open function baz(): R|kotlin/Unit| { + } + + } + public open class B : R|A|, R|Y| { + public constructor(): super() + + public final function bar(): R|kotlin/Unit| { + R|/A.foo|() + R|/Y.baz|() + } + + } + public final class C : R|B| { + public constructor(): super() + + public final function test(): R|kotlin/Unit| { + R|/A.foo|() + R|/B.bar|() + R|/Y.baz|() + } + + } 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 c64a96956cc..49df3f9c9e5 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -264,6 +264,11 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { public void testSimpleFakeOverride() throws Exception { runTest("compiler/fir/resolve/testData/resolve/overrides/simpleFakeOverride.kt"); } + + @TestMetadata("three.kt") + public void testThree() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/overrides/three.kt"); + } } @TestMetadata("compiler/fir/resolve/testData/resolve/references") diff --git a/idea/testData/fir/multiModule/mppFakeOverrides/common/common.kt b/idea/testData/fir/multiModule/mppFakeOverrides/common/common.kt new file mode 100644 index 00000000000..1f896a60583 --- /dev/null +++ b/idea/testData/fir/multiModule/mppFakeOverrides/common/common.kt @@ -0,0 +1,10 @@ +expect open class A() { + open fun foo(arg: T) +} +open class B : A() { + // Fake: override fun foo(arg: String) = super.foo(arg) + // Fake (JVM only) (?): override fun bar(arg: String): String = super.bar(arg) +} +open class C : B() { + open fun bar(arg: CharSequence): String = arg.toString() +} \ No newline at end of file diff --git a/idea/testData/fir/multiModule/mppFakeOverrides/common/common.txt b/idea/testData/fir/multiModule/mppFakeOverrides/common/common.txt new file mode 100644 index 00000000000..1f6466c07e4 --- /dev/null +++ b/idea/testData/fir/multiModule/mppFakeOverrides/common/common.txt @@ -0,0 +1,19 @@ +FILE: common.kt + public open expect class A { + public constructor(): super() + + public open function foo(arg: R|T|): R|kotlin/Unit| + + } + public open class B : R|A| { + public constructor(): super|>() + + } + public open class C : R|B| { + public constructor(): super() + + public open function bar(arg: R|kotlin/CharSequence|): R|kotlin/String| { + return@@@bar #.#() + } + + } diff --git a/idea/testData/fir/multiModule/mppFakeOverrides/jvm/jvm.kt b/idea/testData/fir/multiModule/mppFakeOverrides/jvm/jvm.kt new file mode 100644 index 00000000000..68cfec4a931 --- /dev/null +++ b/idea/testData/fir/multiModule/mppFakeOverrides/jvm/jvm.kt @@ -0,0 +1,11 @@ +actual open class A { + actual open fun foo(arg: T) {} + open fun bar(arg: T): T = arg +} +class D : C() { + // Fake: override fun bar(arg: CharSequence): String = super.bar(arg) + fun test() { + foo("") + bar("") + } +} \ No newline at end of file diff --git a/idea/testData/fir/multiModule/mppFakeOverrides/jvm/jvm.txt b/idea/testData/fir/multiModule/mppFakeOverrides/jvm/jvm.txt new file mode 100644 index 00000000000..c9d882403ad --- /dev/null +++ b/idea/testData/fir/multiModule/mppFakeOverrides/jvm/jvm.txt @@ -0,0 +1,21 @@ +FILE: jvm.kt + public open actual class A { + public constructor(): super() + + public open actual function foo(arg: R|T|): R|kotlin/Unit| { + } + + public open function bar(arg: R|T|): R|T| { + return@@@bar # + } + + } + public final class D : R|C| { + public constructor(): super() + + public final function test(): R|kotlin/Unit| { + R|FakeOverride|(String()) + R|FakeOverride|(String()) + } + + } diff --git a/idea/testData/fir/multiModule/mppMembers/jvm/jvm.txt b/idea/testData/fir/multiModule/mppMembers/jvm/jvm.txt index b807a66b8d3..4dc1e2ef687 100644 --- a/idea/testData/fir/multiModule/mppMembers/jvm/jvm.txt +++ b/idea/testData/fir/multiModule/mppMembers/jvm/jvm.txt @@ -13,8 +13,8 @@ FILE: jvm.kt public constructor(): super() public final function test(): R|kotlin/Unit| { - #() - #() + R|/A.foo|() + R|/A.bar|() } } diff --git a/idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.txt b/idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.txt index dc9312e8c42..0fb76c0ec5e 100644 --- a/idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.txt +++ b/idea/testData/fir/multiModule/mppSuperTypes/jvm/jvm.txt @@ -22,7 +22,7 @@ FILE: jvm.kt public constructor(): super() public final function test(): R|kotlin/Unit| { - #() + R|/A.foo|() #() #() } @@ -33,8 +33,8 @@ FILE: jvm.kt public final function test(): R|kotlin/Unit| { R|/A.foo|() - #() - #() + R|/X.bar|() + R|/Y.baz|() } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java index bf4cd9c656e..237bf5d1f22 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java @@ -34,6 +34,11 @@ public class FirMultiModuleResolveTestGenerated extends AbstractFirMultiModuleRe runTest("idea/testData/fir/multiModule/basic/"); } + @TestMetadata("mppFakeOverrides") + public void testMppFakeOverrides() throws Exception { + runTest("idea/testData/fir/multiModule/mppFakeOverrides/"); + } + @TestMetadata("mppMemberType") public void testMppMemberType() throws Exception { runTest("idea/testData/fir/multiModule/mppMemberType/");