From e1ebbc10d91f0bc65556048797362605b8c218cd Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Thu, 27 Jul 2023 12:22:14 +0200 Subject: [PATCH] KTIJ-24877 [Analysis API] Ignore type qualifiers with fake sources when optimizing imports When optimizing imports, it does not make any sense to account for type qualifiers which are not directly present in the code ATM such implicit type references are present for every callable declaration call ^KTIJ-24877 Fixed --- ...alysisApiImportOptimizerTestGenerated.java | 6 ++++++ .../fir/components/KtFirImportOptimizer.kt | 2 ++ ...alysisApiImportOptimizerTestGenerated.java | 6 ++++++ ...alysisApiImportOptimizerTestGenerated.java | 6 ++++++ ...tReturnTypeReference_destructuring.imports | 3 +++ ...plicitReturnTypeReference_destructuring.kt | 21 +++++++++++++++++++ 6 files changed, 44 insertions(+) create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImplicitReturnTypeReference_destructuring.imports create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImplicitReturnTypeReference_destructuring.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 037feb30558..3c042df8f8b 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 @@ -94,6 +94,12 @@ public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGene runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedGenericTypeQualifier.kt"); } + @Test + @TestMetadata("unusedImplicitReturnTypeReference_destructuring.kt") + public void testUnusedImplicitReturnTypeReference_destructuring() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImplicitReturnTypeReference_destructuring.kt"); + } + @Test @TestMetadata("unusedImportFromObject.kt") public void testUnusedImportFromObject() 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 74f0027e8bc..9d6be81bfea 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 @@ -506,6 +506,8 @@ private sealed interface TypeQualifier { } fun createFor(typeRef: FirResolvedTypeRef): TypeQualifier? { + if (typeRef.source?.kind !is KtRealSourceElementKind) return null + val wholeClassId = typeRef.resolvedClassId ?: return null val psi = typeRef.psi as? KtTypeReference ?: return null 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 456f3ca0767..ddf0fd9b96d 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 @@ -94,6 +94,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedGenericTypeQualifier.kt"); } + @Test + @TestMetadata("unusedImplicitReturnTypeReference_destructuring.kt") + public void testUnusedImplicitReturnTypeReference_destructuring() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImplicitReturnTypeReference_destructuring.kt"); + } + @Test @TestMetadata("unusedImportFromObject.kt") public void testUnusedImportFromObject() 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 401b8759bda..6f89a2fb139 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 @@ -94,6 +94,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedGenericTypeQualifier.kt"); } + @Test + @TestMetadata("unusedImplicitReturnTypeReference_destructuring.kt") + public void testUnusedImplicitReturnTypeReference_destructuring() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImplicitReturnTypeReference_destructuring.kt"); + } + @Test @TestMetadata("unusedImportFromObject.kt") public void testUnusedImportFromObject() throws Exception { diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImplicitReturnTypeReference_destructuring.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImplicitReturnTypeReference_destructuring.imports new file mode 100644 index 00000000000..57c8b370b4c --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImplicitReturnTypeReference_destructuring.imports @@ -0,0 +1,3 @@ +dependency.Bar +dependency.One +dependency.Two diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImplicitReturnTypeReference_destructuring.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImplicitReturnTypeReference_destructuring.kt new file mode 100644 index 00000000000..c95eec4944f --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedImplicitReturnTypeReference_destructuring.kt @@ -0,0 +1,21 @@ +// FILE: main.kt +package test + +import dependency.foo +import dependency.Bar +import dependency.One +import dependency.Two + +fun usage() { + val (one, two) = foo() +} + +// FILE: dependency.kt +package dependency + +fun foo(): Bar = Bar() + +data class Bar(val one: One, val two: Two) + +class One +class Two