ImportOptimizer: cleanup code

#KT-31331
This commit is contained in:
Dmitry Gridin
2020-06-23 16:07:17 +07:00
parent 2610dedcbd
commit 5ad94daaa5
2 changed files with 19 additions and 8 deletions
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
import org.jetbrains.kotlin.idea.analysis.analyzeAsReplacement
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
import org.jetbrains.kotlin.idea.resolve.frontendService
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.util.getResolutionScope
@@ -82,8 +83,10 @@ class OptimizedImportsBuilder(
fun buildOptimizedImports(): List<ImportPath>? {
val facade = file.getResolutionFacade()
file.importDirectives
.filter { it.isAllUnder && data.unresolvedNames.isNotEmpty() || it.importedName in data.unresolvedNames && !it.canResolve(facade) }
.mapNotNullTo(importRules) { it.importPath?.let { path -> ImportRule.Add(path) } }
.asSequence()
.filter { it.mayReferToSomeUnresolvedName() || it.isExistedUnresolvedName(facade) }
.mapNotNull { it.importPath }
.mapNotNullTo(importRules) { ImportRule.Add(it) }
while (true) {
ProgressManager.checkCanceled()
@@ -94,6 +97,11 @@ class OptimizedImportsBuilder(
}
}
private fun KtImportDirective.mayReferToSomeUnresolvedName() = isAllUnder && data.unresolvedNames.isNotEmpty()
private fun KtImportDirective.isExistedUnresolvedName(facade: ResolutionFacade) =
importedName in data.unresolvedNames && !canResolve(facade)
private fun getExpressionToAnalyze(element: KtElement): KtExpression? {
val parent = element.parent
return when {
@@ -151,12 +151,7 @@ class KotlinImportOptimizer : ImportOptimizer {
val references = element.references.ifEmpty { return }
val bindingContext = element.analyze(BodyResolveMode.PARTIAL)
val isResolved = if (element is KtCallElement)
element.getResolvedCall(bindingContext) != null
else
element.mainReference?.resolveToDescriptors(bindingContext)?.let { descriptors ->
descriptors.isNotEmpty() && descriptors.none { it is ErrorSimpleFunctionDescriptorImpl }
} == true
val isResolved = hasResolvedDescriptor(element, bindingContext)
for (reference in references) {
if (reference !is KtReference) continue
@@ -302,3 +297,11 @@ class KotlinImportOptimizer : ImportOptimizer {
}
}
}
private fun hasResolvedDescriptor(element: KtElement, bindingContext: BindingContext): Boolean =
if (element is KtCallElement)
element.getResolvedCall(bindingContext) != null
else
element.mainReference?.resolveToDescriptors(bindingContext)?.let { descriptors ->
descriptors.isNotEmpty() && descriptors.none { it is ErrorSimpleFunctionDescriptorImpl }
} == true