From 5e30adec06acccb2b6f049d0e869bad1525ad8da Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Wed, 19 Jul 2023 11:21:42 +0200 Subject: [PATCH] KTIJ-26276 [Analysis API] Do not consider single aliased import from the same package as unused Even when the aliased import comes from the same package, it cannot be removed, because it will break the code Also, add more tests for the imports coming from the same package ^KTIJ-26276 Fixed --- ...alysisApiImportOptimizerTestGenerated.java | 24 +++++++++++++++++++ .../fir/components/KtFirImportOptimizer.kt | 6 +++-- ...alysisApiImportOptimizerTestGenerated.java | 24 +++++++++++++++++++ ...alysisApiImportOptimizerTestGenerated.java | 24 +++++++++++++++++++ ...unusedAliasedImportFromSamePackage.imports | 2 ++ .../unusedAliasedImportFromSamePackage.kt | 12 ++++++++++ .../unusedImportsFromSamePackage.imports | 2 ++ .../unusedImportsFromSamePackage.kt | 17 +++++++++++++ ...edAndRegularImportsFromSamePackage.imports | 0 ...AliasedAndRegularImportsFromSamePackage.kt | 20 ++++++++++++++++ .../usedAliasedImportsFromSamePackage.imports | 0 .../usedAliasedImportsFromSamePackage.kt | 16 +++++++++++++ 12 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedAliasedImportFromSamePackage.imports create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedAliasedImportFromSamePackage.kt create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportsFromSamePackage.imports create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportsFromSamePackage.kt create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedAndRegularImportsFromSamePackage.imports create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedAndRegularImportsFromSamePackage.kt create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedImportsFromSamePackage.imports create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedImportsFromSamePackage.kt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/importOptimizer/Fe10IdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/importOptimizer/Fe10IdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java index 5f151d5cbe6..037feb30558 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/importOptimizer/Fe10IdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/importOptimizer/Fe10IdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java @@ -52,6 +52,12 @@ public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGene runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.kt"); } + @Test + @TestMetadata("unusedAliasedImportFromSamePackage.kt") + public void testUnusedAliasedImportFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedAliasedImportFromSamePackage.kt"); + } + @Test @TestMetadata("unusedAliasedTypeImport.kt") public void testUnusedAliasedTypeImport() throws Exception { @@ -94,6 +100,12 @@ public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGene runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportFromObject.kt"); } + @Test + @TestMetadata("unusedImportsFromSamePackage.kt") + public void testUnusedImportsFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportsFromSamePackage.kt"); + } + @Test @TestMetadata("unusedInvokeOperatorImport.kt") public void testUnusedInvokeOperatorImport() throws Exception { @@ -106,12 +118,24 @@ public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGene runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedStaticFunctionImportFromJavaChildClass.kt"); } + @Test + @TestMetadata("usedAliasedAndRegularImportsFromSamePackage.kt") + public void testUsedAliasedAndRegularImportsFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedAndRegularImportsFromSamePackage.kt"); + } + @Test @TestMetadata("usedAliasedFunctionReference.kt") public void testUsedAliasedFunctionReference() throws Exception { runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedFunctionReference.kt"); } + @Test + @TestMetadata("usedAliasedImportsFromSamePackage.kt") + public void testUsedAliasedImportsFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedImportsFromSamePackage.kt"); + } + @Test @TestMetadata("usedAliasedTypeImport.kt") public void testUsedAliasedTypeImport() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt index 78dedfcbe91..fc271ca5963 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirImportOptimizer.kt @@ -67,8 +67,10 @@ internal class KtFirImportOptimizer( val referencesEntities = usedImports .filterNot { (fqName, referencedByNames) -> - // when referenced by more than one name, we need to keep the imports with same package - fqName.parentOrNull() == file.packageFqName && referencedByNames.size == 1 + val fromCurrentPackage = fqName.parentOrNull() == file.packageFqName + val noAliasedImports = referencedByNames.singleOrNull() == fqName.shortName() + + fromCurrentPackage && noAliasedImports } val requiredStarImports = referencesEntities.keys diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java index cf48682b435..456f3ca0767 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java @@ -52,6 +52,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.kt"); } + @Test + @TestMetadata("unusedAliasedImportFromSamePackage.kt") + public void testUnusedAliasedImportFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedAliasedImportFromSamePackage.kt"); + } + @Test @TestMetadata("unusedAliasedTypeImport.kt") public void testUnusedAliasedTypeImport() throws Exception { @@ -94,6 +100,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportFromObject.kt"); } + @Test + @TestMetadata("unusedImportsFromSamePackage.kt") + public void testUnusedImportsFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportsFromSamePackage.kt"); + } + @Test @TestMetadata("unusedInvokeOperatorImport.kt") public void testUnusedInvokeOperatorImport() throws Exception { @@ -106,12 +118,24 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedStaticFunctionImportFromJavaChildClass.kt"); } + @Test + @TestMetadata("usedAliasedAndRegularImportsFromSamePackage.kt") + public void testUsedAliasedAndRegularImportsFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedAndRegularImportsFromSamePackage.kt"); + } + @Test @TestMetadata("usedAliasedFunctionReference.kt") public void testUsedAliasedFunctionReference() throws Exception { runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedFunctionReference.kt"); } + @Test + @TestMetadata("usedAliasedImportsFromSamePackage.kt") + public void testUsedAliasedImportsFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedImportsFromSamePackage.kt"); + } + @Test @TestMetadata("usedAliasedTypeImport.kt") public void testUsedAliasedTypeImport() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java index b0aae99cc51..401b8759bda 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java @@ -52,6 +52,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.kt"); } + @Test + @TestMetadata("unusedAliasedImportFromSamePackage.kt") + public void testUnusedAliasedImportFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedAliasedImportFromSamePackage.kt"); + } + @Test @TestMetadata("unusedAliasedTypeImport.kt") public void testUnusedAliasedTypeImport() throws Exception { @@ -94,6 +100,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportFromObject.kt"); } + @Test + @TestMetadata("unusedImportsFromSamePackage.kt") + public void testUnusedImportsFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportsFromSamePackage.kt"); + } + @Test @TestMetadata("unusedInvokeOperatorImport.kt") public void testUnusedInvokeOperatorImport() throws Exception { @@ -106,12 +118,24 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedStaticFunctionImportFromJavaChildClass.kt"); } + @Test + @TestMetadata("usedAliasedAndRegularImportsFromSamePackage.kt") + public void testUsedAliasedAndRegularImportsFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedAndRegularImportsFromSamePackage.kt"); + } + @Test @TestMetadata("usedAliasedFunctionReference.kt") public void testUsedAliasedFunctionReference() throws Exception { runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedFunctionReference.kt"); } + @Test + @TestMetadata("usedAliasedImportsFromSamePackage.kt") + public void testUsedAliasedImportsFromSamePackage() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedImportsFromSamePackage.kt"); + } + @Test @TestMetadata("usedAliasedTypeImport.kt") public void testUsedAliasedTypeImport() throws Exception { diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedAliasedImportFromSamePackage.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedAliasedImportFromSamePackage.imports new file mode 100644 index 00000000000..c0d16ce60c0 --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedAliasedImportFromSamePackage.imports @@ -0,0 +1,2 @@ +test.SamePackage as Aliased +test.samePackage as aliased diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedAliasedImportFromSamePackage.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedAliasedImportFromSamePackage.kt new file mode 100644 index 00000000000..08e68441d33 --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedAliasedImportFromSamePackage.kt @@ -0,0 +1,12 @@ +package test + +import test.SamePackage as Aliased +import test.samePackage as aliased + +class SamePackage + +fun samePackage() {} + +fun usage(a: SamePackage) { + samePackage() +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportsFromSamePackage.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportsFromSamePackage.imports new file mode 100644 index 00000000000..71dbe363d2a --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportsFromSamePackage.imports @@ -0,0 +1,2 @@ +test.SamePackage +test.samePackage diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportsFromSamePackage.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportsFromSamePackage.kt new file mode 100644 index 00000000000..1f67f8f0bc4 --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImportsFromSamePackage.kt @@ -0,0 +1,17 @@ +// FILE: main.kt + +package test + +import test.SamePackage +import test.samePackage + +fun usage(a: SamePackage) { + samePackage() +} + +// FILE: dependency.kt +package test + +class SamePackage + +fun samePackage() {} diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedAndRegularImportsFromSamePackage.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedAndRegularImportsFromSamePackage.imports new file mode 100644 index 00000000000..e69de29bb2d diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedAndRegularImportsFromSamePackage.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedAndRegularImportsFromSamePackage.kt new file mode 100644 index 00000000000..8970a03b89c --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedAndRegularImportsFromSamePackage.kt @@ -0,0 +1,20 @@ +// FILE: main.kt + +package test + +import test.SamePackage +import test.SamePackage as Aliased +import test.samePackage +import test.samePackage as aliased + +fun usage(a: Aliased, b: SamePackage) { + aliased() + samePackage() +} + +// FILE: dependency.kt +package test + +class SamePackage + +fun samePackage() {} diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedImportsFromSamePackage.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedImportsFromSamePackage.imports new file mode 100644 index 00000000000..e69de29bb2d diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedImportsFromSamePackage.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedImportsFromSamePackage.kt new file mode 100644 index 00000000000..47491928508 --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedAliasedImportsFromSamePackage.kt @@ -0,0 +1,16 @@ +// FILE: main.kt +package test + +import test.SamePackage as Aliased +import test.samePackage as aliased + +fun usage(a: Aliased) { + aliased() +} + +// FILE: dependency.kt +package test + +class SamePackage + +fun samePackage() {}