From 10df37ba8ef0dac4ba2d8dc353016e832d05f103 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Thu, 27 Jul 2023 16:23:38 +0200 Subject: [PATCH] KTIJ-26423 [AA] Return more info from `KtFirImportOptimizer` Deprecate `unusedImports`, since they are supposed to be computed on the IDE side from now on based on the information from Analysis API Currently the `unusedImports` property is not removed completely so it can still be used by the Kotlin side import optimizer tests; they should be moved/adapted to the intellij repository also --- .../analysis/api/fir/components/KtFirImportOptimizer.kt | 9 +++++---- .../AbstractAnalysisApiImportOptimizerTest.kt | 1 + .../kotlin/analysis/api/components/KtImportOptimizer.kt | 7 ++++++- 3 files changed, 12 insertions(+), 5 deletions(-) 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 c13eb9dc125..bf802c13673 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 @@ -57,7 +57,7 @@ internal class KtFirImportOptimizer( override fun analyseImports(file: KtFile): KtImportOptimizerResult { val existingImports = file.importDirectives - if (existingImports.isEmpty()) return KtImportOptimizerResult(emptySet()) + if (existingImports.isEmpty()) return KtImportOptimizerResult() val firFile = file.getOrBuildFirFile(firResolveSession).apply { lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE) } @@ -68,9 +68,10 @@ internal class KtFirImportOptimizer( .map { it.fqName } .toSet() - val (usedImports, unresolvedNames) = collectReferencedEntities(firFile) + val (usedDeclarations, unresolvedNames) = collectReferencedEntities(firFile) - val referencesEntities = usedImports + // TODO remove unused imports computing code completely + val referencesEntities = usedDeclarations .filterNot { (fqName, referencedByNames) -> val fromCurrentPackage = fqName.parentOrNull() == file.packageFqName val noAliasedImports = referencedByNames.singleOrNull() == fqName.shortName() @@ -104,7 +105,7 @@ internal class KtFirImportOptimizer( } } - return KtImportOptimizerResult(unusedImports) + return KtImportOptimizerResult(unusedImports, usedDeclarations, unresolvedNames) } private data class ReferencedEntitiesResult( diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/importOptimizer/AbstractAnalysisApiImportOptimizerTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/importOptimizer/AbstractAnalysisApiImportOptimizerTest.kt index 582934da7ff..a981275bd67 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/importOptimizer/AbstractAnalysisApiImportOptimizerTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/importOptimizer/AbstractAnalysisApiImportOptimizerTest.kt @@ -16,6 +16,7 @@ abstract class AbstractAnalysisApiImportOptimizerTest : AbstractAnalysisApiBased val mainKtFile = ktFiles.singleOrNull() ?: ktFiles.first { it.name == "main.kt" } val unusedImports = analyseForTest(mainKtFile) { val results = analyseImports(mainKtFile) + @Suppress("DEPRECATION") results.unusedImports } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt index 9833ca6b3bf..b92dd111254 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtImportOptimizer.kt @@ -7,6 +7,8 @@ package org.jetbrains.kotlin.analysis.api.components import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtImportDirective @@ -28,5 +30,8 @@ public interface KtImportOptimizerMixIn : KtAnalysisSessionMixIn { } public class KtImportOptimizerResult( - public val unusedImports: Set, + @Deprecated("Compute unused import on the IntelliJ side instead, see org.jetbrains.kotlin.idea.base.analysis.api.utils.computeUnusedImports") + public val unusedImports: Set = emptySet(), + public val usedDeclarations: Map> = emptyMap(), + public val unresolvedNames: Set = emptySet(), ) \ No newline at end of file