From 60f09f6512ea0b1cc1411a731bb29279b97c4bf5 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Thu, 22 Jun 2023 18:37:57 +0200 Subject: [PATCH] K2: Adjust renaming on import for current package with K1 rules Namely, once a file in a package `foo` has import `foo.bar as baz`, auto imported `bar` from the package name becomes inivisible in the file ^KT-54854 Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ ...sticCompilerFE10TestDataTestGenerated.java | 6 ++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 ++++ .../fir/scopes/impl/FirPackageMemberScope.kt | 12 +++++++- .../kotlin/fir/scopes/ImportingScopes.kt | 2 +- .../ImportFromCurrentWithDifferentName.fir.kt | 8 ----- .../ImportFromCurrentWithDifferentName.kt | 1 + ...FromCurrentWithDifferentNameComplex.fir.kt | 29 +++++++++++++++++++ ...portFromCurrentWithDifferentNameComplex.kt | 29 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ 11 files changed, 101 insertions(+), 10 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.fir.kt create mode 100644 compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.fir.kt create mode 100644 compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 4103c4394f6..126890ab10a 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -14202,6 +14202,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.kt"); } + @Test + @TestMetadata("ImportFromCurrentWithDifferentNameComplex.kt") + public void testImportFromCurrentWithDifferentNameComplex() throws Exception { + runTest("compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.kt"); + } + @Test @TestMetadata("ImportFromObject.kt") public void testImportFromObject() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index a5f03aa5cc0..7c9cf917939 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -14202,6 +14202,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.kt"); } + @Test + @TestMetadata("ImportFromCurrentWithDifferentNameComplex.kt") + public void testImportFromCurrentWithDifferentNameComplex() throws Exception { + runTest("compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.kt"); + } + @Test @TestMetadata("ImportFromObject.kt") public void testImportFromObject() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index fd08838af4e..855e8a0874a 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -14202,6 +14202,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.kt"); } + @Test + @TestMetadata("ImportFromCurrentWithDifferentNameComplex.kt") + public void testImportFromCurrentWithDifferentNameComplex() throws Exception { + runTest("compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.kt"); + } + @Test @TestMetadata("ImportFromObject.kt") public void testImportFromObject() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index abc6d958f34..860caccf969 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -14208,6 +14208,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.kt"); } + @Test + @TestMetadata("ImportFromCurrentWithDifferentNameComplex.kt") + public void testImportFromCurrentWithDifferentNameComplex() throws Exception { + runTest("compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.kt"); + } + @Test @TestMetadata("ImportFromObject.kt") public void testImportFromObject() throws Exception { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt index d12c2eab7d0..afa112a3215 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirPackageMemberScope.kt @@ -23,17 +23,23 @@ import org.jetbrains.kotlin.utils.SmartList class FirPackageMemberScope( val fqName: FqName, val session: FirSession, - private val symbolProvider: FirSymbolProvider = session.symbolProvider + private val symbolProvider: FirSymbolProvider = session.symbolProvider, + excludedImportNames: Collection? = null, ) : FirScope() { private val classifierCache: MutableMap?> = mutableMapOf() private val functionCache: MutableMap> = mutableMapOf() private val propertyCache: MutableMap> = mutableMapOf() + private val excludedNames by lazy { + excludedImportNames?.mapNotNullTo(mutableSetOf()) { if (it.parent() == fqName) it.shortName() else null }.orEmpty() + } + override fun processClassifiersByNameWithSubstitution( name: Name, processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit ) { if (name.asString().isEmpty()) return + if (name in excludedNames) return val symbol = classifierCache.getOrPut(name) { val unambiguousFqName = ClassId(fqName, name) @@ -46,6 +52,8 @@ class FirPackageMemberScope( } override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) { + if (name in excludedNames) return + val symbols = functionCache.getOrPut(name) { symbolProvider.getTopLevelFunctionSymbols(fqName, name) } @@ -55,6 +63,8 @@ class FirPackageMemberScope( } override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) { + if (name in excludedNames) return + val symbols = propertyCache.getOrPut(name) { symbolProvider.getTopLevelPropertySymbols(fqName, name) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/ImportingScopes.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/ImportingScopes.kt index e07fdb6bb2b..ca4a5670306 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/ImportingScopes.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/ImportingScopes.kt @@ -61,7 +61,7 @@ private fun doCreateImportingScopes( FirDefaultSimpleImportingScope(session, scopeSession, priority = DefaultImportPriority.HIGH) }, scopeSession.getOrBuild(file.packageFqName, PACKAGE_MEMBER) { - FirPackageMemberScope(file.packageFqName, session) + FirPackageMemberScope(file.packageFqName, session, excludedImportNames = excludedImportNames) }, // TODO: explicit simple importing scope should have highest priority (higher than inner scopes added in process) FirExplicitSimpleImportingScope(file.imports, session, scopeSession) diff --git a/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.fir.kt b/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.fir.kt deleted file mode 100644 index 08d4242283a..00000000000 --- a/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.fir.kt +++ /dev/null @@ -1,8 +0,0 @@ -package a - -import a.A as ER - -interface A { - val a: A - val b: ER -} diff --git a/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.kt b/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.kt index 987118c19c0..2965a19c84d 100644 --- a/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.kt +++ b/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL package a import a.A as ER diff --git a/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.fir.kt b/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.fir.kt new file mode 100644 index 00000000000..693b10961d5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.fir.kt @@ -0,0 +1,29 @@ +// ISSUE: KT-54854 +package a + +import a.A as ER +import a.x as y +import a.foo as bar + +val x: Int = 1 + +fun foo(): Int = 1 + +class A + +interface B { + val a: A + val b: ER +} + +fun main() { + A() + ER() + a.A() + + x + 1 + y + 1 + + foo() + 1 + bar() + 1 +} diff --git a/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.kt b/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.kt new file mode 100644 index 00000000000..18abe579409 --- /dev/null +++ b/compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.kt @@ -0,0 +1,29 @@ +// ISSUE: KT-54854 +package a + +import a.A as ER +import a.x as y +import a.foo as bar + +val x: Int = 1 + +fun foo(): Int = 1 + +class A + +interface B { + val a: A + val b: ER +} + +fun main() { + A() + ER() + a.A() + + x + 1 + y + 1 + + foo() + 1 + bar() + 1 +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 39741b4e2b7..56d2dcce8d9 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -14208,6 +14208,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.kt"); } + @Test + @TestMetadata("ImportFromCurrentWithDifferentNameComplex.kt") + public void testImportFromCurrentWithDifferentNameComplex() throws Exception { + runTest("compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentNameComplex.kt"); + } + @Test @TestMetadata("ImportFromObject.kt") public void testImportFromObject() throws Exception {