Import insertion algorithm

This commit is contained in:
Valentin Kipyatkov
2015-01-22 23:04:32 +03:00
parent 975b67ed29
commit dfe71ef7ae
83 changed files with 1033 additions and 73 deletions
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.psi.JetDeclaration
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.scopes.JetScope
private val LOG = Logger.getInstance(javaClass<KotlinCacheService>())
@@ -66,6 +67,10 @@ public class KotlinCacheService(val project: Project) {
return cache.getAnalysisResultsForElements(elements)
}
override fun getFileTopLevelScope(file: JetFile): JetScope {
return getLazyResolveSession(file).getScopeProvider().getFileScope(file)
}
override fun <T> get(extension: CacheExtension<T>): T {
return cache[extension]
}
@@ -23,6 +23,8 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.psi.JetDeclaration
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.resolve.scopes.JetScope
public trait ResolutionFacade {
@@ -32,6 +34,8 @@ public trait ResolutionFacade {
public fun resolveToDescriptor(declaration: JetDeclaration): DeclarationDescriptor
public fun getFileTopLevelScope(file: JetFile): JetScope
public fun findModuleDescriptor(element: JetElement): ModuleDescriptor
public fun <T> get(extension: CacheExtension<T>): T
@@ -27,16 +27,15 @@ import com.intellij.psi.util.PsiTreeUtil
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiDocumentManager
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.resolve.DescriptorUtils
import java.util.Collections
import org.jetbrains.kotlin.analyzer.analyzeInContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getCalleeExpressionIfAny
import java.util.LinkedHashSet
import org.jetbrains.kotlin.resolve.ImportPath
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElement
import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.resolve.DescriptorUtils
public object ShortenReferences {
public fun process(element: JetElement) {
@@ -303,17 +302,9 @@ public object ShortenReferences {
private var optimizeImports = true
fun addImport(target: DeclarationDescriptor): Boolean {
val realTarget = if (DescriptorUtils.isClassObject(target)) // references to class object are treated as ones to its owner class
target.getContainingDeclaration() as? ClassDescriptor ?: return false
else
target
if (realTarget !is ClassDescriptor && realTarget !is PackageViewDescriptor) return false
if (realTarget.getContainingDeclaration() is ClassDescriptor) return false // do not insert imports for nested classes
if (target !is ClassDescriptor && target !is PackageViewDescriptor) return false
optimizeImports()
ImportInsertHelper.INSTANCE.writeImportToFile(ImportPath(DescriptorUtils.getFqNameSafe(realTarget), false), file)
return true
return ImportInsertHelper.INSTANCE.importDescriptor(file, target)
}
fun optimizeImports(): Boolean {
@@ -21,6 +21,8 @@ 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
public trait ImportInsertHelper {
@@ -34,7 +36,13 @@ public trait ImportInsertHelper {
public fun needImport(importPath: ImportPath, file: JetFile, importDirectives: List<JetImportDirective> = file.getImportDirectives()): Boolean
public fun writeImportToFile(importPath: ImportPath, file: JetFile)
public fun writeImportToFile(importPath: ImportPath, file: JetFile): JetImportDirective
/**
* Returns true, if the descriptor is imported (even if no import was added because it's not needed)
* and false, if importing of this descriptor is either impossible or not allowed by code style.
*/
public fun importDescriptor(file: JetFile, descriptor: DeclarationDescriptor): Boolean
class object {
public val INSTANCE: ImportInsertHelper