diff --git a/idea/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt b/idea/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt index bd7525118e2..e2efdfa91d7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt +++ b/idea/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt @@ -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