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
|
package org.jetbrains.kotlin.idea.completion
|
||||||
|
|
||||||
import com.intellij.codeInsight.completion.*
|
import com.intellij.codeInsight.completion.*
|
||||||
|
import com.intellij.openapi.roots.ProjectRootModificationTracker
|
||||||
import org.jetbrains.kotlin.asJava.KotlinLightClass
|
import org.jetbrains.kotlin.asJava.KotlinLightClass
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
|
||||||
import org.jetbrains.kotlin.psi.JetFile
|
import org.jetbrains.kotlin.psi.JetFile
|
||||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
||||||
import org.jetbrains.kotlin.idea.caches.KotlinIndicesHelper
|
import org.jetbrains.kotlin.idea.caches.KotlinIndicesHelper
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
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.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade
|
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|
||||||
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
|
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
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,
|
class AllClassesCompletion(val parameters: CompletionParameters,
|
||||||
val lookupElementFactory: LookupElementFactory,
|
val lookupElementFactory: LookupElementFactory,
|
||||||
@@ -52,8 +57,24 @@ class AllClassesCompletion(val parameters: CompletionParameters,
|
|||||||
if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) {
|
if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) {
|
||||||
addAdaptedJavaCompletion(result)
|
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) {
|
private fun addAdaptedJavaCompletion(collector: LookupElementsCollector) {
|
||||||
AllClassesGetter.processJavaClasses(parameters, prefixMatcher, true, { psiClass ->
|
AllClassesGetter.processJavaClasses(parameters, prefixMatcher, true, { psiClass ->
|
||||||
if (psiClass!! !is KotlinLightClass) { // Kotlin class should have already been added as kotlin element before
|
if (psiClass!! !is KotlinLightClass) { // Kotlin class should have already been added as kotlin element before
|
||||||
|
|||||||
Reference in New Issue
Block a user