Initial version of completing unimported file facades

This commit is contained in:
Pavel V. Talanov
2015-09-08 16:30:27 +03:00
parent 4106a0d736
commit d077b63fae
2 changed files with 21 additions and 4 deletions
@@ -23,11 +23,14 @@ import com.intellij.psi.PsiMethod
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.PsiShortNamesCache import com.intellij.psi.search.PsiShortNamesCache
import com.intellij.util.Processor import com.intellij.util.Processor
import com.intellij.util.containers.ContainerUtil
import com.intellij.util.containers.HashSet import com.intellij.util.containers.HashSet
import org.jetbrains.kotlin.asJava.JavaElementFinder import org.jetbrains.kotlin.asJava.JavaElementFinder
import org.jetbrains.kotlin.idea.stubindex.JetClassShortNameIndex import org.jetbrains.kotlin.idea.stubindex.JetClassShortNameIndex
import org.jetbrains.kotlin.idea.stubindex.JetFileFacadeClassIndex
import org.jetbrains.kotlin.idea.stubindex.JetFunctionShortNameIndex import org.jetbrains.kotlin.idea.stubindex.JetFunctionShortNameIndex
import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil
import org.jetbrains.kotlin.name.FqName
import java.util.* import java.util.*
public class JetShortNamesCache(private val project: Project) : PsiShortNamesCache() { public class JetShortNamesCache(private val project: Project) : PsiShortNamesCache() {
@@ -40,6 +43,7 @@ public class JetShortNamesCache(private val project: Project) : PsiShortNamesCac
// package classes can not be indexed, since they have no explicit declarations // package classes can not be indexed, since they have no explicit declarations
val packageClassShortNames = PackageIndexUtil.getAllPossiblePackageClasses(project).keySet() val packageClassShortNames = PackageIndexUtil.getAllPossiblePackageClasses(project).keySet()
classNames.addAll(packageClassShortNames) classNames.addAll(packageClassShortNames)
classNames.addAll(JetFileFacadeClassIndex.getAllFacadeShortNames(project))
return classNames.toTypedArray() return classNames.toTypedArray()
} }
@@ -47,13 +51,13 @@ public class JetShortNamesCache(private val project: Project) : PsiShortNamesCac
/** /**
* Return class names form kotlin sources in given scope which should be visible as Java classes. * Return class names form kotlin sources in given scope which should be visible as Java classes.
*/ */
override fun getClassesByName(name: String, scope: com.intellij.psi.search.GlobalSearchScope): Array<PsiClass> { override fun getClassesByName(name: String, scope: GlobalSearchScope): Array<PsiClass> {
val result = ArrayList<PsiClass>() val result = ArrayList<PsiClass>()
val packageClasses = PackageIndexUtil.getAllPossiblePackageClasses(project) val packageClasses = PackageIndexUtil.getAllPossiblePackageClasses(project)
// package classes can not be indexed, since they have no explicit declarations // package classes can not be indexed, since they have no explicit declarations
val fqNames = packageClasses.get(name) val fqNames = packageClasses.get(name) + JetFileFacadeClassIndex.getInstance().getAllKeys(project).map { FqName(it) }.filter { it.shortName().asString() == name }
for (fqName in fqNames) { for (fqName in fqNames) {
val psiClass = JavaElementFinder.getInstance(project).findClass(fqName.asString(), scope) val psiClass = JavaElementFinder.getInstance(project).findClass(fqName.asString(), scope)
if (psiClass != null) { if (psiClass != null) {
@@ -67,7 +71,7 @@ public class JetShortNamesCache(private val project: Project) : PsiShortNamesCac
val fqName = classOrObject.getFqName() val fqName = classOrObject.getFqName()
if (fqName != null) { if (fqName != null) {
assert(fqName.shortName().asString() == name) { "A declaration obtained from index has non-matching name:\n" + "in index: " + name + "\n" + "declared: " + fqName.shortName() + "(" + fqName + ")" } assert(fqName.shortName().asString() == name) { "A declaration obtained from index has non-matching name:\n" + "in index: " + name + "\n" + "declared: " + fqName.shortName() + "(" + fqName + ")" }
val psiClass = org.jetbrains.kotlin.asJava.JavaElementFinder.getInstance(project).findClass(fqName.asString(), scope) val psiClass = JavaElementFinder.getInstance(project).findClass(fqName.asString(), scope)
if (psiClass != null) { if (psiClass != null) {
result.add(psiClass) result.add(psiClass)
} }
@@ -91,7 +95,7 @@ public class JetShortNamesCache(private val project: Project) : PsiShortNamesCac
= emptyArray() = emptyArray()
override fun processMethodsWithName(name: String, scope: GlobalSearchScope, processor: Processor<PsiMethod>): Boolean override fun processMethodsWithName(name: String, scope: GlobalSearchScope, processor: Processor<PsiMethod>): Boolean
= com.intellij.util.containers.ContainerUtil.process(getMethodsByName(name, scope), processor) = ContainerUtil.process(getMethodsByName(name, scope), processor)
override fun getAllMethodNames(): Array<String> override fun getAllMethodNames(): Array<String>
= JetFunctionShortNameIndex.getInstance().getAllKeys(project).toTypedArray() = JetFunctionShortNameIndex.getInstance().getAllKeys(project).toTypedArray()
@@ -20,6 +20,10 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.stubs.StringStubIndexExtension import com.intellij.psi.stubs.StringStubIndexExtension
import com.intellij.psi.stubs.StubIndexKey import com.intellij.psi.stubs.StubIndexKey
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import com.intellij.psi.util.PsiModificationTracker
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFile
public class JetFileFacadeClassIndex private constructor() : StringStubIndexExtension<JetFile>() { public class JetFileFacadeClassIndex private constructor() : StringStubIndexExtension<JetFile>() {
@@ -32,5 +36,14 @@ public class JetFileFacadeClassIndex private constructor() : StringStubIndexExte
private val KEY = KotlinIndexUtil.createIndexKey(JetFileFacadeClassIndex::class.java) private val KEY = KotlinIndexUtil.createIndexKey(JetFileFacadeClassIndex::class.java)
public val INSTANCE: JetFileFacadeClassIndex = JetFileFacadeClassIndex() public val INSTANCE: JetFileFacadeClassIndex = JetFileFacadeClassIndex()
public @jvmStatic fun getInstance(): JetFileFacadeClassIndex = INSTANCE public @jvmStatic fun getInstance(): JetFileFacadeClassIndex = INSTANCE
public fun getAllFacadeShortNames(project: Project): Collection<String> {
return CachedValuesManager.getManager(project).getCachedValue(project) {
val shortNames = getInstance().getAllKeys(project).map {
FqName(it).shortName().asString()
}
CachedValueProvider.Result(shortNames, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT)
}
}
} }
} }