temporary solution for all classes completion for Kotlin/Javascript libraries
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user