From b23aabf6e04fca059af50d354787a32cfe5cd707 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Mon, 13 Feb 2023 16:27:44 +0100 Subject: [PATCH] [Analysis API] KTIJ-24610 Ignore qualifiers with fake source in `KtFirImportOptimizer` Such qualifiers can appear for extensions imported from objects ^KTIJ-24610 Fixed --- .../api/fir/components/KtFirImportOptimizer.kt | 3 +++ ...eAnalysisApiImportOptimizerTestGenerated.java | 6 ++++++ ...eAnalysisApiImportOptimizerTestGenerated.java | 6 ++++++ .../unsedObjectWithExtensionFromObject.imports | 1 + .../unsedObjectWithExtensionFromObject.kt | 16 ++++++++++++++++ 5 files changed, 32 insertions(+) create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.imports create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.kt 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 22835dbc4ef..fc082bcb707 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 @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.fir.components +import org.jetbrains.kotlin.KtRealSourceElementKind import org.jetbrains.kotlin.analysis.api.components.KtImportOptimizer import org.jetbrains.kotlin.analysis.api.components.KtImportOptimizerResult import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols @@ -370,6 +371,8 @@ private sealed interface TypeQualifier { companion object { fun createFor(qualifier: FirResolvedQualifier): TypeQualifier? { + if (qualifier.source?.kind !is KtRealSourceElementKind) return null + val wholeClassId = qualifier.classId ?: return null val psi = qualifier.psi as? KtExpression ?: 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 259b0882e70..d5cdf9e4bca 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 @@ -46,6 +46,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/importOptimizer/analyseImports"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("unsedObjectWithExtensionFromObject.kt") + public void testUnsedObjectWithExtensionFromObject() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.kt"); + } + @Test @TestMetadata("unusedAliasedTypeImport.kt") public void testUnusedAliasedTypeImport() 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 9aa29ca064f..157f3bf8fbc 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 @@ -46,6 +46,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/importOptimizer/analyseImports"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("unsedObjectWithExtensionFromObject.kt") + public void testUnsedObjectWithExtensionFromObject() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.kt"); + } + @Test @TestMetadata("unusedAliasedTypeImport.kt") public void testUnusedAliasedTypeImport() throws Exception { diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.imports new file mode 100644 index 00000000000..217f9de9e13 --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.imports @@ -0,0 +1 @@ +dependency.Bar.Companion diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.kt new file mode 100644 index 00000000000..03ecd2cffae --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unsedObjectWithExtensionFromObject.kt @@ -0,0 +1,16 @@ +// FILE: main.kt +import dependency.Bar.Companion.minutes +import dependency.Bar.Companion + +fun test() { + 10.minutes +} + +// FILE: dependency.kt +package dependency + +class Bar { + companion object { + val Int.minutes: Int get() = this + } +}