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 (configuration.completeNonAccessibleDeclarations) return true
if (descriptor is DeclarationDescriptorWithVisibility && inDescriptor != null) { if (descriptor is DeclarationDescriptorWithVisibility && inDescriptor != null) {
return Visibilities.isVisible(descriptor as DeclarationDescriptorWithVisibility, inDescriptor) return Visibilities.isVisible(descriptor, inDescriptor)
} }
return true return true
@@ -104,12 +104,16 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess
protected fun getKotlinTopLevelDeclarations(): Collection<DeclarationDescriptor> { protected fun getKotlinTopLevelDeclarations(): Collection<DeclarationDescriptor> {
val filter = { (name: String) -> prefixMatcher.prefixMatches(name) } val filter = { (name: String) -> prefixMatcher.prefixMatches(name) }
return indicesHelper.getTopLevelCallables(filter, jetReference!!.expression, resolveSession, searchScope) + return (indicesHelper.getTopLevelCallables(filter, jetReference!!.expression, resolveSession, searchScope) +
indicesHelper.getTopLevelObjects(filter, resolveSession, searchScope) indicesHelper.getTopLevelObjects(filter, resolveSession, searchScope)).filter { isVisibleDescriptor(it) }
} }
protected fun getKotlinExtensions(): Collection<CallableDescriptor> { 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 (completeReference) {
if (shouldRunOnlyTypeCompletion()) { if (shouldRunOnlyTypeCompletion()) {
if (configuration.completeNonImportedDeclarations) { if (configuration.completeNonImportedDeclarations) {
TypesCompletion(parameters, resolveSession, prefixMatcher).addAllTypes(collector) addAllTypes()
} }
else { else {
addReferenceVariants { isPartOfTypeDeclaration(it) } addReferenceVariants { isPartOfTypeDeclaration(it) }
@@ -152,7 +156,7 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration,
private fun addNonImported() { private fun addNonImported() {
if (shouldRunTopLevelCompletion()) { if (shouldRunTopLevelCompletion()) {
TypesCompletion(parameters, resolveSession, prefixMatcher).addAllTypes(collector) addAllTypes()
collector.addDescriptorElements(getKotlinTopLevelDeclarations(), suppressAutoInsertion = true) 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.project.ResolveSessionForBodies
import org.jetbrains.jet.plugin.caches.KotlinIndicesHelper import org.jetbrains.jet.plugin.caches.KotlinIndicesHelper
import org.jetbrains.jet.plugin.search.searchScopeForSourceElementDependencies 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) { fun addAllTypes(result: LookupElementsCollector) {
result.addDescriptorElements(KotlinBuiltIns.getInstance().getNonPhysicalClasses().filter { prefixMatcher.prefixMatches(it.getName().asString()) }, result.addDescriptorElements(KotlinBuiltIns.getInstance().getNonPhysicalClasses().filter { prefixMatcher.prefixMatches(it.getName().asString()) },
suppressAutoInsertion = true) suppressAutoInsertion = true)
val project = parameters.getOriginalFile().getProject() val project = parameters.getOriginalFile().getProject()
val searchScope = searchScopeForSourceElementDependencies(parameters.getOriginalFile()) ?: return 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) suppressAutoInsertion = true)
if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) { 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) { if (JetFromJavaDescriptorHelper.getCompiledClassKind(aClass) != ClassKind.CLASS_OBJECT) {
val qualifiedName = aClass.getQualifiedName() val qualifiedName = aClass.getQualifiedName()
if (qualifiedName != null) { 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) collector.addDescriptorElements(descriptors, suppressAutoInsertion = true)
} }
} }