ImportOptimizer: cleanup code
This commit is contained in:
@@ -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"),
|
||||||
|
|||||||
Reference in New Issue
Block a user