From 25ebe168b4b2dc70da8c28bfae4285423da40307 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 9 Aug 2019 16:34:42 +0700 Subject: [PATCH] HighlightingCaches#ALL_SUB_CLASSES_NO_ANONYMOUS: separate cache for non-anonymous classes GitOrigin-RevId: ce4b5c26adf7a1e0a960cbe6270b0dcb4ea6373f --- .../psi/impl/search/HighlightingCaches.java | 2 ++ .../impl/search/JavaClassInheritorsSearcher.java | 15 ++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) 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