From 542b18d69b4d2574af82fe4a08f8b03792346ca5 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 1 Jul 2013 15:54:22 +0200 Subject: [PATCH] IDEA-67267 Go To File should show exact extension patterns matches first --- .../codeInsight/completion/JavadocCompletionTest.java | 2 +- .../com/intellij/navigation/ChooseByNameTest.groovy | 8 ++++++++ .../com/intellij/ide/util/gotoByName/GotoFileModel.java | 3 ++- .../com/intellij/psi/util/NameUtilMatchingTest.groovy | 4 ++++ .../src/com/intellij/psi/codeStyle/MinusculeMatcher.java | 3 ++- 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.java index 3c17cc882e85..1447e939e0de 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavadocCompletionTest.java @@ -54,7 +54,7 @@ public class JavadocCompletionTest extends LightFixtureCompletionTestCase { public void testNamesInMethod1() throws Exception { configureByFile("MethodTagName1.java"); - assertStringItems("see", "serialData", "since", "class", "throws"); + assertStringItems("see", "serialData", "since", "throws", "class"); } public void testParamValueCompletion() throws Exception { diff --git a/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy b/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy index 413f3e3974dc..46413fa9e317 100644 --- a/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy +++ b/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy @@ -3,6 +3,7 @@ import com.intellij.ide.util.gotoByName.ChooseByNameBase import com.intellij.ide.util.gotoByName.ChooseByNameModel import com.intellij.ide.util.gotoByName.ChooseByNamePopup import com.intellij.ide.util.gotoByName.GotoClassModel2 +import com.intellij.ide.util.gotoByName.GotoFileModel import com.intellij.ide.util.gotoByName.GotoSymbolModel2 import com.intellij.openapi.Disposable import com.intellij.openapi.application.ModalityState @@ -76,6 +77,13 @@ class Intf { assert elements == [intf.findMethodsByName('xxx2', false), ChooseByNameBase.NON_PREFIX_SEPARATOR, intf.findMethodsByName('_xxx1', false)] } + public void "test prefer exact extension matches"() { + def m = myFixture.addFileToProject("relaunch.m", "") + def mod = myFixture.addFileToProject("reference.mod", "") + def elements = getPopupElements(new GotoFileModel(project), "re*.m") + assert elements == [m, mod] + } + private List getPopupElements(ChooseByNameModel model, String text) { return getPopupElements(createPopup(model), text) } diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileModel.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileModel.java index 11264b443a61..91badbc3f22d 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileModel.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileModel.java @@ -21,6 +21,7 @@ import com.intellij.ide.util.PropertiesComponent; import com.intellij.ide.util.PsiElementListCellRenderer; import com.intellij.navigation.ChooseByNameContributor; import com.intellij.navigation.NavigationItem; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; @@ -41,7 +42,7 @@ public class GotoFileModel extends FilteringGotoByModel { public GotoFileModel(@NotNull Project project) { super(project, Extensions.getExtensions(ChooseByNameContributor.FILE_EP_NAME)); - myMaxSize = WindowManagerEx.getInstanceEx().getFrame(project).getSize().width; + myMaxSize = ApplicationManager.getApplication().isUnitTestMode() ? Integer.MAX_VALUE : WindowManagerEx.getInstanceEx().getFrame(project).getSize().width; } @Override diff --git a/platform/platform-tests/testSrc/com/intellij/psi/util/NameUtilMatchingTest.groovy b/platform/platform-tests/testSrc/com/intellij/psi/util/NameUtilMatchingTest.groovy index 15156d9a124a..462e92b7834c 100644 --- a/platform/platform-tests/testSrc/com/intellij/psi/util/NameUtilMatchingTest.groovy +++ b/platform/platform-tests/testSrc/com/intellij/psi/util/NameUtilMatchingTest.groovy @@ -499,6 +499,10 @@ public class NameUtilMatchingTest extends UsefulTestCase { assertPreference("*psfi", "PsiJavaFileBaseImpl", "PsiFileImpl", NameUtil.MatchingCaseSensitivity.NONE); } + public void "test prefer matches to the end"() { + assertPreference("*e", "fileIndex", "file", NameUtil.MatchingCaseSensitivity.NONE); + } + public void testPreferences() { assertPreference(" fb", "FooBar", "_fooBar", NameUtil.MatchingCaseSensitivity.NONE); assertPreference("*foo", "barFoo", "foobar"); diff --git a/platform/util/src/com/intellij/psi/codeStyle/MinusculeMatcher.java b/platform/util/src/com/intellij/psi/codeStyle/MinusculeMatcher.java index 7048b914183c..d5013d2ba64a 100644 --- a/platform/util/src/com/intellij/psi/codeStyle/MinusculeMatcher.java +++ b/platform/util/src/com/intellij/psi/codeStyle/MinusculeMatcher.java @@ -182,8 +182,9 @@ public class MinusculeMatcher implements Matcher { int startIndex = first.getStartOffset(); boolean afterSeparator = StringUtil.indexOfAny(name, HARD_SEPARATORS, 0, startIndex) >= 0; boolean wordStart = startIndex == 0 || isWordStart(name, startIndex) && !isWordStart(name, startIndex - 1); + boolean finalMatch = iterable.get(iterable.size() - 1).getEndOffset() == name.length(); - return (wordStart ? 1000 : 0) - integral * 10 + matchingCase + (afterSeparator ? 0 : 1); + return (wordStart ? 1000 : 0) - integral * 10 + matchingCase + (afterSeparator ? 0 : 2) + (finalMatch ? 1 : 0); } public boolean isStartMatch(@NotNull String name) {