Code completion to filter out non-imported declarations by visibility

This commit is contained in:
Valentin Kipyatkov
2014-10-20 13:43:44 +04:00
parent b6d4de7046
commit 1f632daf85
2 changed files with 17 additions and 9 deletions
@@ -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<DeclarationDescriptor> {
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<CallableDescriptor> {
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)
}
@@ -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)
}
}