ImportOptimizer: cleanup code

This commit is contained in:
Dmitry Gridin
2020-06-16 21:11:58 +07:00
parent e7cee9c6e1
commit 383fa2d111
3 changed files with 25 additions and 21 deletions
@@ -49,13 +49,13 @@ class OptimizedImportsBuilder(
fun resolve(bindingContext: BindingContext): Collection<DeclarationDescriptor> fun resolve(bindingContext: BindingContext): Collection<DeclarationDescriptor>
} }
data class InputData( class InputData(
val descriptorsToImport: Set<DeclarationDescriptor>, val descriptorsToImport: Set<DeclarationDescriptor>,
val namesToImport: Map<FqName, Set<Name>>, val namesToImport: Map<FqName, Set<Name>>,
val references: Collection<AbstractReference> val references: Collection<AbstractReference>
) )
data class Options( class Options(
val nameCountToUseStarImport: Int, val nameCountToUseStarImport: Int,
val nameCountToUseStarImportForMembers: Int, val nameCountToUseStarImportForMembers: Int,
val isInPackagesToUseStarImport: (FqName) -> Boolean val isInPackagesToUseStarImport: (FqName) -> Boolean
@@ -106,9 +106,7 @@ class OptimizedImportsBuilder(
private fun tryBuildOptimizedImports(): List<ImportPath>? { private fun tryBuildOptimizedImports(): List<ImportPath>? {
val importsToGenerate = HashSet<ImportPath>() val importsToGenerate = HashSet<ImportPath>()
importRules importRules.filterIsInstance<ImportRule.Add>().mapTo(importsToGenerate) { it.importPath }
.filterIsInstance<ImportRule.Add>()
.mapTo(importsToGenerate) { it.importPath }
val descriptorsByParentFqName = HashMap<FqName, MutableSet<DeclarationDescriptor>>() val descriptorsByParentFqName = HashMap<FqName, MutableSet<DeclarationDescriptor>>()
for (descriptor in data.descriptorsToImport) { for (descriptor in data.descriptorsToImport) {
@@ -141,13 +139,11 @@ class OptimizedImportsBuilder(
val nameCountToUseStar = descriptors.first().nameCountToUseStar() val nameCountToUseStar = descriptors.first().nameCountToUseStar()
val useExplicitImports = fqNames.size < nameCountToUseStar && !options.isInPackagesToUseStarImport(parentFqName) val useExplicitImports = fqNames.size < nameCountToUseStar && !options.isInPackagesToUseStarImport(parentFqName)
|| !starImportPath.isAllowedByRules() || !starImportPath.isAllowedByRules()
if (useExplicitImports) { if (useExplicitImports) {
fqNames fqNames.filter(this::needExplicitImport).mapTo(importsToGenerate) { ImportPath(it, false) }
.filter(this::needExplicitImport)
.mapTo(importsToGenerate) { ImportPath(it, false) }
} else { } else {
descriptors descriptors.asSequence()
.asSequence()
.filterIsInstance<ClassDescriptor>() .filterIsInstance<ClassDescriptor>()
.map { it.importableFqName!! } .map { it.importableFqName!! }
.filterTo(classNamesToCheck, this::needExplicitImport) .filterTo(classNamesToCheck, this::needExplicitImport)
@@ -183,8 +179,11 @@ class OptimizedImportsBuilder(
val element = ref.element val element = ref.element
val bindingContext = element.analyze() val bindingContext = element.analyze()
val expressionToAnalyze = getExpressionToAnalyze(element) ?: continue val expressionToAnalyze = getExpressionToAnalyze(element) ?: continue
val newScope = val newScope = element.getResolutionScope(
element.getResolutionScope(bindingContext, file.getResolutionFacade()).replaceImportingScopes(newFileScope) bindingContext,
file.getResolutionFacade()
).replaceImportingScopes(newFileScope)
val newBindingContext = expressionToAnalyze.analyzeAsReplacement( val newBindingContext = expressionToAnalyze.analyzeAsReplacement(
expressionToAnalyze, expressionToAnalyze,
bindingContext, bindingContext,
@@ -272,10 +271,12 @@ class OptimizedImportsBuilder(
append("\n") append("\n")
} }
} }
val fileWithImports = KtPsiFactory(originalFile).createAnalyzableFile("Dummy_" + originalFile.name, fileText, originalFile) val fileWithImports = KtPsiFactory(originalFile).createAnalyzableFile("Dummy_" + originalFile.name, fileText, originalFile)
if (file.isScript()) { if (file.isScript()) {
fileWithImports.originalFile = originalFile fileWithImports.originalFile = originalFile
} }
return fileWithImports.getFileResolutionScope() return fileWithImports.getFileResolutionScope()
} }
@@ -312,12 +313,10 @@ class OptimizedImportsBuilder(
.filter { it.isNotEmpty() } .filter { it.isNotEmpty() }
} }
private fun canUseStarImport(descriptor: DeclarationDescriptor, fqName: FqName): Boolean { private fun canUseStarImport(descriptor: DeclarationDescriptor, fqName: FqName): Boolean = when {
return when { fqName.parent().isRoot -> false
fqName.parent().isRoot -> false (descriptor.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.OBJECT -> false
(descriptor.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.OBJECT -> false else -> true
else -> true
}
} }
private fun needExplicitImport(fqName: FqName): Boolean = hasAlias(fqName) || !isImportedByDefault(fqName) private fun needExplicitImport(fqName: FqName): Boolean = hasAlias(fqName) || !isImportedByDefault(fqName)
@@ -102,6 +102,7 @@ class KotlinImportOptimizer : ImportOptimizer {
element.acceptChildren(this) element.acceptChildren(this)
} }
}) })
size size
} else { } else {
0 0
@@ -205,12 +206,14 @@ class KotlinImportOptimizer : ImportOptimizer {
get() { get() {
val resolvesByNames = reference.resolvesByNames val resolvesByNames = reference.resolvesByNames
if (reference is KtInvokeFunctionReference) { if (reference is KtInvokeFunctionReference) {
val additionalNames = (reference.element.calleeExpression as? KtNameReferenceExpression) val additionalNames =
?.mainReference?.resolvesByNames (reference.element.calleeExpression as? KtNameReferenceExpression)?.mainReference?.resolvesByNames
if (additionalNames != null) { if (additionalNames != null) {
return resolvesByNames + additionalNames return resolvesByNames + additionalNames
} }
} }
return resolvesByNames return resolvesByNames
} }
@@ -223,6 +226,7 @@ class KotlinImportOptimizer : ImportOptimizer {
if (reference.getter) "Getter" else "Setter" if (reference.getter) "Getter" else "Setter"
) )
} }
else -> reference.toString().replace("DescriptorsImpl", "") else -> reference.toString().replace("DescriptorsImpl", "")
} }
} }
@@ -57,7 +57,7 @@ import org.jetbrains.kotlin.psi.psiUtil.siblings
import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.ImportPath
class KotlinUnusedImportInspection : AbstractKotlinInspection() { class KotlinUnusedImportInspection : AbstractKotlinInspection() {
data class ImportData(val unusedImports: List<KtImportDirective>, val optimizerData: OptimizedImportsBuilder.InputData) class ImportData(val unusedImports: List<KtImportDirective>, val optimizerData: OptimizedImportsBuilder.InputData)
companion object { companion object {
fun analyzeImports(file: KtFile): ImportData? { fun analyzeImports(file: KtFile): ImportData? {
@@ -128,6 +128,7 @@ class KotlinUnusedImportInspection : AbstractKotlinInspection() {
if (!KotlinCodeInsightWorkspaceSettings.getInstance(file.project).optimizeImportsOnTheFly) { if (!KotlinCodeInsightWorkspaceSettings.getInstance(file.project).optimizeImportsOnTheFly) {
fixes.add(EnableOptimizeImportsOnTheFlyFix(file)) fixes.add(EnableOptimizeImportsOnTheFlyFix(file))
} }
manager.createProblemDescriptor( manager.createProblemDescriptor(
it, it,
KotlinBundle.message("unused.import.directive"), KotlinBundle.message("unused.import.directive"),