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; package org.jetbrains.jet.plugin.caches.resolve;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.LibraryUtil; import com.intellij.openapi.roots.libraries.LibraryUtil;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass; import com.intellij.psi.PsiClass;
import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.containers.MultiMap;
import kotlin.Function1; import kotlin.Function1;
import kotlin.KotlinPackage; import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull; 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.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; 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.ForceResolveUtil;
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer; import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer;
import org.jetbrains.jet.lang.resolve.name.FqName; 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.libraries.JetSourceNavigationHelper;
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies; import org.jetbrains.jet.plugin.project.ResolveSessionForBodies;
import org.jetbrains.jet.plugin.stubindex.JetClassByPackageIndex; 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.JetFullClassNameIndex;
import org.jetbrains.jet.plugin.stubindex.PackageIndexUtil; 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); 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 Project project;
private final Comparator<JetFile> jetFileComparator; private final Comparator<JetFile> jetFileComparator;
@@ -233,19 +224,6 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
return KotlinLightClassForExplicitDeclaration.create(classOrObject.getManager(), classOrObject); 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 @NotNull
private static Comparator<JetFile> byScopeComparator(@NotNull final GlobalSearchScope searchScope) { private static Comparator<JetFile> byScopeComparator(@NotNull final GlobalSearchScope searchScope) {
return new Comparator<JetFile>() { return new Comparator<JetFile>() {
@@ -17,14 +17,16 @@
package org.jetbrains.jet.plugin.stubindex package org.jetbrains.jet.plugin.stubindex
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Ref
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.stubs.StubIndex 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.psi.JetFile
import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.resolve.name.FqName
import kotlin.platform.platformStatic 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 { public object PackageIndexUtil {
platformStatic public fun getSubPackageFqNames( platformStatic public fun getSubPackageFqNames(
@@ -66,4 +68,21 @@ public object PackageIndexUtil {
} }
return result 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) val classNames = JetClassShortNameIndex.getInstance().getAllKeys(project)
// package classes can not be indexed, since they have no explicit declarations // package classes can not be indexed, since they have no explicit declarations
val lightClassGenerationSupport = IDELightClassGenerationSupport.getInstanceForIDE(project) val packageClassShortNames = PackageIndexUtil.getAllPossiblePackageClasses(project).keySet()
val packageClassShortNames = lightClassGenerationSupport.getAllPossiblePackageClasses(GlobalSearchScope.allScope(project)).keySet()
classNames.addAll(packageClassShortNames) classNames.addAll(packageClassShortNames)
return ArrayUtil.toStringArray(classNames) 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> { override fun getClassesByName(NonNls name: String, scope: GlobalSearchScope): Array<PsiClass> {
val result = ArrayList<PsiClass>() val result = ArrayList<PsiClass>()
val lightClassGenerationSupport = IDELightClassGenerationSupport.getInstanceForIDE(project) val packageClasses = PackageIndexUtil.getAllPossiblePackageClasses(project)
val packageClasses = lightClassGenerationSupport.getAllPossiblePackageClasses(scope)
// package classes can not be indexed, since they have no explicit declarations // package classes can not be indexed, since they have no explicit declarations
val fqNames = packageClasses.get(name) val fqNames = packageClasses.get(name)