mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
move stub safeGet to a place visible to more clients
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-2
@@ -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) {
|
||||
|
||||
+2
-3
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user