Fixed KT-1476 Code completion for not imported properties

#KT-1476 Fixed
This commit is contained in:
Valentin Kipyatkov
2014-08-12 17:58:47 +04:00
parent 6bcfa08fde
commit 9c138d8637
12 changed files with 89 additions and 16 deletions
@@ -163,10 +163,9 @@ public class JetShortNamesCache(private val project: Project) : PsiShortNamesCac
//TODO: this code is temporary and is to be dropped when compiled top level functions are indexed
val identifier = Name.identifier(name)
val topLevelFunctionFqNames = JetFromJavaDescriptorHelper.getTopLevelFunctionFqNames(project, scope, false)
for (fqName in topLevelFunctionFqNames) {
for (fqName in JetFromJavaDescriptorHelper.getTopLevelCallableFqNames(project, scope, false)) {
if (fqName.lastSegmentIs(identifier)) {
findCompiledTopLevelEntities(fqName, context, jetScope, resolveSession).filterIsInstanceTo(result, javaClass<FunctionDescriptor>())
findTopLevelCallables(fqName, context, jetScope, resolveSession).filterIsInstanceTo(result, javaClass<FunctionDescriptor>())
}
}
@@ -175,9 +174,10 @@ public class JetShortNamesCache(private val project: Project) : PsiShortNamesCac
return result
}
private fun findCompiledTopLevelEntities(fqName: FqName, context: JetExpression, jetScope: JetScope, resolveSession: ResolveSessionForBodies): Collection<DeclarationDescriptor> {
private fun findTopLevelCallables(fqName: FqName, context: JetExpression, jetScope: JetScope, resolveSession: ResolveSessionForBodies): Collection<DeclarationDescriptor> {
val importDirective = JetPsiFactory(context.getProject()).createImportDirective(ImportPath(fqName, false))
return QualifiedExpressionResolver().analyseImportReference(importDirective, jetScope, BindingTraceContext(), resolveSession.getModuleDescriptor())
val allDescriptors = QualifiedExpressionResolver().analyseImportReference(importDirective, jetScope, BindingTraceContext(), resolveSession.getModuleDescriptor())
return allDescriptors.filterIsInstance(javaClass<CallableDescriptor>()).filter { it.getReceiverParameter() == null }
}
private fun MutableCollection<in FunctionDescriptor>.addJetSourceTopLevelFunctions(name: String, resolveSession: ResolveSessionForBodies, scope: GlobalSearchScope) {
@@ -198,19 +198,17 @@ public class JetShortNamesCache(private val project: Project) : PsiShortNamesCac
private fun getJetExtensionFunctionsByName(name: String, scope: GlobalSearchScope): Collection<PsiElement>
= JetTopLevelExtensionFunctionShortNameIndex.getInstance().get(name, project, scope)
// TODO: Make it work for properties
public fun getJetTopLevelCallables(nameFilter: (String) -> Boolean, context: JetExpression /*TODO: to be dropped*/, resolveSession: ResolveSessionForBodies, scope: GlobalSearchScope): Collection<DeclarationDescriptor> {
val result = ArrayList<DeclarationDescriptor>()
JetTopLevelNonExtensionFunctionShortNameIndex.getInstance().getAllKeys(project)
.stream()
.filter(nameFilter)
.forEach { result.addJetSourceTopLevelFunctions(it, resolveSession, scope) }
val sourceNames = JetTopLevelFunctionsFqnNameIndex.getInstance().getAllKeys(project).stream() + JetTopLevelPropertiesFqnNameIndex.getInstance().getAllKeys(project).stream()
val allFqNames = sourceNames.map { FqName(it) } + JetFromJavaDescriptorHelper.getTopLevelCallableFqNames(project, scope, false).stream()
val jetScope = resolveSession.resolveToElement(context).get(BindingContext.RESOLUTION_SCOPE, context) ?: return listOf()
JetFromJavaDescriptorHelper.getTopLevelFunctionFqNames(project, scope, false)
.filter { nameFilter(it.shortName().asString()) }
.flatMapTo(result) { findCompiledTopLevelEntities(it, context, jetScope, resolveSession) }
allFqNames.filter { nameFilter(it.shortName().asString()) }
.toList()
.flatMapTo(result) { findTopLevelCallables(it, context, jetScope, resolveSession) }
return result
}
@@ -231,7 +229,7 @@ public class JetShortNamesCache(private val project: Project) : PsiShortNamesCac
val functionFQNs = extensionFunctionsFromSourceFqNames(nameFilter, scope)
JetFromJavaDescriptorHelper.getTopLevelFunctionFqNames(project, scope, true)
JetFromJavaDescriptorHelper.getTopLevelCallableFqNames(project, scope, true)
.filterTo(functionFQNs) { nameFilter(it.shortName().asString()) }
// Iterate through the function with attempt to resolve found functions
@@ -48,7 +48,7 @@ class LookupElementsCollector(private val prefixMatcher: PrefixMatcher,
}
public fun addDescriptorElements(descriptor: DeclarationDescriptor) {
if (!descriptorFilter(descriptor)) return
if (!descriptorFilter(descriptor)) return
addElement(DescriptorLookupConverter.createLookupElement(resolveSession, descriptor))