diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/HighlightingCaches.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/HighlightingCaches.java index a790238ae99d..2179605a0aab 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/HighlightingCaches.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/HighlightingCaches.java @@ -55,6 +55,8 @@ class HighlightingCaches { final ConcurrentMap DIRECT_SUB_CLASSES = createWeakCache(); // baseClass -> all sub classes transitively, including anonymous final ConcurrentMap> ALL_SUB_CLASSES = createWeakCache(); + // baseClass -> all sub classes transitively, excluding anonymous + final ConcurrentMap> ALL_SUB_CLASSES_NO_ANONYMOUS = createWeakCache(); // baseMethod -> all overriding methods final Map> OVERRIDING_METHODS = createWeakCache(); diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaClassInheritorsSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaClassInheritorsSearcher.java index 0e33713c2a88..f49f4f03f80d 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaClassInheritorsSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaClassInheritorsSearcher.java @@ -77,13 +77,10 @@ public class JavaClassInheritorsSearcher extends QueryExecutorBase cached = getOrComputeSubClasses(project, baseClass, searchScope); + Iterable cached = getOrComputeSubClasses(project, baseClass, searchScope, parameters.isIncludeAnonymous()); for (final PsiClass subClass : cached) { ProgressManager.checkCanceled(); - if (subClass instanceof PsiAnonymousClass && !parameters.isIncludeAnonymous()) { - continue; - } if (ReadAction.compute(() -> checkCandidate(subClass, parameters) && !consumer.process(subClass))) { return; @@ -92,8 +89,12 @@ public class JavaClassInheritorsSearcher extends QueryExecutorBase getOrComputeSubClasses(@NotNull Project project, @NotNull PsiClass baseClass, @NotNull SearchScope searchScopeForNonPhysical) { - ConcurrentMap> map = HighlightingCaches.getInstance(project).ALL_SUB_CLASSES; + private static Iterable getOrComputeSubClasses(@NotNull Project project, + @NotNull PsiClass baseClass, + @NotNull SearchScope searchScopeForNonPhysical, + boolean includeAnonymous) { + HighlightingCaches caches = HighlightingCaches.getInstance(project); + ConcurrentMap> map = includeAnonymous ? caches.ALL_SUB_CLASSES : caches.ALL_SUB_CLASSES_NO_ANONYMOUS; Iterable cached = map.get(baseClass); if (cached == null) { // returns lazy collection of subclasses. Each call to next() leads to calculation of next batch of subclasses. @@ -105,7 +106,7 @@ public class JavaClassInheritorsSearcher extends QueryExecutorBase generator = (candidate, processor) -> - DirectClassInheritorsSearch.search(candidate, scopeToUse).allowParallelProcessing().forEach(subClass -> { + DirectClassInheritorsSearch.search(candidate, scopeToUse, includeAnonymous).allowParallelProcessing().forEach(subClass -> { ProgressManager.checkCanceled(); PsiAnchor pointer = ReadAction.compute(() -> PsiAnchor.create(subClass)); // append found result to subClasses as early as possible to allow other waiting threads to continue