From 1f632daf8534784d86e829566fdc5240a249c56b Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 20 Oct 2014 13:43:44 +0400 Subject: [PATCH] Code completion to filter out non-imported declarations by visibility --- .../jet/plugin/completion/CompletionSession.kt | 16 ++++++++++------ .../jet/plugin/completion/TypesCompletion.kt | 10 +++++++--- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt index 3404c6f21f6..43ae1939169 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt @@ -69,7 +69,7 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess if (configuration.completeNonAccessibleDeclarations) return true if (descriptor is DeclarationDescriptorWithVisibility && inDescriptor != null) { - return Visibilities.isVisible(descriptor as DeclarationDescriptorWithVisibility, inDescriptor) + return Visibilities.isVisible(descriptor, inDescriptor) } return true @@ -104,12 +104,16 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess protected fun getKotlinTopLevelDeclarations(): Collection { val filter = { (name: String) -> prefixMatcher.prefixMatches(name) } - return indicesHelper.getTopLevelCallables(filter, jetReference!!.expression, resolveSession, searchScope) + - indicesHelper.getTopLevelObjects(filter, resolveSession, searchScope) + return (indicesHelper.getTopLevelCallables(filter, jetReference!!.expression, resolveSession, searchScope) + + indicesHelper.getTopLevelObjects(filter, resolveSession, searchScope)).filter { isVisibleDescriptor(it) } } protected fun getKotlinExtensions(): Collection { - return indicesHelper.getCallableExtensions({ prefixMatcher.prefixMatches(it) }, jetReference!!.expression, resolveSession, searchScope) + return indicesHelper.getCallableExtensions({ prefixMatcher.prefixMatches(it) }, jetReference!!.expression, resolveSession, searchScope).filter { isVisibleDescriptor(it) } + } + + protected fun addAllTypes() { + TypesCompletion(parameters, resolveSession, prefixMatcher, { isVisibleDescriptor(it) }).addAllTypes(collector) } } @@ -127,7 +131,7 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, if (completeReference) { if (shouldRunOnlyTypeCompletion()) { if (configuration.completeNonImportedDeclarations) { - TypesCompletion(parameters, resolveSession, prefixMatcher).addAllTypes(collector) + addAllTypes() } else { addReferenceVariants { isPartOfTypeDeclaration(it) } @@ -152,7 +156,7 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, private fun addNonImported() { if (shouldRunTopLevelCompletion()) { - TypesCompletion(parameters, resolveSession, prefixMatcher).addAllTypes(collector) + addAllTypes() collector.addDescriptorElements(getKotlinTopLevelDeclarations(), suppressAutoInsertion = true) } diff --git a/idea/src/org/jetbrains/jet/plugin/completion/TypesCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/TypesCompletion.kt index 1ae53660aea..e4c3e01a39d 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/TypesCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/TypesCompletion.kt @@ -30,15 +30,19 @@ import org.jetbrains.jet.plugin.project.ProjectStructureUtil import org.jetbrains.jet.plugin.project.ResolveSessionForBodies import org.jetbrains.jet.plugin.caches.KotlinIndicesHelper import org.jetbrains.jet.plugin.search.searchScopeForSourceElementDependencies +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor -class TypesCompletion(val parameters: CompletionParameters, val resolveSession: ResolveSessionForBodies, val prefixMatcher: PrefixMatcher) { +class TypesCompletion(val parameters: CompletionParameters, + val resolveSession: ResolveSessionForBodies, + val prefixMatcher: PrefixMatcher, + val visibilityFilter: (DeclarationDescriptor) -> Boolean) { fun addAllTypes(result: LookupElementsCollector) { result.addDescriptorElements(KotlinBuiltIns.getInstance().getNonPhysicalClasses().filter { prefixMatcher.prefixMatches(it.getName().asString()) }, suppressAutoInsertion = true) val project = parameters.getOriginalFile().getProject() val searchScope = searchScopeForSourceElementDependencies(parameters.getOriginalFile()) ?: return - result.addDescriptorElements(KotlinIndicesHelper(project).getClassDescriptors({ prefixMatcher.prefixMatches(it) }, resolveSession, searchScope), + result.addDescriptorElements(KotlinIndicesHelper(project).getClassDescriptors({ prefixMatcher.prefixMatches(it) }, resolveSession, searchScope).filter(visibilityFilter), suppressAutoInsertion = true) if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) { @@ -66,7 +70,7 @@ class TypesCompletion(val parameters: CompletionParameters, val resolveSession: if (JetFromJavaDescriptorHelper.getCompiledClassKind(aClass) != ClassKind.CLASS_OBJECT) { val qualifiedName = aClass.getQualifiedName() if (qualifiedName != null) { - val descriptors = ResolveSessionUtils.getClassDescriptorsByFqName(resolveSession.getModuleDescriptor(), FqName(qualifiedName)) + val descriptors = ResolveSessionUtils.getClassDescriptorsByFqName(resolveSession.getModuleDescriptor(), FqName(qualifiedName)).filter(visibilityFilter) collector.addDescriptorElements(descriptors, suppressAutoInsertion = true) } }