Moved import policy into ImportInsertHelper

This commit is contained in:
Valentin Kipyatkov
2015-01-27 14:14:54 +03:00
parent 952c64f947
commit 09a99ae605
15 changed files with 55 additions and 45 deletions
@@ -160,7 +160,7 @@ public object ShortenReferences {
if (canShortenNow) {
elementsToShorten.add(element)
}
else if (target !in failedToImportDescriptors && mayImport(target)) {
else if (target !in failedToImportDescriptors && mayImport(target, file)) {
descriptorsToImport.add(target)
}
else {
@@ -295,29 +295,25 @@ public object ShortenReferences {
?: listOf()
}
//TODO: move into ImportInsertHelper
private fun mayImport(descriptor: DeclarationDescriptor): Boolean {
return when (descriptor) {
is ClassDescriptor -> descriptor.getContainingDeclaration() is PackageFragmentDescriptor
is PackageViewDescriptor -> true //TODO: option
else -> false
}
private fun mayImport(descriptor: DeclarationDescriptor, file: JetFile): Boolean {
if (descriptor !is ClassDescriptor && descriptor !is PackageViewDescriptor) return false
return ImportInsertHelper.getInstance(file.getProject()).mayImportByCodeStyle(descriptor)
}
// this class is needed to optimize imports only when we actually insert any import (optimization)
private class ImportInserter(val file: JetFile) {
private var optimizeImports = true
private val helper = ImportInsertHelper.getInstance(file.getProject())
fun addImport(target: DeclarationDescriptor): ImportInsertHelper.ImportDescriptorResult {
if (!mayImport(target)) return ImportInsertHelper.ImportDescriptorResult.FAIL
optimizeImports()
return ImportInsertHelper.INSTANCE.importDescriptor(file, target)
return helper.importDescriptor(file, target)
}
fun optimizeImports(): Boolean {
if (!optimizeImports) return false
optimizeImports = false
return ImportInsertHelper.INSTANCE.optimizeImportsOnTheFly(file)
return helper.optimizeImportsOnTheFly(file)
}
}
}
@@ -16,27 +16,30 @@
package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.components.ServiceManager
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.JetImportDirective
import org.jetbrains.kotlin.resolve.ImportPath
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade
import com.intellij.openapi.project.Project
import com.intellij.openapi.components.ServiceManager
import kotlin.platform.platformStatic
public trait ImportInsertHelper {
public abstract class ImportInsertHelper {
public fun addImportDirectiveIfNeeded(importFqn: FqName, file: JetFile)
public abstract fun addImportDirectiveIfNeeded(importFqn: FqName, file: JetFile)
public fun optimizeImportsOnTheFly(file: JetFile): Boolean
public abstract fun optimizeImportsOnTheFly(file: JetFile): Boolean
public fun isImportedWithDefault(importPath: ImportPath, contextFile: JetFile): Boolean
public abstract fun isImportedWithDefault(importPath: ImportPath, contextFile: JetFile): Boolean
public fun needImport(fqName: FqName, file: JetFile): Boolean = needImport(ImportPath(fqName, false), file)
public fun needImport(importPath: ImportPath, file: JetFile, importDirectives: List<JetImportDirective> = file.getImportDirectives()): Boolean
public abstract fun needImport(importPath: ImportPath, file: JetFile, importDirectives: List<JetImportDirective> = file.getImportDirectives()): Boolean
public fun writeImportToFile(importPath: ImportPath, file: JetFile): JetImportDirective
public abstract fun writeImportToFile(importPath: ImportPath, file: JetFile): JetImportDirective
public abstract fun mayImportByCodeStyle(descriptor: DeclarationDescriptor): Boolean
public enum class ImportDescriptorResult {
FAIL
@@ -44,10 +47,11 @@ public trait ImportInsertHelper {
ALREADY_IMPORTED
}
public fun importDescriptor(file: JetFile, descriptor: DeclarationDescriptor): ImportDescriptorResult
public abstract fun importDescriptor(file: JetFile, descriptor: DeclarationDescriptor): ImportDescriptorResult
class object {
public val INSTANCE: ImportInsertHelper
get() = ServiceManager.getService<ImportInsertHelper>(javaClass<ImportInsertHelper>())
[platformStatic]
public fun getInstance(project: Project): ImportInsertHelper
= ServiceManager.getService<ImportInsertHelper>(project, javaClass<ImportInsertHelper>())
}
}