Code completion to filter out non-imported declarations by visibility
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user