temporary solution for all classes completion for Kotlin/Javascript libraries

This commit is contained in:
Michael Nedzelsky
2015-02-20 17:39:50 +03:00
parent 094bd1da4b
commit 21ef6d5771
@@ -17,18 +17,23 @@
package org.jetbrains.kotlin.idea.completion
import com.intellij.codeInsight.completion.*
import com.intellij.openapi.roots.ProjectRootModificationTracker
import org.jetbrains.kotlin.asJava.KotlinLightClass
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
import org.jetbrains.kotlin.idea.caches.KotlinIndicesHelper
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.impl.*
import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.resolve.scopes.*
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.resolve.DescriptorUtils
class AllClassesCompletion(val parameters: CompletionParameters,
val lookupElementFactory: LookupElementFactory,
@@ -52,8 +57,24 @@ class AllClassesCompletion(val parameters: CompletionParameters,
if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) {
addAdaptedJavaCompletion(result)
}
else {
//TODO: this is a temporary solution for Kotlin/Javascript library until we have virtual file system based on serialized descriptors
addKotlinJavascriptCompletion(result)
}
}
private fun addKotlinJavascriptCompletion(collector: LookupElementsCollector) {
val classDescriptors = allClassDescriptors.getValue().filter { prefixMatcher.prefixMatches(it.getName().asString()) && kindFilter(it.getKind()) }
collector.addDescriptorElements(classDescriptors, suppressAutoInsertion = true)
}
private val allClassDescriptors = CachedValuesManager.getManager(scope.getProject()).createCachedValue( {
val provider = (moduleDescriptor as ModuleDescriptorImpl).getPackageFragmentProvider()
val fragments = DescriptorUtils.getPackagesFqNames(moduleDescriptor).flatMap { provider.getPackageFragments(it) }
val classDescriptors = fragments.flatMap { it.getMemberScope().getAllDescriptors().filter { it is ClassDescriptor} }.map { it as ClassDescriptor }
CachedValueProvider.Result(classDescriptors, ProjectRootModificationTracker.getInstance(scope.getProject()))
}, false)
private fun addAdaptedJavaCompletion(collector: LookupElementsCollector) {
AllClassesGetter.processJavaClasses(parameters, prefixMatcher, true, { psiClass ->
if (psiClass!! !is KotlinLightClass) { // Kotlin class should have already been added as kotlin element before