diff --git a/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java b/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java index 1aca7059ab7e..94ef678ed8ec 100644 --- a/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java +++ b/platform/indexing-api/src/com/intellij/psi/stubs/StubIndex.java @@ -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 Collection getAllKeys(@NotNull StubIndexKey indexKey, @NotNull Project project); + + public Collection safeGet(@NotNull StubIndexKey indexKey, + @NotNull Key key, + @NotNull final Project project, + final GlobalSearchScope scope, + @NotNull Class requiredClass) { + Collection collection = getInstance().get(indexKey, key, project, scope); + for (Iterator iterator = collection.iterator(); iterator.hasNext(); ) { + Psi psi = iterator.next(); + if (!requiredClass.isInstance(psi)) { + iterator.remove(); + reportStubPsiMismatch(psi); + } + } + + return collection; + } + + protected 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); + } + } + } diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java index 530a40b3caad..3a46be258d30 100644 --- a/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubIndexImpl.java @@ -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 Collection safeGet(@NotNull StubIndexKey indexKey, - @NotNull Key key, - @NotNull final Project project, - final GlobalSearchScope scope, - @NotNull Class requiredClass) { - Collection collection = getInstance().get(indexKey, key, project, scope); - for (Iterator 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; - } - } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyDirectInheritorsSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyDirectInheritorsSearcher.java index b35eb881a4bd..36f239b74975 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyDirectInheritorsSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyDirectInheritorsSearcher.java @@ -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 inheritors = new ArrayList(); - 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) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java index 4e1d21d756fa..7198f2a1ba47 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/stubs/GroovyShortNamesCache.java @@ -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 addClasses(String name, GlobalSearchScope scope, boolean inSource) { final List result = new ArrayList(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);