KtCodeFragement to implement getImportDirectives() correctly

This commit is contained in:
Valentin Kipyatkov
2015-11-10 16:23:38 +03:00
parent afc968fe83
commit 8942780640
3 changed files with 13 additions and 20 deletions
@@ -39,7 +39,7 @@ public abstract class KtCodeFragment(
): KtFile((PsiManager.getInstance(_project) as PsiManagerEx).getFileManager().createFileViewProvider(LightVirtualFile(name, KotlinFileType.INSTANCE, text), true), false), JavaCodeFragment {
private var viewProvider = super<KtFile>.getViewProvider() as SingleRootFileViewProvider
private var myImports = LinkedHashSet<String>()
private var imports = LinkedHashSet<String>()
private val additionalContextForLambda: PsiElement? by lazy {
this.getCopyableUserData(ADDITIONAL_CONTEXT_FOR_LAMBDA)?.invoke()
}
@@ -76,7 +76,7 @@ public abstract class KtCodeFragment(
override fun clone(): KtCodeFragment {
val clone = cloneImpl(calcTreeElement().clone() as FileElement) as KtCodeFragment
clone.setOriginalFile(this)
clone.myImports = myImports
clone.imports = imports
clone.viewProvider = SingleRootFileViewProvider(PsiManager.getInstance(_project), LightVirtualFile(getName(), KotlinFileType.INSTANCE, getText()), true)
clone.viewProvider.forceCachedPsi(clone)
return clone
@@ -97,12 +97,12 @@ public abstract class KtCodeFragment(
}
override fun importsToString(): String {
return myImports.joinToString(IMPORT_SEPARATOR)
return imports.joinToString(IMPORT_SEPARATOR)
}
override fun addImportsFromString(imports: String?) {
if (imports == null || imports.isEmpty()) return
myImports.addAll(imports.split(IMPORT_SEPARATOR))
this.imports.addAll(imports.split(IMPORT_SEPARATOR))
// we need this code to force re-highlighting, otherwise it does not work by some reason
val tempElement = KtPsiFactory(project).createColon()
@@ -110,7 +110,11 @@ public abstract class KtCodeFragment(
}
public fun importsAsImportList(): KtImportList? {
return KtPsiFactory(this).createFile(myImports.joinToString("\n")).getImportList()
return KtPsiFactory(this).createFile(imports.joinToString("\n")).getImportList()
}
override fun getImportDirectives(): List<KtImportDirective> {
return importsAsImportList()?.imports ?: emptyList()
}
override fun setVisibilityChecker(checker: JavaCodeFragment.VisibilityChecker?) { }
@@ -129,7 +133,7 @@ public abstract class KtCodeFragment(
private fun initImports(imports: String?) {
if (imports != null && !imports.isEmpty()) {
myImports.addAll(imports.split(IMPORT_SEPARATOR).map { it.check { it.startsWith("import ") } ?: "import $it" })
this.imports.addAll(imports.split(IMPORT_SEPARATOR).map { it.check { it.startsWith("import ") } ?: "import $it" })
}
}
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.resolve.lazy
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.SubpackagesScope
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtCodeFragment
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtImportDirective
import org.jetbrains.kotlin.psi.KtImportsFactory
@@ -64,10 +63,7 @@ public open class FileScopeProviderImpl(
val debugName = "LazyFileScope for file " + file.getName()
val tempTrace = TemporaryBindingTrace.create(bindingTrace, "Transient trace for default imports lazy resolve")
val imports = if (file is KtCodeFragment)
file.importsAsImportList()?.getImports() ?: listOf()
else
file.getImportDirectives()
val imports = file.importDirectives
val packageView = moduleDescriptor.getPackage(file.getPackageFqName())
val packageFragment = topLevelDescriptorProvider.getPackageFragment(file.getPackageFqName())
@@ -143,7 +143,7 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert
val targetFqName = target.importableFqName ?: return ImportDescriptorResult.FAIL
if (isAlreadyImported(target, topLevelScope, targetFqName)) return ImportDescriptorResult.ALREADY_IMPORTED
val imports = getImports(file)
val imports = file.importDirectives
if (imports.any { !it.isAllUnder && it.importPath?.fqnPart() == targetFqName }) {
return ImportDescriptorResult.FAIL
@@ -186,7 +186,7 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert
val fqName = target.importableFqName ?: return ImportDescriptorResult.FAIL
val containerFqName = fqName.parent()
val imports = getImports(file)
val imports = file.importDirectives
val starImportPath = ImportPath(containerFqName, true)
if (imports.any { it.importPath == starImportPath }) {
@@ -426,11 +426,4 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert
}
}
}
private fun getImports(file: KtFile): List<KtImportDirective> {
return if (file is KtCodeFragment)
file.importsAsImportList()?.imports ?: listOf()
else
file.importDirectives
}
}