From f166e964207b8d75055bfc5db66aaa26a3a6200b Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 8 Feb 2016 20:50:55 +0100 Subject: [PATCH] goto class/file: support more line number denotations (IDEA-137806, IDEA-111332, IDEA-151405) --- .../intellij/navigation/ChooseByNameTest.groovy | 9 +++++++++ .../ide/util/gotoByName/ChooseByNamePopup.java | 17 +++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy b/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy index f5d929653419..d12b60c5fd1c 100644 --- a/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy +++ b/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy @@ -215,6 +215,15 @@ class Intf { assert getPopupElements(new GotoClassModel2(project), 'Bar:[2,3]') == [c] } + public void "test custom line suffixes"() { + def file = myFixture.addFileToProject("Bar.txt", "") + def model = new GotoFileModel(project) + assert getPopupElements(model, 'Bar:2') == [file] + assert getPopupElements(model, 'Bar(2)') == [file] + assert getPopupElements(model, 'Bar on line 2') == [file] + assert getPopupElements(model, 'Bar at line 2') == [file] + } + public void "test dollar"() { def bar = myFixture.addClass("package foo; class Bar { class Foo {} }") def foo = ApplicationManager.application.runReadAction( { bar.innerClasses[0] } as Computable) diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNamePopup.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNamePopup.java index c5e2873be712..2f3bf6ce6b2d 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNamePopup.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNamePopup.java @@ -342,11 +342,12 @@ public class ChooseByNamePopup extends ChooseByNameBase implements ChooseByNameP return newPopup; } - private static final Pattern patternToDetectLinesAndColumns = Pattern.compile("(" + - "(?:\\w:)?" + // absolute path start on Windows - "[^:]+" + - ")" + // main part before line/column - "(?::|@|,|)\\[?(\\d+)?(?:(?:\\D)(\\d+)?)?\\]?"); + private static final Pattern patternToDetectLinesAndColumns = Pattern.compile("(.+?)" + // name, non-greedy matching + "(?::|@|,| on line | at line |)?" + // separator + "[(\\[]?" + // possible opening paren/brace + "(\\d+)?(?:(?:\\D)(\\d+)?)?" + // line + column + "[)\\]]?" // possible closing paren/brace + ); public static final Pattern patternToDetectAnonymousClasses = Pattern.compile("([\\.\\w]+)((\\$[\\d]+)*(\\$)?)"); private static final Pattern patternToDetectMembers = Pattern.compile("(.+)(#)(.*)"); @@ -358,11 +359,7 @@ public class ChooseByNamePopup extends ChooseByNameBase implements ChooseByNameP public static String getTransformedPattern(String pattern, ChooseByNameModel model) { Pattern regex = null; - if (pattern.indexOf(':') != -1 || - pattern.indexOf(',') != -1 || - pattern.indexOf(';') != -1 || - //pattern.indexOf('#') != -1 || - pattern.indexOf('@') != -1) { // quick test if reg exp should be used + if (StringUtil.containsAnyChar(pattern, ":,;@[(") || pattern.contains(" line ")) { // quick test if reg exp should be used regex = patternToDetectLinesAndColumns; }