diff --git a/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultSymbolNavigationContributor.java b/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultSymbolNavigationContributor.java index 24ada216c0d9..00c9967fdcd4 100644 --- a/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultSymbolNavigationContributor.java +++ b/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultSymbolNavigationContributor.java @@ -30,6 +30,7 @@ import com.intellij.psi.impl.PsiSuperMethodImplUtil; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiSearchScopeUtil; import com.intellij.psi.search.PsiShortNamesCache; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.Processor; @@ -89,19 +90,24 @@ public class DefaultSymbolNavigationContributor implements ChooseByNameContribut return member.getContainingFile().getVirtualFile() != null; } - private static boolean hasSuperMethod(PsiMethod method, GlobalSearchScope scope, Condition qualifiedMatcher) { - PsiClass containingClass = method.getContainingClass(); + private static boolean hasSuperMethod(final PsiMethod method, final GlobalSearchScope scope, final Condition qualifiedMatcher) { + final PsiClass containingClass = method.getContainingClass(); if (containingClass == null) return false; - for (PsiMethod candidate : containingClass.findMethodsByName(method.getName(), true)) { - if (candidate.getContainingClass() != containingClass && - PsiSearchScopeUtil.isInScope(scope, candidate) && - qualifiedMatcher.value(candidate) && - PsiSuperMethodImplUtil.isSuperMethodSmart(method, candidate)) { + // avoid using hierarchical findMethodsByName because we only want to check the given method hierarchy, without its siblings + return !InheritanceUtil.processSupers(containingClass, false, new Processor() { + @Override + public boolean process(PsiClass superClass) { + if (PsiSearchScopeUtil.isInScope(scope, superClass)) { + for (PsiMethod candidate : superClass.findMethodsByName(method.getName(), false)) { + if (qualifiedMatcher.value(candidate) && PsiSuperMethodImplUtil.isSuperMethodSmart(method, candidate)) { + return false; + } + } + } return true; } - } - return false; + }); } public void processNames(@NotNull Processor processor, @NotNull GlobalSearchScope scope, @Nullable IdFilter filter) {