More simple and effective top-level declarations by name search

This commit is contained in:
Valentin Kipyatkov
2014-11-28 20:32:39 +03:00
parent e6e6fda251
commit 2a2fa5d4f2
@@ -36,7 +36,6 @@ import org.jetbrains.jet.lang.resolve.calls.smartcasts.DataFlowInfo
import com.intellij.psi.stubs.StringStubIndexExtension
import org.jetbrains.jet.plugin.caches.resolve.ResolutionFacade
import org.jetbrains.jet.plugin.util.extensionsUtils.isExtensionCallable
import org.jetbrains.jet.plugin.caches.resolve.getResolutionFacade
public class KotlinIndicesHelper(
private val project: Project,
@@ -59,44 +58,15 @@ public class KotlinIndicesHelper(
}
}
result.addSourceTopLevelFunctions(name)
result.addSourceTopLevelProperties(name)
JetTopLevelNonExtensionFunctionShortNameIndex.getInstance().get(name, project, scope)
.mapTo(result) { resolutionFacade.resolveToDescriptor(it) as CallableDescriptor }
JetTopLevelNonExtensionPropertyShortNameIndex.getInstance().get(name, project, scope)
.mapTo(result) { resolutionFacade.resolveToDescriptor(it) as CallableDescriptor }
return result.filter(visibilityFilter)
}
private fun MutableCollection<in FunctionDescriptor>.addSourceTopLevelFunctions(name: String) {
val identifier = Name.identifier(name)
val affectedPackages = JetTopLevelNonExtensionFunctionShortNameIndex.getInstance().get(name, project, scope)
.stream()
.map { it.getContainingFile() }
.filterIsInstance(javaClass<JetFile>())
.map { it.getPackageFqName() }
.toSet()
for (affectedPackage in affectedPackages) {
val packageDescriptor = moduleDescriptor.getPackage(affectedPackage)
?: error("There's a function in stub index with invalid package: $affectedPackage")
addAll(packageDescriptor.getMemberScope().getFunctions(identifier))
}
}
private fun MutableCollection<in PropertyDescriptor>.addSourceTopLevelProperties(name: String) {
val identifier = Name.identifier(name)
val affectedPackages = JetTopLevelNonExtensionPropertyShortNameIndex.getInstance().get(name, project, scope)
.stream()
.map { it.getContainingFile() }
.filterIsInstance(javaClass<JetFile>())
.map { it.getPackageFqName() }
.toSet()
for (affectedPackage in affectedPackages) {
val packageDescriptor = moduleDescriptor.getPackage(affectedPackage)
?: error("There's a property in stub index with invalid package: $affectedPackage")
addAll(packageDescriptor.getMemberScope().getProperties(identifier))
}
}
public fun getTopLevelCallables(nameFilter: (String) -> Boolean, context: JetExpression /*TODO: to be dropped*/): Collection<CallableDescriptor> {
val sourceNames = JetTopLevelFunctionFqnNameIndex.getInstance().getAllKeys(project).stream() + JetTopLevelPropertyFqnNameIndex.getInstance().getAllKeys(project).stream()
val allFqNames = sourceNames.map { FqName(it) } + JetFromJavaDescriptorHelper.getTopLevelCallableFqNames(project, scope, false).stream()