Import insertion algorithm
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user