move stub safeGet to a place visible to more clients

This commit is contained in:
peter
2013-03-07 15:30:12 +01:00
parent ca0e032bb1
commit 6ca4f0d635
4 changed files with 36 additions and 29 deletions
@@ -20,19 +20,25 @@
package com.intellij.psi.stubs;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.Processor;
import com.intellij.util.indexing.FileBasedIndex;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.Iterator;
public abstract class StubIndex {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.stubs.StubIndex");
private static class StubIndexHolder {
private static final StubIndex ourInstance = ApplicationManager.getApplication().getComponent(StubIndex.class);
}
public static StubIndex getInstance() {
return StubIndexHolder.ourInstance;
}
@@ -50,4 +56,30 @@ public abstract class StubIndex {
@NotNull
public abstract <Key> Collection<Key> getAllKeys(@NotNull StubIndexKey<Key, ?> indexKey, @NotNull Project project);
public <Key, Psi extends PsiElement> Collection<Psi> safeGet(@NotNull StubIndexKey<Key, Psi> indexKey,
@NotNull Key key,
@NotNull final Project project,
final GlobalSearchScope scope,
@NotNull Class<Psi> requiredClass) {
Collection<Psi> collection = getInstance().get(indexKey, key, project, scope);
for (Iterator<Psi> iterator = collection.iterator(); iterator.hasNext(); ) {
Psi psi = iterator.next();
if (!requiredClass.isInstance(psi)) {
iterator.remove();
reportStubPsiMismatch(psi);
}
}
return collection;
}
protected <Psi extends PsiElement> void reportStubPsiMismatch(Psi psi) {
VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(psi);
LOG.error("Invalid stub element type in index: " + faultyContainer + ". found: " + psi);
if (faultyContainer != null && faultyContainer.isValid()) {
FileBasedIndex.getInstance().requestReindex(faultyContainer);
}
}
}
@@ -31,7 +31,6 @@ import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.CommonProcessors;
import com.intellij.util.Processor;
import com.intellij.util.SmartList;
@@ -397,26 +396,4 @@ public class StubIndexImpl extends StubIndex implements ApplicationComponent, Pe
}
}
public static <Key, Psi extends PsiElement> Collection<Psi> safeGet(@NotNull StubIndexKey<Key, Psi> indexKey,
@NotNull Key key,
@NotNull final Project project,
final GlobalSearchScope scope,
@NotNull Class<Psi> requiredClass) {
Collection<Psi> collection = getInstance().get(indexKey, key, project, scope);
for (Iterator<Psi> iterator = collection.iterator(); iterator.hasNext(); ) {
Psi psi = iterator.next();
if (!requiredClass.isInstance(psi)) {
iterator.remove();
VirtualFile faultyContainer = PsiUtilCore.getVirtualFile(psi);
LOG.error("Invalid stub element type in index: " + faultyContainer + ". found: " + psi);
if (faultyContainer != null && faultyContainer.isValid()) {
FileBasedIndex.getInstance().requestReindex(faultyContainer);
}
}
}
return collection;
}
}
@@ -24,7 +24,6 @@ import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.searches.DirectClassInheritorsSearch;
import com.intellij.psi.stubs.StubIndex;
import com.intellij.psi.stubs.StubIndexImpl;
import com.intellij.util.Processor;
import com.intellij.util.QueryExecutor;
import org.jetbrains.annotations.NotNull;
@@ -51,7 +50,7 @@ class GroovyDirectInheritorsSearcher implements QueryExecutor<PsiClass, DirectCl
final String name = clazz.getName();
if (name == null) return GrTypeDefinition.EMPTY_ARRAY;
final ArrayList<PsiClass> inheritors = new ArrayList<PsiClass>();
for (GrReferenceList list : StubIndexImpl.safeGet(GrDirectInheritorsIndex.KEY, name, clazz.getProject(), scope,
for (GrReferenceList list : StubIndex.getInstance().safeGet(GrDirectInheritorsIndex.KEY, name, clazz.getProject(), scope,
GrReferenceList.class)) {
final PsiElement parent = list.getParent();
if (parent instanceof GrTypeDefinition) {
@@ -24,7 +24,6 @@ import com.intellij.psi.PsiMethod;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.psi.stubs.StubIndex;
import com.intellij.psi.stubs.StubIndexImpl;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ObjectUtils;
import com.intellij.util.Processor;
@@ -97,8 +96,8 @@ public class GroovyShortNamesCache extends PsiShortNamesCache {
private List<PsiClass> addClasses(String name, GlobalSearchScope scope, boolean inSource) {
final List<PsiClass> result = new ArrayList<PsiClass>(getScriptClassesByFQName(name, scope, inSource));
for (PsiElement psiClass : StubIndexImpl.safeGet(GrFullClassNameIndex.KEY, name.hashCode(), myProject,
inSource ? new GrSourceFilterScope(scope) : scope, PsiClass.class)) {
for (PsiElement psiClass : StubIndex.getInstance().safeGet(GrFullClassNameIndex.KEY, name.hashCode(), myProject,
inSource ? new GrSourceFilterScope(scope) : scope, PsiClass.class)) {
//hashcode doesn't guarantee equals
if (name.equals(((PsiClass)psiClass).getQualifiedName())) {
result.add((PsiClass)psiClass);