From 73bfc886131fdcd8b4d8a33b2edb0af8f4254f14 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Thu, 3 Aug 2023 12:08:38 +0200 Subject: [PATCH] KTIJ-26501 [Analysis API] Do not ignore vararg type references in `KtFirImportOptimizer` Turns out they have fake sources, so ignoring all type qualifiers with fake sources in e1ebbc10d91f was incorrect. ^KTIJ-26501 Fixed --- ...eAnalysisApiImportOptimizerTestGenerated.java | 12 ++++++++++++ .../api/fir/components/KtFirImportOptimizer.kt | 16 ++++++++++++++-- ...eAnalysisApiImportOptimizerTestGenerated.java | 12 ++++++++++++ ...eAnalysisApiImportOptimizerTestGenerated.java | 12 ++++++++++++ .../unusedTypeAsVarargType.imports | 1 + .../analyseImports/unusedTypeAsVarargType.kt | 11 +++++++++++ .../analyseImports/usedTypeAsVarargType.imports | 0 .../analyseImports/usedTypeAsVarargType.kt | 11 +++++++++++ 8 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedTypeAsVarargType.imports create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedTypeAsVarargType.kt create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsVarargType.imports create mode 100644 analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsVarargType.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 3c042df8f8b..9697cfd46f9 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 @@ -124,6 +124,12 @@ public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGene runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedStaticFunctionImportFromJavaChildClass.kt"); } + @Test + @TestMetadata("unusedTypeAsVarargType.kt") + public void testUnusedTypeAsVarargType() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedTypeAsVarargType.kt"); + } + @Test @TestMetadata("usedAliasedAndRegularImportsFromSamePackage.kt") public void testUsedAliasedAndRegularImportsFromSamePackage() throws Exception { @@ -220,6 +226,12 @@ public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGene runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsTypeParameter.kt"); } + @Test + @TestMetadata("usedTypeAsVarargType.kt") + public void testUsedTypeAsVarargType() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsVarargType.kt"); + } + @Nested @TestMetadata("analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors") @TestDataPath("$PROJECT_ROOT") 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 9d6be81bfea..c22fe9e9a81 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.KtFakeSourceElementKind import org.jetbrains.kotlin.KtRealSourceElementKind import org.jetbrains.kotlin.analysis.api.components.KtImportOptimizer import org.jetbrains.kotlin.analysis.api.components.KtImportOptimizerResult @@ -490,8 +491,11 @@ private sealed interface TypeQualifier { } companion object { + val FirResolvedQualifier.isPresentInSource: Boolean + get() = source?.kind is KtRealSourceElementKind + fun createFor(qualifier: FirResolvedQualifier): TypeQualifier? { - if (qualifier.source?.kind !is KtRealSourceElementKind) return null + if (!qualifier.isPresentInSource) return null val wholeClassId = qualifier.classId ?: return null val psi = qualifier.psi as? KtExpression ?: return null @@ -505,8 +509,16 @@ private sealed interface TypeQualifier { return KtDotExpressionTypeQualifier(wholeClassId, wholeQualifier) } + private val FirResolvedTypeRef.isPresentInSource: Boolean + get() = when (source?.kind) { + is KtRealSourceElementKind -> true + is KtFakeSourceElementKind.ArrayTypeFromVarargParameter -> true + + else -> false + } + fun createFor(typeRef: FirResolvedTypeRef): TypeQualifier? { - if (typeRef.source?.kind !is KtRealSourceElementKind) return null + if (!typeRef.isPresentInSource) 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 ddf0fd9b96d..deed0791621 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 @@ -124,6 +124,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedStaticFunctionImportFromJavaChildClass.kt"); } + @Test + @TestMetadata("unusedTypeAsVarargType.kt") + public void testUnusedTypeAsVarargType() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedTypeAsVarargType.kt"); + } + @Test @TestMetadata("usedAliasedAndRegularImportsFromSamePackage.kt") public void testUsedAliasedAndRegularImportsFromSamePackage() throws Exception { @@ -220,6 +226,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsTypeParameter.kt"); } + @Test + @TestMetadata("usedTypeAsVarargType.kt") + public void testUsedTypeAsVarargType() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsVarargType.kt"); + } + @Nested @TestMetadata("analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors") @TestDataPath("$PROJECT_ROOT") 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 6f89a2fb139..ef8b3e8c1e7 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 @@ -124,6 +124,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedStaticFunctionImportFromJavaChildClass.kt"); } + @Test + @TestMetadata("unusedTypeAsVarargType.kt") + public void testUnusedTypeAsVarargType() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedTypeAsVarargType.kt"); + } + @Test @TestMetadata("usedAliasedAndRegularImportsFromSamePackage.kt") public void testUsedAliasedAndRegularImportsFromSamePackage() throws Exception { @@ -220,6 +226,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsTypeParameter.kt"); } + @Test + @TestMetadata("usedTypeAsVarargType.kt") + public void testUsedTypeAsVarargType() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsVarargType.kt"); + } + @Nested @TestMetadata("analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedTypeAsVarargType.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedTypeAsVarargType.imports new file mode 100644 index 00000000000..78782534898 --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedTypeAsVarargType.imports @@ -0,0 +1 @@ +dependency.Bar \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedTypeAsVarargType.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedTypeAsVarargType.kt new file mode 100644 index 00000000000..80182a83088 --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/unusedTypeAsVarargType.kt @@ -0,0 +1,11 @@ +// FILE: main.kt +package test + +import dependency.Bar + +fun usage(vararg p: dependency.Bar) {} + +// FILE: dependency.kt +package dependency + +class Bar \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsVarargType.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsVarargType.imports new file mode 100644 index 00000000000..e69de29bb2d diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsVarargType.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsVarargType.kt new file mode 100644 index 00000000000..1cd40e7282d --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/usedTypeAsVarargType.kt @@ -0,0 +1,11 @@ +// FILE: main.kt +package test + +import dependency.Bar + +fun usage(vararg p: Bar) {} + +// FILE: dependency.kt +package dependency + +class Bar \ No newline at end of file