From 383fa2d111ce8982f8e453e7b70082123b2f7cc3 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Tue, 16 Jun 2020 21:11:58 +0700 Subject: [PATCH] ImportOptimizer: cleanup code --- .../idea/imports/OptimizedImportsBuilder.kt | 35 +++++++++---------- .../idea/imports/KotlinImportOptimizer.kt | 8 +++-- .../KotlinUnusedImportInspection.kt | 3 +- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/imports/OptimizedImportsBuilder.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/imports/OptimizedImportsBuilder.kt index 49b5573cf77..290f31a7156 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/imports/OptimizedImportsBuilder.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/imports/OptimizedImportsBuilder.kt @@ -49,13 +49,13 @@ class OptimizedImportsBuilder( fun resolve(bindingContext: BindingContext): Collection } - data class InputData( + class InputData( val descriptorsToImport: Set, val namesToImport: Map>, val references: Collection ) - data class Options( + class Options( val nameCountToUseStarImport: Int, val nameCountToUseStarImportForMembers: Int, val isInPackagesToUseStarImport: (FqName) -> Boolean @@ -106,9 +106,7 @@ class OptimizedImportsBuilder( private fun tryBuildOptimizedImports(): List? { val importsToGenerate = HashSet() - importRules - .filterIsInstance() - .mapTo(importsToGenerate) { it.importPath } + importRules.filterIsInstance().mapTo(importsToGenerate) { it.importPath } val descriptorsByParentFqName = HashMap>() for (descriptor in data.descriptorsToImport) { @@ -141,13 +139,11 @@ class OptimizedImportsBuilder( val nameCountToUseStar = descriptors.first().nameCountToUseStar() val useExplicitImports = fqNames.size < nameCountToUseStar && !options.isInPackagesToUseStarImport(parentFqName) || !starImportPath.isAllowedByRules() + if (useExplicitImports) { - fqNames - .filter(this::needExplicitImport) - .mapTo(importsToGenerate) { ImportPath(it, false) } + fqNames.filter(this::needExplicitImport).mapTo(importsToGenerate) { ImportPath(it, false) } } else { - descriptors - .asSequence() + descriptors.asSequence() .filterIsInstance() .map { it.importableFqName!! } .filterTo(classNamesToCheck, this::needExplicitImport) @@ -183,8 +179,11 @@ class OptimizedImportsBuilder( val element = ref.element val bindingContext = element.analyze() val expressionToAnalyze = getExpressionToAnalyze(element) ?: continue - val newScope = - element.getResolutionScope(bindingContext, file.getResolutionFacade()).replaceImportingScopes(newFileScope) + val newScope = element.getResolutionScope( + bindingContext, + file.getResolutionFacade() + ).replaceImportingScopes(newFileScope) + val newBindingContext = expressionToAnalyze.analyzeAsReplacement( expressionToAnalyze, bindingContext, @@ -272,10 +271,12 @@ class OptimizedImportsBuilder( append("\n") } } + val fileWithImports = KtPsiFactory(originalFile).createAnalyzableFile("Dummy_" + originalFile.name, fileText, originalFile) if (file.isScript()) { fileWithImports.originalFile = originalFile } + return fileWithImports.getFileResolutionScope() } @@ -312,12 +313,10 @@ class OptimizedImportsBuilder( .filter { it.isNotEmpty() } } - private fun canUseStarImport(descriptor: DeclarationDescriptor, fqName: FqName): Boolean { - return when { - fqName.parent().isRoot -> false - (descriptor.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.OBJECT -> false - else -> true - } + private fun canUseStarImport(descriptor: DeclarationDescriptor, fqName: FqName): Boolean = when { + fqName.parent().isRoot -> false + (descriptor.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.OBJECT -> false + else -> true } private fun needExplicitImport(fqName: FqName): Boolean = hasAlias(fqName) || !isImportedByDefault(fqName) diff --git a/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt b/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt index 5633c7022b4..824f697c3d1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt @@ -102,6 +102,7 @@ class KotlinImportOptimizer : ImportOptimizer { element.acceptChildren(this) } }) + size } else { 0 @@ -205,12 +206,14 @@ class KotlinImportOptimizer : ImportOptimizer { get() { val resolvesByNames = reference.resolvesByNames if (reference is KtInvokeFunctionReference) { - val additionalNames = (reference.element.calleeExpression as? KtNameReferenceExpression) - ?.mainReference?.resolvesByNames + val additionalNames = + (reference.element.calleeExpression as? KtNameReferenceExpression)?.mainReference?.resolvesByNames + if (additionalNames != null) { return resolvesByNames + additionalNames } } + return resolvesByNames } @@ -223,6 +226,7 @@ class KotlinImportOptimizer : ImportOptimizer { if (reference.getter) "Getter" else "Setter" ) } + else -> reference.toString().replace("DescriptorsImpl", "") } } diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt index c96e2b76b45..aab28c3f25a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt @@ -57,7 +57,7 @@ import org.jetbrains.kotlin.psi.psiUtil.siblings import org.jetbrains.kotlin.resolve.ImportPath class KotlinUnusedImportInspection : AbstractKotlinInspection() { - data class ImportData(val unusedImports: List, val optimizerData: OptimizedImportsBuilder.InputData) + class ImportData(val unusedImports: List, val optimizerData: OptimizedImportsBuilder.InputData) companion object { fun analyzeImports(file: KtFile): ImportData? { @@ -128,6 +128,7 @@ class KotlinUnusedImportInspection : AbstractKotlinInspection() { if (!KotlinCodeInsightWorkspaceSettings.getInstance(file.project).optimizeImportsOnTheFly) { fixes.add(EnableOptimizeImportsOnTheFlyFix(file)) } + manager.createProblemDescriptor( it, KotlinBundle.message("unused.import.directive"),