From 0e1dff1c299a380de756e831d06709f9a10e3f4b Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 11 Nov 2015 14:27:55 +0100 Subject: [PATCH] optimize PackageIndexUtil.packageExists() by using in-memory hash table instead of stub index lookup --- .../kotlin/idea/stubindex/PackageIndexUtil.kt | 7 ++++++- .../idea/stubindex/SubpackagesIndexService.kt | 17 +++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/PackageIndexUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/PackageIndexUtil.kt index fdaac38013d..41e29ed90e6 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/PackageIndexUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/PackageIndexUtil.kt @@ -49,8 +49,13 @@ public object PackageIndexUtil { searchScope: GlobalSearchScope, project: Project ): Boolean { + val subpackagesIndex = SubpackagesIndexService.getInstance(project) + if (!subpackagesIndex.packageExists(packageFqName)) { + return false + } + return containsFilesWithExactPackage(packageFqName, searchScope, project) || - SubpackagesIndexService.getInstance(project).hasSubpackages(packageFqName, searchScope) + subpackagesIndex.hasSubpackages(packageFqName, searchScope) } @JvmStatic diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt index c12ab0c70b1..788d3a06528 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt @@ -16,16 +16,16 @@ package org.jetbrains.kotlin.idea.stubindex +import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.name.FqName import com.intellij.psi.search.GlobalSearchScope -import java.util.HashSet -import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.CachedValueProvider +import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.PsiModificationTracker import com.intellij.util.containers.MultiMap +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import com.intellij.openapi.components.ServiceManager +import java.util.* public class SubpackagesIndexService(private val project: Project) { @@ -40,11 +40,14 @@ public class SubpackagesIndexService(private val project: Project) { public inner class SubpackagesIndex(allPackageFqNames: Collection) { // a map from any existing package (in kotlin) to a set of subpackages (not necessarily direct) containing files + private val allPackageFqNames = hashSetOf() private val fqNameByPrefix = MultiMap.createSet() init { for (fqNameAsString in allPackageFqNames) { val fqName = FqName(fqNameAsString) + this.allPackageFqNames.add(fqName) + var prefix = fqName while (!prefix.isRoot()) { prefix = prefix.parent() @@ -53,13 +56,15 @@ public class SubpackagesIndexService(private val project: Project) { } } - public fun hasSubpackages(fqName: FqName, scope: GlobalSearchScope): Boolean { + fun hasSubpackages(fqName: FqName, scope: GlobalSearchScope): Boolean { return fqNameByPrefix[fqName].any { packageWithFilesFqName -> PackageIndexUtil.containsFilesWithExactPackage(packageWithFilesFqName, scope, project) } } - public fun getSubpackages(fqName: FqName, scope: GlobalSearchScope, nameFilter: (Name) -> Boolean): Collection { + fun packageExists(fqName: FqName): Boolean = fqName in allPackageFqNames || fqNameByPrefix.containsKey(fqName) + + fun getSubpackages(fqName: FqName, scope: GlobalSearchScope, nameFilter: (Name) -> Boolean): Collection { val possibleFilesFqNames = fqNameByPrefix[fqName] val existingSubPackagesShortNames = HashSet() val len = fqName.pathSegments().size()