From 32298522dd382d394b324e07b9af414f80f691b2 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Tue, 14 May 2019 11:28:02 +0700 Subject: [PATCH] Optimize Imports shouldn't delete imports with unresolved parts #KT-10512 Fixed --- .../org/jetbrains/kotlin/idea/util/ImportsUtils.kt | 11 ++++++++--- .../kotlin/idea/util/OptimizedImportsBuilder.kt | 3 ++- .../common/UnresolvedImport.dependency.kt | 3 +++ .../editor/optimizeImports/common/UnresolvedImport.kt | 8 ++++++++ .../optimizeImports/common/UnresolvedImport.kt.after | 8 ++++++++ .../editor/optimizeImports/jvm/UnusedImports.kt.after | 1 + .../idea/imports/JsOptimizeImportsTestGenerated.java | 5 +++++ .../idea/imports/JvmOptimizeImportsTestGenerated.java | 5 +++++ 8 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 idea/testData/editor/optimizeImports/common/UnresolvedImport.dependency.kt create mode 100644 idea/testData/editor/optimizeImports/common/UnresolvedImport.kt create mode 100644 idea/testData/editor/optimizeImports/common/UnresolvedImport.kt.after diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ImportsUtils.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ImportsUtils.kt index 746185eeaf3..afc3d770f0e 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ImportsUtils.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ImportsUtils.kt @@ -19,10 +19,11 @@ package org.jetbrains.kotlin.idea.imports import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtImportDirective -import org.jetbrains.kotlin.psi.KtNameReferenceExpression import org.jetbrains.kotlin.psi.KtReferenceExpression +import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -30,6 +31,7 @@ import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.bindingContextUtil.getReferenceTargets import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor +import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType object ImportPathComparator : Comparator { @@ -94,5 +96,8 @@ fun KtReferenceExpression.getImportableTargets(bindingContext: BindingContext): return targets.map { it.getImportableDescriptor() }.toSet() } -fun KtImportDirective.canResolve(): Boolean = (importedReference?.getQualifiedElementSelector() as? KtNameReferenceExpression) - ?.reference?.resolve() != null ?: false \ No newline at end of file +fun KtImportDirective.canResolve(facade: ResolutionFacade): Boolean { + return (importedReference?.getQualifiedElementSelector() as? KtSimpleNameExpression)?.let { nameExpression -> + nameExpression.getImportableTargets(facade.analyze(nameExpression, BodyResolveMode.PARTIAL)).isNotEmpty() + } ?: false +} \ No newline at end of file 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 5000448673a..42ef85434f3 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 @@ -87,8 +87,9 @@ class OptimizedImportsBuilder( private val importRules = HashSet() fun buildOptimizedImports(): List? { + val facade = file.getResolutionFacade() file.importDirectives - .filterNot(KtImportDirective::canResolve) + .filterNot { it.canResolve(facade) } .mapNotNull(KtImportDirective::getImportPath) .mapTo(importRules) { ImportRule.Add(it) } diff --git a/idea/testData/editor/optimizeImports/common/UnresolvedImport.dependency.kt b/idea/testData/editor/optimizeImports/common/UnresolvedImport.dependency.kt new file mode 100644 index 00000000000..e1f4e42a55c --- /dev/null +++ b/idea/testData/editor/optimizeImports/common/UnresolvedImport.dependency.kt @@ -0,0 +1,3 @@ +package pack1 + +class Example diff --git a/idea/testData/editor/optimizeImports/common/UnresolvedImport.kt b/idea/testData/editor/optimizeImports/common/UnresolvedImport.kt new file mode 100644 index 00000000000..1a4564fdd44 --- /dev/null +++ b/idea/testData/editor/optimizeImports/common/UnresolvedImport.kt @@ -0,0 +1,8 @@ +import pack1.Class4 +import pack1.Example +import pack2.* +import pack3.Ggd + +fun method(a: Class4) { + Example() +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/common/UnresolvedImport.kt.after b/idea/testData/editor/optimizeImports/common/UnresolvedImport.kt.after new file mode 100644 index 00000000000..1a4564fdd44 --- /dev/null +++ b/idea/testData/editor/optimizeImports/common/UnresolvedImport.kt.after @@ -0,0 +1,8 @@ +import pack1.Class4 +import pack1.Example +import pack2.* +import pack3.Ggd + +fun method(a: Class4) { + Example() +} \ No newline at end of file diff --git a/idea/testData/editor/optimizeImports/jvm/UnusedImports.kt.after b/idea/testData/editor/optimizeImports/jvm/UnusedImports.kt.after index 8f83e37726c..c7d967b7a13 100644 --- a/idea/testData/editor/optimizeImports/jvm/UnusedImports.kt.after +++ b/idea/testData/editor/optimizeImports/jvm/UnusedImports.kt.after @@ -1,6 +1,7 @@ import java.util.ArrayList import java.util.HashMap import kotlin.system.measureTimeMillis +import kotlin.test.Asserter class Action { fun test() { diff --git a/idea/tests/org/jetbrains/kotlin/idea/imports/JsOptimizeImportsTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/imports/JsOptimizeImportsTestGenerated.java index ed5da5feebd..ece7a4e46e5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/imports/JsOptimizeImportsTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/imports/JsOptimizeImportsTestGenerated.java @@ -174,6 +174,11 @@ public class JsOptimizeImportsTestGenerated extends AbstractJsOptimizeImportsTes runTest("idea/testData/editor/optimizeImports/common/TwoConstructors.kt"); } + @TestMetadata("UnresolvedImport.kt") + public void testUnresolvedImport() throws Exception { + runTest("idea/testData/editor/optimizeImports/common/UnresolvedImport.kt"); + } + @TestMetadata("idea/testData/editor/optimizeImports/common/kt21515") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/tests/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java index 7d6660f1909..505d0233044 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/imports/JvmOptimizeImportsTestGenerated.java @@ -367,6 +367,11 @@ public class JvmOptimizeImportsTestGenerated extends AbstractJvmOptimizeImportsT runTest("idea/testData/editor/optimizeImports/common/TwoConstructors.kt"); } + @TestMetadata("UnresolvedImport.kt") + public void testUnresolvedImport() throws Exception { + runTest("idea/testData/editor/optimizeImports/common/UnresolvedImport.kt"); + } + @TestMetadata("idea/testData/editor/optimizeImports/common/kt21515") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)