From 35800aa59add35fae9a555920dba4d9730d70a9a Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 13 Sep 2017 19:08:42 +0200 Subject: [PATCH] goto file: allow middle matching for all parts of path --- .../java/navigation/ChooseByNameTest.groovy | 22 ++++++++++++++----- .../ide/actions/GotoFileItemProvider.java | 17 +++++++++----- .../util/gotoByName/GotoFileCellRenderer.java | 11 +++++++++- .../ide/util/gotoByName/GotoFileModel.java | 3 +-- 4 files changed, 39 insertions(+), 14 deletions(-) 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 c3a09d805e08..40fc43129ccc 100644 --- a/java/java-tests/testSrc/com/intellij/java/navigation/ChooseByNameTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/navigation/ChooseByNameTest.groovy @@ -189,6 +189,13 @@ class Intf { assert calcPopupElements(popup, "./foo/in") == [file] } + void "test don't match path to jdk"() { + def objects = getPopupElements(new GotoFileModel(project), "Object.java", true) + assert objects.size() > 0 + assert (objects[0] as PsiFile).virtualFile.path.contains("mockJDK") + assert getPopupElements(new GotoFileModel(project), "mockJDK/Object.java", true).size() == 0 + } + void "test goto file can go to dir"() { PsiFile fooIndex = myFixture.addFileToProject("foo/index.html", "foo") PsiFile barIndex = myFixture.addFileToProject("bar.txt/bar.txt", "foo") @@ -382,13 +389,18 @@ class Intf { void "test file path matching without slashes"() { def fooBarFile = myFixture.addFileToProject("foo/bar/index_fooBar.html", "") def fbFile = myFixture.addFileToProject("fb/index_fb.html", "") - def fbSomeFile = myFixture.addFileToProject("fb/some/index_fbSome.html", "") + def fbSomeFile = myFixture.addFileToProject("fb/some.dir/index_fbSome.html", "") def someFbFile = myFixture.addFileToProject("some/fb/index_someFb.html", "") - def model = new GotoFileModel(project) - def popup = createPopup(model) + + def popup = createPopup(new GotoFileModel(project)) assert calcPopupElements(popup, "barindex") == [fooBarFile] assert calcPopupElements(popup, "fooindex") == [fooBarFile] - assert calcPopupElements(popup, "fbindex") == [fbFile, someFbFile, fbSomeFile, fooBarFile] + assert calcPopupElements(popup, "fbindex") == [fbFile, someFbFile, fooBarFile, fbSomeFile] + assert calcPopupElements(popup, "fbhtml") == [fbFile, someFbFile, fbSomeFile, fooBarFile] + + // partial slashes + assert calcPopupElements(popup, "somefb/index.html") == [someFbFile] + assert calcPopupElements(popup, "somefb\\index.html") == [someFbFile] } private List getPopupElements(ChooseByNameModel model, String text, boolean checkboxState = false) { @@ -405,7 +417,7 @@ class Intf { semaphore.up() } as Consumer>) } - if (!semaphore.waitFor(10000)) { + if (!semaphore.waitFor(10_000_000)) { printThreadDump() fail() } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/GotoFileItemProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/GotoFileItemProvider.java index 5348fd9e0a76..85abc88a55b0 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoFileItemProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoFileItemProvider.java @@ -67,10 +67,10 @@ public class GotoFileItemProvider extends DefaultChooseByNameItemProvider { pattern = pattern.substring(1); } - String sanitized = removeSlashes(base.transformPattern(pattern)); + String sanitized = removeSlashes(StringUtil.replace(base.transformPattern(pattern), "\\", "/")); List> nameMatches = getFileNameCandidates(base, everywhere, sanitized, !pattern.startsWith("*")); - MinusculeMatcher fullMatcher = NameUtil.buildMatcher("*" + sanitized, NameUtil.MatchingCaseSensitivity.NONE); + MinusculeMatcher fullMatcher = NameUtil.buildMatcher("*" + StringUtil.replace(sanitized, "/", "*/*"), NameUtil.MatchingCaseSensitivity.NONE); PathProximityComparator pathProximityComparator = getPathProximityComparator(); for (List group : nameMatches) { @@ -84,8 +84,8 @@ public class GotoFileItemProvider extends DefaultChooseByNameItemProvider { @NotNull private static String removeSlashes(String s) { - if (s.startsWith("/") || s.startsWith("\\")) return removeSlashes(s.substring(1)); - if (s.endsWith("/") || s.endsWith("\\")) return removeSlashes(s.substring(0, s.length() - 1)); + if (s.startsWith("/")) return removeSlashes(s.substring(1)); + if (s.endsWith("/")) return removeSlashes(s.substring(0, s.length() - 1)); return s; } @@ -133,7 +133,12 @@ public class GotoFileItemProvider extends DefaultChooseByNameItemProvider { } if (group.size() > 1) { - Collections.sort(group, Comparator.comparing(nesting::get).thenComparing(dirCloseness::get).thenComparing(qualifierMatchingDegrees::get).thenComparing(pathProximityComparator).thenComparing(myModel::getFullName)); + Collections.sort(group, + Comparator.comparing(nesting::get). + thenComparing(dirCloseness::get). + thenComparing(qualifierMatchingDegrees::get). + thenComparing(pathProximityComparator). + thenComparing(myModel::getFullName)); } return group; } @@ -144,7 +149,7 @@ public class GotoFileItemProvider extends DefaultChooseByNameItemProvider { String sanitized, boolean preferStartMatches) { int start = Math.max(sanitized.lastIndexOf('/'), sanitized.lastIndexOf('\\')) + 1; List partialNames = IntStreamEx.range(start, sanitized.length()).mapToObj(i -> sanitized.substring(i)).toList(); - List matchers = ContainerUtil.map(partialNames, s -> NameUtil.buildMatcher(s, NameUtil.MatchingCaseSensitivity.NONE)); + List matchers = ContainerUtil.map(partialNames, s -> NameUtil.buildMatcher("*" + s, NameUtil.MatchingCaseSensitivity.NONE)); List> matchingNames = ContainerUtil.map(partialNames, __ -> new ArrayList<>()); myModel.processNames(name -> { diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileCellRenderer.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileCellRenderer.java index fc6a851d061b..1f13238836e8 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileCellRenderer.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileCellRenderer.java @@ -70,7 +70,7 @@ public class GotoFileCellRenderer extends PsiElementListCellRenderer implements Dum } private VirtualFile getContentRoot(@Nullable VirtualFile file) { - return file == null ? null : ProjectFileIndex.SERVICE.getInstance(myProject).getContentRootForFile(file); + return file == null ? null : GotoFileCellRenderer.getAnyRoot(file, myProject); } @Override