From 861e8097ce029aefb41c8e4d2df576844a583f1e Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 25 Oct 2018 15:33:23 +0200 Subject: [PATCH] IDEA-200584 Goto symbol should allow to navigate to method overrides --- .../DefaultSymbolNavigationContributor.java | 12 +++++++++--- .../intellij/java/navigation/ChooseByNameTest.groovy | 7 +++++++ platform/util/resources/misc/registry.properties | 3 +++ 3 files changed, 19 insertions(+), 3 deletions(-) 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 c2e8996a48ac..bba5b597d4b5 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 @@ -12,6 +12,7 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Conditions; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.MinusculeMatcher; @@ -55,7 +56,7 @@ public class DefaultSymbolNavigationContributor implements ChooseByNameContribut List result = new ArrayList<>(); for (PsiMethod method : cache.getMethodsByName(name, scope)) { - if (!method.isConstructor() && isOpenable(method) && !hasSuperMethod(method, scope, qualifiedMatcher)) { + if (!method.isConstructor() && isOpenable(method) && !hasSuperMethod(method, scope, qualifiedMatcher, pattern)) { result.add(method); } } @@ -118,7 +119,12 @@ public class DefaultSymbolNavigationContributor implements ChooseByNameContribut }); } - private static boolean hasSuperMethod(final PsiMethod method, final GlobalSearchScope scope, final Condition qualifiedMatcher) { + + private static boolean hasSuperMethod(PsiMethod method, GlobalSearchScope scope, Condition qualifiedMatcher, String pattern) { + if (pattern.contains(".") && Registry.is("ide.goto.symbol.include.overrides.on.qualified.patterns")) { + return false; + } + if (!hasSuperMethodCandidates(method, scope, qualifiedMatcher)) { return false; } @@ -173,7 +179,7 @@ public class DefaultSymbolNavigationContributor implements ChooseByNameContribut Iterator iterator = collectedMethods.iterator(); while(iterator.hasNext()) { PsiMethod method = iterator.next(); - if (!hasSuperMethod(method, scope, qualifiedMatcher) && !processor.process(method)) return; + if (!hasSuperMethod(method, scope, qualifiedMatcher, completePattern) && !processor.process(method)) return; ProgressManager.checkCanceled(); iterator.remove(); } diff --git a/java/java-tests/testSrc/com/intellij/java/navigation/ChooseByNameTest.groovy b/java/java-tests/testSrc/com/intellij/java/navigation/ChooseByNameTest.groovy index c8681c272c3a..34283c77fccd 100644 --- a/java/java-tests/testSrc/com/intellij/java/navigation/ChooseByNameTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/navigation/ChooseByNameTest.groovy @@ -495,6 +495,13 @@ class Intf { assert gotoClass('java.Str*Builder', true) == [sb, asb] } + void "test include overridden qualified name method matches"() { + def m1 = myFixture.addClass('interface HttpRequest { void start() {} }').methods[0] + def m2 = myFixture.addClass('interface Request extends HttpRequest { void start() {} }').methods[0] + assert gotoSymbol('Request.start') == [m1, m2] + assert gotoSymbol('start') == [m1] // works as usual for non-qualified patterns + } + private List gotoClass(String text, boolean checkboxState = false) { return getPopupElements(new GotoClassModel2(project), text, checkboxState) } diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 8ea910ae9eff..b2843d0aab63 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -719,6 +719,9 @@ ide.goto.rebuild.delay.description=How many milliseconds to wait before updating ide.goto.file.include.directories=true ide.goto.file.include.directories.description=Whether to include directories in Goto File even when the entered pattern contains no slashes (otherwise they're included anyway) +ide.goto.symbol.include.overrides.on.qualified.patterns=true +ide.goto.symbol.include.overrides.on.qualified.patterns.description=Disable deduplication of methods from the same hierarchy if qualified pattern is used in Goto Symbol + ide.structural.navigation.visit.fields=false ide.structural.navigation.visit.fields.description=Whether fields should be stopped at when navigating to the nex/previous structural member by Alt+Down/Up.