Cache result of getAllPossiblePackageClasses()

Move this utility from IDELightClassGenerationSupport to PackageIndexUtil
This commit is contained in:
Pavel V. Talanov
2014-09-24 18:40:21 +04:00
parent 9219616bb8
commit f292c554cb
3 changed files with 24 additions and 29 deletions
@@ -16,14 +16,12 @@
package org.jetbrains.jet.plugin.caches.resolve;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.LibraryUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.containers.MultiMap;
import kotlin.Function1;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
@@ -37,7 +35,6 @@ import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.lazy.ForceResolveUtil;
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer;
import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -45,7 +42,6 @@ import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.plugin.libraries.JetSourceNavigationHelper;
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies;
import org.jetbrains.jet.plugin.stubindex.JetClassByPackageIndex;
import org.jetbrains.jet.plugin.stubindex.JetExactPackagesIndex;
import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex;
import org.jetbrains.jet.plugin.stubindex.PackageIndexUtil;
@@ -57,11 +53,6 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
private static final Logger LOG = Logger.getInstance(IDELightClassGenerationSupport.class);
@NotNull
public static IDELightClassGenerationSupport getInstanceForIDE(@NotNull Project project) {
return (IDELightClassGenerationSupport) ServiceManager.getService(project, LightClassGenerationSupport.class);
}
private final Project project;
private final Comparator<JetFile> jetFileComparator;
@@ -233,19 +224,6 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
return KotlinLightClassForExplicitDeclaration.create(classOrObject.getManager(), classOrObject);
}
@NotNull
public MultiMap<String, FqName> getAllPossiblePackageClasses(@NotNull GlobalSearchScope scope) {
Collection<String> packageFqNames = JetExactPackagesIndex.getInstance().getAllKeys(project);
MultiMap<String, FqName> result = new MultiMap<String, FqName>();
for (String packageFqName : packageFqNames) {
FqName packageClassFqName = PackageClassUtils.getPackageClassFqName(new FqName(packageFqName));
result.putValue(packageClassFqName.shortName().asString(), packageClassFqName);
}
return result;
}
@NotNull
private static Comparator<JetFile> byScopeComparator(@NotNull final GlobalSearchScope searchScope) {
return new Comparator<JetFile>() {
@@ -17,14 +17,16 @@
package org.jetbrains.jet.plugin.stubindex
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Ref
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.stubs.StubIndex
import com.intellij.psi.stubs.StubIndexKey
import com.intellij.util.Processor
import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.lang.resolve.name.FqName
import kotlin.platform.platformStatic
import com.intellij.util.containers.MultiMap
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils
import com.intellij.psi.util.CachedValuesManager
import com.intellij.psi.util.CachedValueProvider.Result
import com.intellij.psi.util.PsiModificationTracker
public object PackageIndexUtil {
platformStatic public fun getSubPackageFqNames(
@@ -66,4 +68,21 @@ public object PackageIndexUtil {
}
return result
}
platformStatic public fun getAllPossiblePackageClasses(project: Project): MultiMap<String, FqName> {
return CachedValuesManager.getManager(project).getCachedValue(project) {
Result(computeAllPossiblePackageClasses(project), PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT)
}!!
}
private fun computeAllPossiblePackageClasses(project: Project): MultiMap<String, FqName> {
val packageFqNames = JetExactPackagesIndex.getInstance().getAllKeys(project)
val result = MultiMap<String, FqName>()
for (packageFqName in packageFqNames) {
val packageClassFqName = PackageClassUtils.getPackageClassFqName(FqName(packageFqName))
result.putValue(packageClassFqName.shortName().asString(), packageClassFqName)
}
return result
}
}
@@ -51,8 +51,7 @@ public class JetShortNamesCache(private val project: Project) : PsiShortNamesCac
val classNames = JetClassShortNameIndex.getInstance().getAllKeys(project)
// package classes can not be indexed, since they have no explicit declarations
val lightClassGenerationSupport = IDELightClassGenerationSupport.getInstanceForIDE(project)
val packageClassShortNames = lightClassGenerationSupport.getAllPossiblePackageClasses(GlobalSearchScope.allScope(project)).keySet()
val packageClassShortNames = PackageIndexUtil.getAllPossiblePackageClasses(project).keySet()
classNames.addAll(packageClassShortNames)
return ArrayUtil.toStringArray(classNames)
@@ -64,8 +63,7 @@ public class JetShortNamesCache(private val project: Project) : PsiShortNamesCac
override fun getClassesByName(NonNls name: String, scope: GlobalSearchScope): Array<PsiClass> {
val result = ArrayList<PsiClass>()
val lightClassGenerationSupport = IDELightClassGenerationSupport.getInstanceForIDE(project)
val packageClasses = lightClassGenerationSupport.getAllPossiblePackageClasses(scope)
val packageClasses = PackageIndexUtil.getAllPossiblePackageClasses(project)
// package classes can not be indexed, since they have no explicit declarations
val fqNames = packageClasses.get(name)