diff --git a/java/java-impl/src/com/intellij/find/findUsages/JavaFindUsagesHandler.java b/java/java-impl/src/com/intellij/find/findUsages/JavaFindUsagesHandler.java index c2818d134262..b7f748f7a96c 100644 --- a/java/java-impl/src/com/intellij/find/findUsages/JavaFindUsagesHandler.java +++ b/java/java-impl/src/com/intellij/find/findUsages/JavaFindUsagesHandler.java @@ -27,6 +27,7 @@ import com.intellij.openapi.ui.Messages; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.VariableKind; +import com.intellij.psi.impl.PsiSuperMethodImplUtil; import com.intellij.psi.impl.search.ThrowSearchUtil; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; @@ -35,7 +36,6 @@ import com.intellij.psi.search.searches.FunctionalExpressionSearch; import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.psi.search.searches.OverridingMethodsSearch; import com.intellij.psi.util.PropertyUtilBase; -import com.intellij.psi.util.PsiSuperMethodUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.PsiUtilCore; import com.intellij.refactoring.util.JavaNonCodeSearchElementDescriptionProvider; @@ -47,10 +47,7 @@ import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; +import java.util.*; /** * @author peter @@ -257,20 +254,27 @@ public class JavaFindUsagesHandler extends FindUsagesHandler{ @Override public Collection findReferencesToHighlight(@NotNull final PsiElement target, @NotNull final SearchScope searchScope) { if (target instanceof PsiMethod) { - final PsiMethod[] superMethods = ((PsiMethod)target).findDeepestSuperMethods(); + Set superTargets = ContainerUtil.newLinkedHashSet(); + PsiMethod[] superMethods = ((PsiMethod)target).findDeepestSuperMethods(); if (superMethods.length == 0) { - return MethodReferencesSearch.search((PsiMethod)target, searchScope, true).findAll(); + superTargets.add((PsiMethod)target); } - final Collection result = new ArrayList<>(); - GlobalSearchScope resolveScope = null; if (searchScope instanceof LocalSearchScope) { - final PsiElement[] scopeElements = ((LocalSearchScope)searchScope).getScope(); - resolveScope = GlobalSearchScope.union(ContainerUtil.map2Array(scopeElements, GlobalSearchScope.class, PsiElement::getResolveScope)); - } - for (PsiMethod superMethod : superMethods) { - if (resolveScope != null) { - superMethod = PsiSuperMethodUtil.correctMethodByScope(superMethod, resolveScope).orElse(superMethod); + PsiElement[] scopeElements = ((LocalSearchScope)searchScope).getScope(); + GlobalSearchScope resolveScope = + GlobalSearchScope.union(ContainerUtil.map2Array(scopeElements, GlobalSearchScope.class, PsiElement::getResolveScope)); + for (HierarchicalMethodSignature superSignature : PsiSuperMethodImplUtil.getHierarchicalMethodSignature((PsiMethod)target, resolveScope) + .getSuperSignatures()) { + PsiMethod method = superSignature.getMethod(); + PsiMethod[] deepestSupers = method.findDeepestSuperMethods(); + Collections.addAll(superTargets, deepestSupers.length == 0 ? new PsiMethod[]{method} : deepestSupers); } + } else { + Collections.addAll(superTargets, superMethods); + } + + Collection result = new LinkedHashSet<>(); + for (PsiMethod superMethod : superTargets) { result.addAll(MethodReferencesSearch.search(superMethod, searchScope, true).findAll()); } return result; diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiSuperMethodUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiSuperMethodUtil.java index 6335df761d12..88ed1f0b7cf2 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiSuperMethodUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiSuperMethodUtil.java @@ -25,7 +25,6 @@ import org.jetbrains.annotations.Nullable; import java.util.LinkedHashSet; import java.util.Map; -import java.util.Optional; import java.util.Set; public class PsiSuperMethodUtil { @@ -128,15 +127,4 @@ public class PsiSuperMethodUtil { return JavaPsiFacade.getInstance(psiClass.getProject()).findClass(qualifiedName, resolveScope); } - @NotNull - public static Optional correctMethodByScope(PsiMethod method, final GlobalSearchScope resolveScope) { - if (method == null) return Optional.empty(); - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) return Optional.empty(); - final PsiClass correctedClass = correctClassByScope(aClass, resolveScope); - if (correctedClass == null) return Optional.empty(); - else if (correctedClass == aClass) return Optional.of(method); - final PsiMethod correctedClassMethodBySignature = correctedClass.findMethodBySignature(method, false); - return correctedClassMethodBySignature == null ? Optional.empty() : Optional.of(correctedClassMethodBySignature); - } } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/MultipleJdksHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/MultipleJdksHighlightingTest.java index 212623ce2ca8..d0a579c84361 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/MultipleJdksHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/MultipleJdksHighlightingTest.java @@ -311,6 +311,9 @@ public class MultipleJdksHighlightingTest extends UsefulTestCase { ""); myFixture.configureFromExistingVirtualFile(file.getVirtualFile()); myFixture.checkHighlighting(); + + HighlightUsagesHandler.invoke(myFixture.getProject(), myFixture.getEditor(), myFixture.getFile()); + assertSize(2, myFixture.getEditor().getMarkupModel().getAllHighlighters()); } private void doTestWithoutLibrary() {