diff --git a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java index 4d878dbd1c87..2ceb596cf604 100644 --- a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java +++ b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnnotationIndex.java @@ -25,6 +25,7 @@ import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StringStubIndexExtension; import com.intellij.psi.stubs.StubIndexKey; +import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -39,7 +40,7 @@ public class JavaAnnotationIndex extends StringStubIndexExtension return JavaStubIndexKeys.ANNOTATIONS; } - public Collection get(final String s, final Project project, final GlobalSearchScope scope) { + public Collection get(final String s, final Project project, @NotNull final GlobalSearchScope scope) { return super.get(s, project, new JavaSourceFilterScope(scope)); } } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnonymousClassBaseRefOccurenceIndex.java b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnonymousClassBaseRefOccurenceIndex.java index af695fa1114d..bb9f97bfca26 100644 --- a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnonymousClassBaseRefOccurenceIndex.java +++ b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaAnonymousClassBaseRefOccurenceIndex.java @@ -25,6 +25,7 @@ import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StringStubIndexExtension; import com.intellij.psi.stubs.StubIndexKey; +import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -40,7 +41,7 @@ public class JavaAnonymousClassBaseRefOccurenceIndex extends StringStubIndexExte return JavaStubIndexKeys.ANONYMOUS_BASEREF; } - public Collection get(final String s, final Project project, final GlobalSearchScope scope) { + public Collection get(final String s, final Project project, @NotNull final GlobalSearchScope scope) { return super.get(s, project, new JavaSourceFilterScope(scope)); } } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFieldNameIndex.java b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFieldNameIndex.java index 231d9d21865f..fd84fa9cfcc8 100644 --- a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFieldNameIndex.java +++ b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFieldNameIndex.java @@ -25,6 +25,7 @@ import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StringStubIndexExtension; import com.intellij.psi.stubs.StubIndexKey; +import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -39,7 +40,7 @@ public class JavaFieldNameIndex extends StringStubIndexExtension { return JavaStubIndexKeys.FIELDS; } - public Collection get(final String s, final Project project, final GlobalSearchScope scope) { + public Collection get(final String s, final Project project, @NotNull final GlobalSearchScope scope) { return super.get(s, project, new JavaSourceFilterScope(scope)); } } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java index 753817ba946d..f84804b3afa6 100644 --- a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java +++ b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaFullClassNameIndex.java @@ -25,6 +25,7 @@ import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.IntStubIndexExtension; import com.intellij.psi.stubs.StubIndexKey; +import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -38,7 +39,7 @@ public class JavaFullClassNameIndex extends IntStubIndexExtension { return JavaStubIndexKeys.CLASS_FQN; } - public Collection get(final Integer integer, final Project project, final GlobalSearchScope scope) { + public Collection get(final Integer integer, final Project project, @NotNull final GlobalSearchScope scope) { return super.get(integer, project, new JavaSourceFilterScope(scope)); } } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodNameIndex.java b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodNameIndex.java index fa5032f1df02..6ace6fc748b5 100644 --- a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodNameIndex.java +++ b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaMethodNameIndex.java @@ -25,6 +25,7 @@ import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StringStubIndexExtension; import com.intellij.psi.stubs.StubIndexKey; +import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -39,7 +40,7 @@ public class JavaMethodNameIndex extends StringStubIndexExtension { return JavaStubIndexKeys.METHODS; } - public Collection get(final String s, final Project project, final GlobalSearchScope scope) { + public Collection get(final String s, final Project project, @NotNull final GlobalSearchScope scope) { return super.get(s, project, new JavaSourceFilterScope(scope)); } } \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java index cc69c0da162c..ed5f0bef10ce 100644 --- a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java +++ b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java @@ -25,6 +25,7 @@ import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StringStubIndexExtension; import com.intellij.psi.stubs.StubIndexKey; +import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -39,7 +40,7 @@ public class JavaShortClassNameIndex extends StringStubIndexExtension return JavaStubIndexKeys.CLASS_SHORT_NAMES; } - public Collection get(final String s, final Project project, final GlobalSearchScope scope) { + public Collection get(final String s, final Project project, @NotNull final GlobalSearchScope scope) { return super.get(s, project, new JavaSourceFilterScope(scope)); } diff --git a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaSuperClassNameOccurenceIndex.java b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaSuperClassNameOccurenceIndex.java index cb0d13cf70a2..01deb9a63de0 100644 --- a/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaSuperClassNameOccurenceIndex.java +++ b/java/java-impl/src/com/intellij/psi/impl/java/stubs/index/JavaSuperClassNameOccurenceIndex.java @@ -25,6 +25,7 @@ import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StringStubIndexExtension; import com.intellij.psi.stubs.StubIndexKey; +import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -40,7 +41,7 @@ public class JavaSuperClassNameOccurenceIndex extends StringStubIndexExtension

get(final String s, final Project project, final GlobalSearchScope scope) { + public Collection get(final String s, final Project project, @NotNull final GlobalSearchScope scope) { return super.get(s, project, new JavaSourceFilterScope(scope)); } diff --git a/java/java-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java b/java/java-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java index ae56ee660763..fac3142d17fc 100644 --- a/java/java-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java +++ b/java/java-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java @@ -1,6 +1,8 @@ package com.intellij.psi.impl.search; +import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.VirtualFile; @@ -8,6 +10,7 @@ import com.intellij.psi.*; import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.AnnotatedElementsSearch; import com.intellij.psi.util.PsiUtil; @@ -16,6 +19,7 @@ import com.intellij.util.QueryExecutor; import com.intellij.util.indexing.FileBasedIndex; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.Collection; /** @@ -36,15 +40,7 @@ public class AnnotatedElementsSearcher implements QueryExecutor[] types = p.getTypes(); - final GlobalSearchScope scope = useScope instanceof GlobalSearchScope ? (GlobalSearchScope)useScope : null; - final Collection annotations = ApplicationManager.getApplication().runReadAction( - new Computable>() { - @Override - public Collection compute() { - return JavaAnnotationIndex.getInstance().get(annClass.getName(), annClass.getProject(), scope); - } - }); - for (PsiElement elt : annotations) { + for (PsiElement elt : getAnnotationCandidates(annClass, useScope)) { if (notAnnotation(elt)) continue; final PsiAnnotation ann = (PsiAnnotation)elt; @@ -87,6 +83,30 @@ public class AnnotatedElementsSearcher implements QueryExecutor getAnnotationCandidates(final PsiClass annClass, SearchScope useScope) { + AccessToken token = ReadAction.start(); + try { + if (useScope instanceof GlobalSearchScope) { + return JavaAnnotationIndex.getInstance().get(annClass.getName(), annClass.getProject(), (GlobalSearchScope)useScope); + } + final ArrayList result = new ArrayList(); + for (PsiElement element : ((LocalSearchScope)useScope).getScope()) { + element.accept(new PsiRecursiveElementWalkingVisitor() { + @Override + public void visitElement(PsiElement element) { + if (element instanceof PsiAnnotation) { + result.add((PsiAnnotation)element); + } + } + }); + } + return result; + } + finally { + token.finish(); + } + } + public static boolean isInstanceof(PsiElement owner, Class[] types) { for (Class type : types) { if(type.isInstance(owner)) return true; diff --git a/java/java-impl/src/com/intellij/psi/impl/search/JavaSourceFilterScope.java b/java/java-impl/src/com/intellij/psi/impl/search/JavaSourceFilterScope.java index 6a35c4c90f07..d369b4d08b1d 100644 --- a/java/java-impl/src/com/intellij/psi/impl/search/JavaSourceFilterScope.java +++ b/java/java-impl/src/com/intellij/psi/impl/search/JavaSourceFilterScope.java @@ -25,11 +25,12 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.search.DelegatingGlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope; +import org.jetbrains.annotations.NotNull; public class JavaSourceFilterScope extends DelegatingGlobalSearchScope { private final ProjectFileIndex myIndex; - public JavaSourceFilterScope(final GlobalSearchScope delegate) { + public JavaSourceFilterScope(@NotNull final GlobalSearchScope delegate) { super(delegate); myIndex = ProjectRootManager.getInstance(getProject()).getFileIndex(); }