From 2e78be60026d564472558ef126aa35e2e140ea2a Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 25 May 2020 15:55:13 +0700 Subject: [PATCH] getHierarchyScope extracted GitOrigin-RevId: 06a3653e969dcc3b464511fa8964c59c79dec8bf --- .../JavaTargetElementEvaluator.java | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/JavaTargetElementEvaluator.java b/java/java-impl/src/com/intellij/codeInsight/JavaTargetElementEvaluator.java index d54079c15c55..451758a4aa52 100644 --- a/java/java-impl/src/com/intellij/codeInsight/JavaTargetElementEvaluator.java +++ b/java/java-impl/src/com/intellij/codeInsight/JavaTargetElementEvaluator.java @@ -344,27 +344,40 @@ public class JavaTargetElementEvaluator extends TargetElementEvaluatorEx2 implem } final PsiClass[] memberClass = getClassesWithMember(referenceExpression, (PsiMember)element); if (memberClass != null && memberClass.length == 1) { - return CachedValuesManager.getCachedValue(memberClass[0], () -> { - final List classesToSearch = ContainerUtil.newArrayList(memberClass); - classesToSearch.addAll(ClassInheritorsSearch.search(memberClass[0]).findAll()); - - final Set supers = new HashSet<>(); - for (PsiClass psiClass : classesToSearch) { - supers.addAll(InheritanceUtil.getSuperClasses(psiClass)); - } - - final List elements = new ArrayList<>(); - elements.addAll(classesToSearch); - elements.addAll(supers); - elements.addAll(FunctionalExpressionSearch.search(memberClass[0]).findAll()); - - return new CachedValueProvider.Result(new LocalSearchScope(PsiUtilCore.toPsiElementArray(elements)), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT); - }); + return getHierarchyScope(memberClass[0], memberClass[0].getUseScope()); } } return super.getSearchScope(editor, element); } + /** + * Narrow given scope to include only those places where methods called on given class qualifier could be defined. + * + * @param aClass qualifier type class + * @param scope a scope to narrow + * @return narrowed scope + */ + public @NotNull static SearchScope getHierarchyScope(@NotNull PsiClass aClass, @NotNull SearchScope scope) { + return CachedValuesManager.getCachedValue(aClass, () -> { + final List classesToSearch = new ArrayList<>(); + classesToSearch.add(aClass); + classesToSearch.addAll(ClassInheritorsSearch.search(aClass, scope, true).findAll()); + + final Set supers = new HashSet<>(); + for (PsiClass psiClass : classesToSearch) { + supers.addAll(InheritanceUtil.getSuperClasses(psiClass)); + } + + final List elements = new ArrayList<>(); + elements.addAll(classesToSearch); + elements.addAll(supers); + elements.addAll(FunctionalExpressionSearch.search(aClass, scope).findAll()); + + return new CachedValueProvider.Result(new LocalSearchScope(PsiUtilCore.toPsiElementArray(elements)), + PsiModificationTracker.MODIFICATION_COUNT); + }); + } + private static class PsiElementFindProcessor implements Processor { private final T myElement;