From 19aff81b551a3dba63f9727d1e0d0312b0953db1 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 18 Nov 2019 15:13:35 +0300 Subject: [PATCH] FIR tower resolve: make static members accessible from derived classes --- .../scopes/JavaClassUseSiteMemberScope.kt | 2 +- .../kotlin/fir/resolve/calls/TowerLevels.kt | 25 +++++++++++++------ .../j+k/StaticFromBaseClass.kt} | 6 ++--- .../j+k/StaticFromBaseClass.txt} | 2 +- .../fir/FirDiagnosticsTestGenerated.java | 5 ---- ...FirDiagnosticsWithStdlibTestGenerated.java | 5 ++++ 6 files changed, 27 insertions(+), 18 deletions(-) rename compiler/fir/resolve/testData/resolve/{problems/superTypeStaticScope.kt => stdlib/j+k/StaticFromBaseClass.kt} (66%) rename compiler/fir/resolve/testData/resolve/{problems/superTypeStaticScope.txt => stdlib/j+k/StaticFromBaseClass.txt} (62%) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index 82ec3fb996c..1339715d448 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -91,7 +91,7 @@ class JavaClassUseSiteMemberScope( return superTypesScope.processPropertiesByName(propertyName) { val firCallableMember = it.fir as? FirCallableMemberDeclaration<*> if (firCallableMember?.isStatic == true) { - NEXT + processor(it) } else { val overriddenBy = it.getOverridden(overrideCandidates) if (overriddenBy == null && it is FirVariableSymbol<*>) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevels.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevels.kt index fa8391d2a6b..132480ea9b4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevels.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/TowerLevels.kt @@ -221,15 +221,24 @@ class QualifiedReceiverTowerLevel( processor: TowerScopeLevel.TowerScopeLevelProcessor ): ProcessorAction { val qualifiedReceiver = explicitReceiver?.explicitReceiverExpression as FirResolvedQualifier - val scope = FirExplicitSimpleImportingScope( - listOf( - FirResolvedImportImpl( - FirImportImpl(null, FqName.topLevel(name), false, null), - qualifiedReceiver.packageFqName, - qualifiedReceiver.relativeClassFqName + val classId = qualifiedReceiver.classId + val scope = when { + token == TowerScopeLevel.Token.Objects || classId == null -> { + FirExplicitSimpleImportingScope( + listOf( + FirResolvedImportImpl( + FirImportImpl(null, FqName.topLevel(name), false, null), + qualifiedReceiver.packageFqName, + qualifiedReceiver.relativeClassFqName + ) + ), session, bodyResolveComponents.scopeSession ) - ), session, bodyResolveComponents.scopeSession - ) + } + else -> { + session.firSymbolProvider.getClassUseSiteMemberScope(classId, session, bodyResolveComponents.scopeSession) + ?: return ProcessorAction.NEXT + } + } val processorForCallables: (FirCallableSymbol<*>) -> ProcessorAction = { val fir = it.fir diff --git a/compiler/fir/resolve/testData/resolve/problems/superTypeStaticScope.kt b/compiler/fir/resolve/testData/resolve/stdlib/j+k/StaticFromBaseClass.kt similarity index 66% rename from compiler/fir/resolve/testData/resolve/problems/superTypeStaticScope.kt rename to compiler/fir/resolve/testData/resolve/stdlib/j+k/StaticFromBaseClass.kt index e5ef8f6e99b..6e67ef11e08 100644 --- a/compiler/fir/resolve/testData/resolve/problems/superTypeStaticScope.kt +++ b/compiler/fir/resolve/testData/resolve/stdlib/j+k/StaticFromBaseClass.kt @@ -5,8 +5,8 @@ // FILE: CommonDataKeys.java public class CommonDataKeys { - public static final String PROJECT = "project"; - public final String MEMBER = "member" + public static final String PROJECT = "project"; + public final String MEMBER = "member" } // FILE: PlatformDataKeys.java @@ -18,6 +18,6 @@ public class PlatformDataKeys extends CommonDataKeys { // FILE: main.kt fun test() { - val project = PlatformDataKeys.PROJECT + val project = PlatformDataKeys.PROJECT val member = PlatformDataKeys().MEMBER } \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/problems/superTypeStaticScope.txt b/compiler/fir/resolve/testData/resolve/stdlib/j+k/StaticFromBaseClass.txt similarity index 62% rename from compiler/fir/resolve/testData/resolve/problems/superTypeStaticScope.txt rename to compiler/fir/resolve/testData/resolve/stdlib/j+k/StaticFromBaseClass.txt index 1bc631fff8b..4f5ef00241c 100644 --- a/compiler/fir/resolve/testData/resolve/problems/superTypeStaticScope.txt +++ b/compiler/fir/resolve/testData/resolve/stdlib/j+k/StaticFromBaseClass.txt @@ -1,5 +1,5 @@ FILE: main.kt public final fun test(): R|kotlin/Unit| { - lval project: = Q|PlatformDataKeys|.# + lval project: R|ft!| = Q|PlatformDataKeys|.R|/CommonDataKeys.PROJECT| lval member: R|ft!| = R|/PlatformDataKeys.PlatformDataKeys|().R|/CommonDataKeys.MEMBER| } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index 3e869ee3d72..0017467d883 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -858,11 +858,6 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { runTest("compiler/fir/resolve/testData/resolve/problems/propertyFromJavaPlusAssign.kt"); } - @TestMetadata("superTypeStaticScope.kt") - public void testSuperTypeStaticScope() throws Exception { - runTest("compiler/fir/resolve/testData/resolve/problems/superTypeStaticScope.kt"); - } - @TestMetadata("syntheticsVsNormalProperties.kt") public void testSyntheticsVsNormalProperties() throws Exception { runTest("compiler/fir/resolve/testData/resolve/problems/syntheticsVsNormalProperties.kt"); diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java index 1b142c5bf10..3174747a079 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java @@ -466,6 +466,11 @@ public class FirDiagnosticsWithStdlibTestGenerated extends AbstractFirDiagnostic runTest("compiler/fir/resolve/testData/resolve/stdlib/j+k/RawType.kt"); } + @TestMetadata("StaticFromBaseClass.kt") + public void testStaticFromBaseClass() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/stdlib/j+k/StaticFromBaseClass.kt"); + } + @TestMetadata("StaticGenericMethod.kt") public void testStaticGenericMethod() throws Exception { runTest("compiler/fir/resolve/testData/resolve/stdlib/j+k/StaticGenericMethod.kt");