Minor refactoring of KotlinIndicesHelper
This commit is contained in:
@@ -38,17 +38,19 @@ import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver.LookupMode
|
|||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue
|
||||||
import org.jetbrains.jet.lang.resolve.calls.smartcasts.DataFlowInfo
|
import org.jetbrains.jet.lang.resolve.calls.smartcasts.DataFlowInfo
|
||||||
|
|
||||||
public class KotlinIndicesHelper(private val project: Project) {
|
public class KotlinIndicesHelper(private val project: Project,
|
||||||
public fun getTopLevelObjects(nameFilter: (String) -> Boolean, resolveSession: ResolveSessionForBodies, scope: GlobalSearchScope): Collection<ClassDescriptor> {
|
private val resolveSession: ResolveSessionForBodies,
|
||||||
|
private val scope: GlobalSearchScope) {
|
||||||
|
public fun getTopLevelObjects(nameFilter: (String) -> Boolean): Collection<ClassDescriptor> {
|
||||||
val allObjectNames = JetTopLevelObjectShortNameIndex.getInstance().getAllKeys(project).stream() +
|
val allObjectNames = JetTopLevelObjectShortNameIndex.getInstance().getAllKeys(project).stream() +
|
||||||
JetFromJavaDescriptorHelper.getPossiblePackageDeclarationsNames(project, scope).stream()
|
JetFromJavaDescriptorHelper.getPossiblePackageDeclarationsNames(project, scope).stream()
|
||||||
return allObjectNames
|
return allObjectNames
|
||||||
.filter(nameFilter)
|
.filter(nameFilter)
|
||||||
.toSet()
|
.toSet()
|
||||||
.flatMap { getTopLevelObjectsByName(it, resolveSession, scope) }
|
.flatMap { getTopLevelObjectsByName(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getTopLevelObjectsByName(name: String, resolveSession: ResolveSessionForBodies, scope: GlobalSearchScope): Collection<ClassDescriptor> {
|
private fun getTopLevelObjectsByName(name: String): Collection<ClassDescriptor> {
|
||||||
val result = hashSetOf<ClassDescriptor>()
|
val result = hashSetOf<ClassDescriptor>()
|
||||||
|
|
||||||
val topObjects = JetTopLevelObjectShortNameIndex.getInstance().get(name, project, scope)
|
val topObjects = JetTopLevelObjectShortNameIndex.getInstance().get(name, project, scope)
|
||||||
@@ -67,7 +69,7 @@ public class KotlinIndicesHelper(private val project: Project) {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun getTopLevelCallablesByName(name: String, context: JetExpression /*TODO: to be dropped*/, resolveSession: ResolveSessionForBodies, scope: GlobalSearchScope): Collection<CallableDescriptor> {
|
public fun getTopLevelCallablesByName(name: String, context: JetExpression /*TODO: to be dropped*/): Collection<CallableDescriptor> {
|
||||||
val jetScope = resolveSession.resolveToElement(context).get(BindingContext.RESOLUTION_SCOPE, context) ?: return listOf()
|
val jetScope = resolveSession.resolveToElement(context).get(BindingContext.RESOLUTION_SCOPE, context) ?: return listOf()
|
||||||
|
|
||||||
val result = HashSet<CallableDescriptor>()
|
val result = HashSet<CallableDescriptor>()
|
||||||
@@ -76,17 +78,17 @@ public class KotlinIndicesHelper(private val project: Project) {
|
|||||||
val identifier = Name.identifier(name)
|
val identifier = Name.identifier(name)
|
||||||
for (fqName in JetFromJavaDescriptorHelper.getTopLevelCallableFqNames(project, scope, false)) {
|
for (fqName in JetFromJavaDescriptorHelper.getTopLevelCallableFqNames(project, scope, false)) {
|
||||||
if (fqName.lastSegmentIs(identifier)) {
|
if (fqName.lastSegmentIs(identifier)) {
|
||||||
result.addAll(findTopLevelCallables(fqName, context, jetScope, resolveSession))
|
result.addAll(findTopLevelCallables(fqName, context, jetScope))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.addSourceTopLevelFunctions(name, resolveSession, scope)
|
result.addSourceTopLevelFunctions(name)
|
||||||
result.addSourceTopLevelProperties(name, resolveSession, scope)
|
result.addSourceTopLevelProperties(name)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun MutableCollection<in FunctionDescriptor>.addSourceTopLevelFunctions(name: String, resolveSession: ResolveSessionForBodies, scope: GlobalSearchScope) {
|
private fun MutableCollection<in FunctionDescriptor>.addSourceTopLevelFunctions(name: String) {
|
||||||
val identifier = Name.identifier(name)
|
val identifier = Name.identifier(name)
|
||||||
val affectedPackages = JetTopLevelNonExtensionFunctionShortNameIndex.getInstance().get(name, project, scope)
|
val affectedPackages = JetTopLevelNonExtensionFunctionShortNameIndex.getInstance().get(name, project, scope)
|
||||||
.stream()
|
.stream()
|
||||||
@@ -102,7 +104,7 @@ public class KotlinIndicesHelper(private val project: Project) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun MutableCollection<in PropertyDescriptor>.addSourceTopLevelProperties(name: String, resolveSession: ResolveSessionForBodies, scope: GlobalSearchScope) {
|
private fun MutableCollection<in PropertyDescriptor>.addSourceTopLevelProperties(name: String) {
|
||||||
val identifier = Name.identifier(name)
|
val identifier = Name.identifier(name)
|
||||||
val affectedPackages = JetTopLevelNonExtensionPropertyShortNameIndex.getInstance().get(name, project, scope)
|
val affectedPackages = JetTopLevelNonExtensionPropertyShortNameIndex.getInstance().get(name, project, scope)
|
||||||
.stream()
|
.stream()
|
||||||
@@ -118,7 +120,7 @@ public class KotlinIndicesHelper(private val project: Project) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun getTopLevelCallables(nameFilter: (String) -> Boolean, context: JetExpression /*TODO: to be dropped*/, resolveSession: ResolveSessionForBodies, scope: GlobalSearchScope): Collection<CallableDescriptor> {
|
public fun getTopLevelCallables(nameFilter: (String) -> Boolean, context: JetExpression /*TODO: to be dropped*/): Collection<CallableDescriptor> {
|
||||||
val sourceNames = JetTopLevelFunctionsFqnNameIndex.getInstance().getAllKeys(project).stream() + JetTopLevelPropertiesFqnNameIndex.getInstance().getAllKeys(project).stream()
|
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 allFqNames = sourceNames.map { FqName(it) } + JetFromJavaDescriptorHelper.getTopLevelCallableFqNames(project, scope, false).stream()
|
||||||
|
|
||||||
@@ -126,13 +128,10 @@ public class KotlinIndicesHelper(private val project: Project) {
|
|||||||
|
|
||||||
return allFqNames.filter { nameFilter(it.shortName().asString()) }
|
return allFqNames.filter { nameFilter(it.shortName().asString()) }
|
||||||
.toSet()
|
.toSet()
|
||||||
.flatMap { findTopLevelCallables(it, context, jetScope, resolveSession) }
|
.flatMap { findTopLevelCallables(it, context, jetScope) }
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun getCallableExtensions(nameFilter: (String) -> Boolean,
|
public fun getCallableExtensions(nameFilter: (String) -> Boolean, expression: JetSimpleNameExpression): Collection<CallableDescriptor> {
|
||||||
expression: JetSimpleNameExpression,
|
|
||||||
resolveSession: ResolveSessionForBodies,
|
|
||||||
scope: GlobalSearchScope): Collection<CallableDescriptor> {
|
|
||||||
val bindingContext = resolveSession.resolveToElement(expression)
|
val bindingContext = resolveSession.resolveToElement(expression)
|
||||||
val dataFlowInfo = bindingContext.getDataFlowInfo(expression)
|
val dataFlowInfo = bindingContext.getDataFlowInfo(expression)
|
||||||
|
|
||||||
@@ -189,15 +188,15 @@ public class KotlinIndicesHelper(private val project: Project) {
|
|||||||
ExpressionTypingUtils.checkIsExtensionCallable(receiverValue, it, isInfixCall, bindingContext, dataFlowInfo) }
|
ExpressionTypingUtils.checkIsExtensionCallable(receiverValue, it, isInfixCall, bindingContext, dataFlowInfo) }
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun getClassDescriptors(nameFilter: (String) -> Boolean, analyzer: KotlinCodeAnalyzer, scope: GlobalSearchScope): Collection<ClassDescriptor> {
|
public fun getClassDescriptors(nameFilter: (String) -> Boolean): Collection<ClassDescriptor> {
|
||||||
return JetFullClassNameIndex.getInstance().getAllKeys(project).stream()
|
return JetFullClassNameIndex.getInstance().getAllKeys(project).stream()
|
||||||
.map { FqName(it) }
|
.map { FqName(it) }
|
||||||
.filter { nameFilter(it.shortName().asString()) }
|
.filter { nameFilter(it.shortName().asString()) }
|
||||||
.toList()
|
.toList()
|
||||||
.flatMap { getClassDescriptorsByFQName(analyzer, it, scope) }
|
.flatMap { getClassDescriptorsByFQName(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getClassDescriptorsByFQName(analyzer: KotlinCodeAnalyzer, classFQName: FqName, scope: GlobalSearchScope): Collection<ClassDescriptor> {
|
private fun getClassDescriptorsByFQName(classFQName: FqName): Collection<ClassDescriptor> {
|
||||||
val jetClassOrObjects = JetFullClassNameIndex.getInstance().get(classFQName.asString(), project, scope)
|
val jetClassOrObjects = JetFullClassNameIndex.getInstance().get(classFQName.asString(), project, scope)
|
||||||
|
|
||||||
if (jetClassOrObjects.isEmpty()) {
|
if (jetClassOrObjects.isEmpty()) {
|
||||||
@@ -206,10 +205,10 @@ public class KotlinIndicesHelper(private val project: Project) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Note: Can't search with psi element as analyzer could be built over temp files
|
// Note: Can't search with psi element as analyzer could be built over temp files
|
||||||
return ResolveSessionUtils.getClassDescriptorsByFqName(analyzer.getModuleDescriptor(), classFQName)
|
return ResolveSessionUtils.getClassDescriptorsByFqName(resolveSession.getModuleDescriptor(), classFQName)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun findTopLevelCallables(fqName: FqName, context: JetExpression, jetScope: JetScope, resolveSession: ResolveSessionForBodies): Collection<CallableDescriptor> {
|
private fun findTopLevelCallables(fqName: FqName, context: JetExpression, jetScope: JetScope): Collection<CallableDescriptor> {
|
||||||
val importDirective = JetPsiFactory(context.getProject()).createImportDirective(ImportPath(fqName, false))
|
val importDirective = JetPsiFactory(context.getProject()).createImportDirective(ImportPath(fqName, false))
|
||||||
val allDescriptors = analyzeImportReference(importDirective, jetScope, BindingTraceContext(), resolveSession.getModuleDescriptor())
|
val allDescriptors = analyzeImportReference(importDirective, jetScope, BindingTraceContext(), resolveSession.getModuleDescriptor())
|
||||||
return allDescriptors.filterIsInstance(javaClass<CallableDescriptor>()).filter { it.getExtensionReceiverParameter() == null }
|
return allDescriptors.filterIsInstance(javaClass<CallableDescriptor>()).filter { it.getExtensionReceiverParameter() == null }
|
||||||
|
|||||||
@@ -62,8 +62,8 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess
|
|||||||
protected val collector: LookupElementsCollector = LookupElementsCollector(prefixMatcher, resolveSession, { isVisibleDescriptor(it) })
|
protected val collector: LookupElementsCollector = LookupElementsCollector(prefixMatcher, resolveSession, { isVisibleDescriptor(it) })
|
||||||
|
|
||||||
protected val project: Project = position.getProject()
|
protected val project: Project = position.getProject()
|
||||||
protected val indicesHelper: KotlinIndicesHelper = KotlinIndicesHelper(project)
|
|
||||||
protected val searchScope: GlobalSearchScope = searchScopeForSourceElementDependencies(parameters.getOriginalFile()) ?: GlobalSearchScope.EMPTY_SCOPE
|
protected val searchScope: GlobalSearchScope = searchScopeForSourceElementDependencies(parameters.getOriginalFile()) ?: GlobalSearchScope.EMPTY_SCOPE
|
||||||
|
protected val indicesHelper: KotlinIndicesHelper = KotlinIndicesHelper(project, resolveSession, searchScope)
|
||||||
|
|
||||||
protected fun isVisibleDescriptor(descriptor: DeclarationDescriptor): Boolean {
|
protected fun isVisibleDescriptor(descriptor: DeclarationDescriptor): Boolean {
|
||||||
if (configuration.completeNonAccessibleDeclarations) return true
|
if (configuration.completeNonAccessibleDeclarations) return true
|
||||||
@@ -104,12 +104,13 @@ 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) + indicesHelper.getTopLevelObjects(filter))
|
||||||
indicesHelper.getTopLevelObjects(filter, resolveSession, searchScope)).filter { isVisibleDescriptor(it) }
|
.filter { isVisibleDescriptor(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun getKotlinExtensions(): Collection<CallableDescriptor> {
|
protected fun getKotlinExtensions(): Collection<CallableDescriptor> {
|
||||||
return indicesHelper.getCallableExtensions({ prefixMatcher.prefixMatches(it) }, jetReference!!.expression, resolveSession, searchScope).filter { isVisibleDescriptor(it) }
|
return indicesHelper.getCallableExtensions({ prefixMatcher.prefixMatches(it) }, jetReference!!.expression)
|
||||||
|
.filter { isVisibleDescriptor(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun addAllTypes() {
|
protected fun addAllTypes() {
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ class TypesCompletion(val parameters: CompletionParameters,
|
|||||||
|
|
||||||
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).filter(visibilityFilter),
|
result.addDescriptorElements(KotlinIndicesHelper(project, resolveSession, searchScope).getClassDescriptors { prefixMatcher.prefixMatches(it) }.filter(visibilityFilter),
|
||||||
suppressAutoInsertion = true)
|
suppressAutoInsertion = true)
|
||||||
|
|
||||||
if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) {
|
if (!ProjectStructureUtil.isJsKotlinModule(parameters.getOriginalFile() as JetFile)) {
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ public class AutoImportFix(element: JetSimpleNameExpression) : JetHintAction<Jet
|
|||||||
resolveSession: ResolveSessionForBodies,
|
resolveSession: ResolveSessionForBodies,
|
||||||
project: Project
|
project: Project
|
||||||
): Collection<PrioritizedFqName>
|
): Collection<PrioritizedFqName>
|
||||||
= KotlinIndicesHelper(project).getTopLevelCallablesByName(name, context, resolveSession, searchScope)
|
= KotlinIndicesHelper(project, resolveSession, searchScope).getTopLevelCallablesByName(name, context)
|
||||||
.map { PrioritizedFqName(it) }
|
.map { PrioritizedFqName(it) }
|
||||||
.toSet()
|
.toSet()
|
||||||
|
|
||||||
@@ -145,7 +145,7 @@ public class AutoImportFix(element: JetSimpleNameExpression) : JetHintAction<Jet
|
|||||||
resolveSession: ResolveSessionForBodies,
|
resolveSession: ResolveSessionForBodies,
|
||||||
project: Project
|
project: Project
|
||||||
): Collection<PrioritizedFqName>
|
): Collection<PrioritizedFqName>
|
||||||
= KotlinIndicesHelper(project).getCallableExtensions({ it == name }, expression, resolveSession, searchScope)
|
= KotlinIndicesHelper(project, resolveSession, searchScope).getCallableExtensions({ it == name }, expression)
|
||||||
.map { PrioritizedFqName(it) }
|
.map { PrioritizedFqName(it) }
|
||||||
.toSet()
|
.toSet()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user