From 7fe0503337d45cdbb3861348d57408c9b44a05ce Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Mon, 29 Apr 2019 16:11:02 +0700 Subject: [PATCH] Unused import: support also imports as alias #KT-12392 Fixed --- .../kotlin/idea/util/OptimizedImportsBuilder.kt | 4 ++-- .../kotlin/idea/imports/KotlinImportOptimizer.kt | 5 ++--- .../idea/inspections/KotlinUnusedImportInspection.kt | 11 +++++------ idea/testData/inspections/unusedImport/file.kt | 5 +++-- .../unusedImport/inspectionData/expected.xml | 9 +++++++++ 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/OptimizedImportsBuilder.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/OptimizedImportsBuilder.kt index b383f708adc..07bba673902 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/OptimizedImportsBuilder.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/OptimizedImportsBuilder.kt @@ -61,7 +61,7 @@ class OptimizedImportsBuilder( } data class InputData( - val descriptorsToImport: Set, + val descriptorsToImport: Map>, val references: Collection ) @@ -124,7 +124,7 @@ class OptimizedImportsBuilder( .mapTo(importsToGenerate) { it.importPath } val descriptorsByParentFqName = HashMap>() - for (descriptor in data.descriptorsToImport) { + for (descriptor in data.descriptorsToImport.keys) { val fqName = descriptor.importableFqName!! val explicitImportPath = ImportPath(fqName, false) diff --git a/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt b/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt index 66ec3c3f4bd..3de3bdff9b6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt @@ -79,7 +79,7 @@ class KotlinImportOptimizer : ImportOptimizer { .mapNotNull(KtImportDirective::importedFqName) .toSet() - private val descriptorsToImport = HashSet() + private val descriptorsToImport = LinkedHashMap>() private val abstractRefs = ArrayList() val data: OptimizedImportsBuilder.InputData @@ -107,7 +107,6 @@ class KotlinImportOptimizer : ImportOptimizer { val targets = reference.targets(bindingContext) for (target in targets) { val importableDescriptor = target.getImportableDescriptor() - if (importableDescriptor.name !in names) continue // resolved via alias val importableFqName = target.importableFqName ?: continue val parentFqName = importableFqName.parent() @@ -118,7 +117,7 @@ class KotlinImportOptimizer : ImportOptimizer { if (isAccessibleAsMember(importableDescriptor, element, bindingContext)) continue - descriptorsToImport.add(importableDescriptor) + descriptorsToImport.compute(importableDescriptor) { _, u -> u?.plus(names) ?: names.toHashSet() } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt index 8c90769a3ef..62217fd054a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt @@ -49,12 +49,12 @@ import org.jetbrains.kotlin.idea.imports.OptimizedImportsBuilder import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.psiUtil.siblings import org.jetbrains.kotlin.resolve.ImportPath -import java.util.* class KotlinUnusedImportInspection : AbstractKotlinInspection() { data class ImportData(val unusedImports: List, val optimizerData: OptimizedImportsBuilder.InputData) @@ -75,11 +75,11 @@ class KotlinUnusedImportInspection : AbstractKotlinInspection() { .map { it.fqName } .toSet() - val fqNames = HashSet() + val fqNames = HashMap>() val parentFqNames = HashSet() - for (descriptor in optimizerData.descriptorsToImport) { + for ((descriptor, names) in optimizerData.descriptorsToImport) { val fqName = descriptor.importableFqName!! - fqNames.add(fqName) + fqNames.compute(fqName) { _, u -> u?.plus(names) ?: names } if (fqName !in explicitlyImportedFqNames) { // we don't add parents of explicitly imported fq-names because such imports are not needed val parentFqName = fqName.parent() @@ -95,12 +95,11 @@ class KotlinUnusedImportInspection : AbstractKotlinInspection() { val resolutionFacade = file.getResolutionFacade() for (directive in directives) { val importPath = directive.importPath ?: continue - if (importPath.alias != null) continue // highlighting of unused alias imports not supported yet val isUsed = when { !importPaths.add(importPath) -> false importPath.isAllUnder -> importPath.fqName in parentFqNames - importPath.fqName in fqNames -> true + importPath.fqName in fqNames -> importPath.importedName?.let { it in fqNames.getValue(importPath.fqName) } ?: false // case for type alias else -> directive.targetDescriptors(resolutionFacade).firstOrNull()?.let { it.importableFqName in fqNames } ?: false } diff --git a/idea/testData/inspections/unusedImport/file.kt b/idea/testData/inspections/unusedImport/file.kt index 404e1b6d06c..2e7ee69ba51 100644 --- a/idea/testData/inspections/unusedImport/file.kt +++ b/idea/testData/inspections/unusedImport/file.kt @@ -7,11 +7,12 @@ import java.util.ArrayList // used import java.unresolved.* // unused but unresolved import java.net.Unresolved // unused but unresolved -import java.net.ConnectException as CE // highlighting of unused aliases not implemented yet +import java.net.ConnectException as CE // unused +import java.net.ConnectException as ConExc // used import RootPackageClass // unused because it's in the current package -fun foo(list: ArrayList, p: RootPackageClass) { +fun foo(list: ArrayList, p: RootPackageClass, e: ConExc) { list.add("") Date() } diff --git a/idea/testData/inspections/unusedImport/inspectionData/expected.xml b/idea/testData/inspections/unusedImport/inspectionData/expected.xml index 0445e2ca863..fd995c217ed 100644 --- a/idea/testData/inspections/unusedImport/inspectionData/expected.xml +++ b/idea/testData/inspections/unusedImport/inspectionData/expected.xml @@ -17,6 +17,15 @@ Unused import directive + + file.kt + 10 + light_idea_test_case + + Unused import directive + Unused import directive + + fileInPack1.kt 3