diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt index aa631c26f27..fc155d9bc90 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/stubindex/resolve/StubBasedPackageMemberDeclarationProvider.kt @@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils import org.jetbrains.jet.lang.resolve.scopes.JetScope +import java.util.ArrayList public class StubBasedPackageMemberDeclarationProvider( private val fqName: FqName, @@ -39,10 +40,30 @@ public class StubBasedPackageMemberDeclarationProvider( ) : PackageMemberDeclarationProvider { override fun getDeclarations(kindFilter: (JetScope.DescriptorKind) -> Boolean, nameFilter: (Name) -> Boolean): List { - return TOP_LEVEL_DECLARATION_INDICES.flatMap { index -> - val fqNames = index.getAllKeys(project).toSet().map { FqName(it) }.filter { !it.isRoot() && it.parent() == fqName } - fqNames.flatMap { index.get(it.asString(), project, searchScope) } + val result = ArrayList() + + if (kindFilter(JetScope.DescriptorKind.CLASSIFIER)) { + result.addDeclarations(JetFullClassNameIndex.getInstance(), nameFilter) } + + if (kindFilter(JetScope.DescriptorKind.NON_EXTENSION_FUNCTION) || kindFilter(JetScope.DescriptorKind.EXTENSION_FUNCTION)) { + result.addDeclarations(JetTopLevelFunctionsFqnNameIndex.getInstance(), nameFilter) + } + + if (kindFilter(JetScope.DescriptorKind.NON_EXTENSION_PROPERTY) || kindFilter(JetScope.DescriptorKind.EXTENSION_PROPERTY)) { + result.addDeclarations(JetTopLevelPropertiesFqnNameIndex.getInstance(), nameFilter) + } + + return result + } + + private fun MutableCollection.addDeclarations(index: StringStubIndexExtension, + nameFilter: (Name) -> Boolean) { + index.getAllKeys(project) + .stream() + .map { FqName(it) } + .filter { !it.isRoot() && it.parent() == fqName && nameFilter(it.shortName()) } + .flatMapTo(this) { index[it.asString(), project, searchScope].stream() } } override fun getClassOrObjectDeclarations(name: Name): Collection { @@ -70,9 +91,3 @@ public class StubBasedPackageMemberDeclarationProvider( return fqName.child(ResolveSessionUtils.safeNameForLazyResolve(name)).asString() } } - -private val TOP_LEVEL_DECLARATION_INDICES: List> = listOf( - JetFullClassNameIndex.getInstance(), - JetTopLevelFunctionsFqnNameIndex.getInstance(), - JetTopLevelPropertiesFqnNameIndex.getInstance() -)