Fix false positive "Unused import directive" for imports under several alias

#KT-30949 Fixed
This commit is contained in:
Dmitry Gridin
2019-04-25 18:01:29 +07:00
parent c52abfda16
commit 9062a2fe72
13 changed files with 79 additions and 3 deletions
@@ -175,7 +175,7 @@ open class KtFile(viewProvider: FileViewProvider, val isCompiled: Boolean) :
importDirectives.firstOrNull { name == it.aliasName }
fun findAliasByFqName(fqName: FqName): KtImportAlias? = importDirectives.firstOrNull {
fqName == it.importedFqName
it.alias != null && fqName == it.importedFqName
}?.alias
@Deprecated("") // getPackageFqName should be used instead
@@ -42,7 +42,6 @@ import org.jetbrains.kotlin.resolve.ImportPath
import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor
import org.jetbrains.kotlin.resolve.scopes.HierarchicalScope
import org.jetbrains.kotlin.resolve.scopes.utils.*
import java.util.*
class KotlinImportOptimizer : ImportOptimizer {
override fun supports(file: PsiFile?) = file is KtFile
@@ -74,6 +73,12 @@ class KotlinImportOptimizer : ImportOptimizer {
private class CollectUsedDescriptorsVisitor(file: KtFile) : KtVisitorVoid() {
private val currentPackageName = file.packageFqName
private val withAlias: Set<FqName> = file.importDirectives
.asSequence()
.filter { it.alias != null && it.aliasName != it.importPath?.fqName?.shortName()?.asString() }
.mapNotNull(KtImportDirective::importedFqName)
.toSet()
private val descriptorsToImport = HashSet<DeclarationDescriptor>()
private val abstractRefs = ArrayList<OptimizedImportsBuilder.AbstractReference>()
@@ -107,7 +112,7 @@ class KotlinImportOptimizer : ImportOptimizer {
val importableFqName = target.importableFqName ?: continue
val parentFqName = importableFqName.parent()
if (target is PackageViewDescriptor && parentFqName == FqName.ROOT) continue // no need to import top-level packages
if (target !is PackageViewDescriptor && parentFqName == currentPackageName) continue
if (target !is PackageViewDescriptor && parentFqName == currentPackageName && importableFqName !in withAlias) continue
if (!reference.canBeResolvedViaImport(target, bindingContext)) continue
@@ -0,0 +1 @@
const val name = 42
@@ -0,0 +1,4 @@
import name
import name as names
val a = name
@@ -0,0 +1,4 @@
import name
import name as names
val a = name
@@ -0,0 +1,5 @@
package duration
val Int.hours: Int get() = TODO()
val Int.minutes: Int get() = TODO()
val Int.seconds: Int get() = TODO()
@@ -0,0 +1,11 @@
import duration.*
import duration.hours as hour
import duration.minutes as minute
import duration.minutes as minutes
import duration.seconds as second
import duration.seconds as seconds
fun main() {
val totalDuration = 1.hour - 30.minutes + 1.second
println(totalDuration)
}
@@ -0,0 +1,8 @@
import duration.minutes
import duration.hours as hour
import duration.seconds as second
fun main() {
val totalDuration = 1.hour - 30.minutes + 1.second
println(totalDuration)
}
@@ -0,0 +1,13 @@
Additional checking of reference Getter: hour
Additional checking of reference KtSimpleNameReference: hour
Changed resolve of KtSimpleNameReference: hour
Additional checking of reference Getter: second
Additional checking of reference KtSimpleNameReference: second
Changed resolve of KtSimpleNameReference: second
Trying to build import list again with import rules: +duration.hours as hour, +duration.seconds as second
Additional checking of reference Getter: hour
Additional checking of reference KtSimpleNameReference: hour
Changed resolve of KtSimpleNameReference: hour
Additional checking of reference Getter: second
Additional checking of reference KtSimpleNameReference: second
Changed resolve of KtSimpleNameReference: second
@@ -0,0 +1 @@
const val name = 42
@@ -0,0 +1,4 @@
import name
import name as names
val a = name
@@ -64,6 +64,16 @@ public class JsOptimizeImportsTestGenerated extends AbstractJsOptimizeImportsTes
runTest("idea/testData/editor/optimizeImports/common/ComponentFunction.kt");
}
@TestMetadata("ConflictWithAlias.kt")
public void testConflictWithAlias() throws Exception {
runTest("idea/testData/editor/optimizeImports/common/ConflictWithAlias.kt");
}
@TestMetadata("ConflictWithAlias2.kt")
public void testConflictWithAlias2() throws Exception {
runTest("idea/testData/editor/optimizeImports/common/ConflictWithAlias2.kt");
}
@TestMetadata("CurrentPackage.kt")
public void testCurrentPackage() throws Exception {
runTest("idea/testData/editor/optimizeImports/common/CurrentPackage.kt");
@@ -257,6 +257,16 @@ public class JvmOptimizeImportsTestGenerated extends AbstractJvmOptimizeImportsT
runTest("idea/testData/editor/optimizeImports/common/ComponentFunction.kt");
}
@TestMetadata("ConflictWithAlias.kt")
public void testConflictWithAlias() throws Exception {
runTest("idea/testData/editor/optimizeImports/common/ConflictWithAlias.kt");
}
@TestMetadata("ConflictWithAlias2.kt")
public void testConflictWithAlias2() throws Exception {
runTest("idea/testData/editor/optimizeImports/common/ConflictWithAlias2.kt");
}
@TestMetadata("CurrentPackage.kt")
public void testCurrentPackage() throws Exception {
runTest("idea/testData/editor/optimizeImports/common/CurrentPackage.kt");