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 (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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user