From 50cfcbce61b4142190919974a3a9a7dfc651f11f Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 2 Jul 2013 17:44:13 +0200 Subject: [PATCH] IDEA-104327 Navigate > File... > prioritize based on the current file location --- .../navigation/ChooseByNameTest.groovy | 19 ++++++- .../DefaultChooseByNameItemProvider.java | 50 +++++-------------- .../util/proximity/SameDirectoryWeigher.java | 24 ++++----- .../src/META-INF/LangExtensions.xml | 4 +- .../src/META-INF/PlatformLangPlugin.xml | 3 -- 5 files changed, 45 insertions(+), 55 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy b/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy index d056b8dd1cc4..8502f4d2a82c 100644 --- a/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy +++ b/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameTest.groovy @@ -106,6 +106,21 @@ class Intf { assert elements == [ooIndex, fooIndex, fooBarIndex] } + public void "test prefer files from current directory"() { + def fooIndex = myFixture.addFileToProject("foo/index.html", "foo") + def barIndex = myFixture.addFileToProject("bar/index.html", "bar") + def fooContext = myFixture.addFileToProject("foo/context.html", "") + def barContext = myFixture.addFileToProject("bar/context.html", "") + + def popup = createPopup(new GotoFileModel(project), fooContext) + assert getPopupElements(popup, "index") == [fooIndex, barIndex] + popup.close(false) + + popup = createPopup(new GotoFileModel(project), barContext) + assert getPopupElements(popup, "index") == [barIndex, fooIndex] + + } + private List getPopupElements(ChooseByNameModel model, String text) { return getPopupElements(createPopup(model), text) } @@ -122,8 +137,8 @@ class Intf { return elements } - private ChooseByNamePopup createPopup(ChooseByNameModel model) { - def popup = ChooseByNamePopup.createPopup(project, model, (PsiElement)null, "") + private ChooseByNamePopup createPopup(ChooseByNameModel model, PsiElement context = null) { + def popup = ChooseByNamePopup.createPopup(project, model, (PsiElement)context, "") Disposer.register(testRootDisposable, { popup.close(false) } as Disposable) popup } diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultChooseByNameItemProvider.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultChooseByNameItemProvider.java index 7d30b0203090..5556624477a1 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultChooseByNameItemProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultChooseByNameItemProvider.java @@ -18,7 +18,6 @@ package com.intellij.ide.util.gotoByName; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiCompiledElement; @@ -54,7 +53,7 @@ public class DefaultChooseByNameItemProvider implements ChooseByNameItemProvider if (removeModelSpecificMarkup(base, pattern).isEmpty() && !base.canShowListForEmptyPattern()) return true; - ChooseByNameModel model = base.getModel(); + final ChooseByNameModel model = base.getModel(); String matchingPattern = convertToMatchingPattern(base, namePattern); List namesList = new ArrayList(); processNamesByPattern(base, base.getNames(everywhere), matchingPattern, new CollectConsumer(namesList)); @@ -64,10 +63,14 @@ public class DefaultChooseByNameItemProvider implements ChooseByNameItemProvider List sameNameElements = new SmartList(); final Map sameNameWeights = new THashMap(); + Comparator weightComparator = new Comparator() { + Comparator modelComparator = model instanceof Comparator ? (Comparator)model : new PathProximityComparator(model, myContext.get()); + @Override public int compare(Object o1, Object o2) { - return sameNameWeights.get(o1).compareTo(sameNameWeights.get(o2)); + int result = modelComparator.compare(o1, o2); + return result != 0 ? result : sameNameWeights.get(o1).compareTo(sameNameWeights.get(o2)); } }; @@ -99,7 +102,6 @@ public class DefaultChooseByNameItemProvider implements ChooseByNameItemProvider sameNameWeights.put(element, qualifierResult); } } - sortByProximity(base, sameNameElements); Collections.sort(sameNameElements, weightComparator); for (Object element : sameNameElements) { if (!sameNameWeights.get(element).startMatch) { @@ -133,17 +135,6 @@ public class DefaultChooseByNameItemProvider implements ChooseByNameItemProvider Collections.sort(namesList); } - private void sortByProximity(@NotNull ChooseByNameBase base, @NotNull List sameNameElements) { - final ChooseByNameModel model = base.getModel(); - if (model instanceof Comparator) { - //noinspection unchecked - Collections.sort(sameNameElements, (Comparator)model); - } - else { - Collections.sort(sameNameElements, new PathProximityComparator(model, myContext.get())); - } - } - @NotNull private static String getQualifierPattern(@NotNull ChooseByNameBase base, @NotNull String pattern) { final String[] separators = base.getModel().getSeparators(); @@ -314,33 +305,18 @@ public class DefaultChooseByNameItemProvider implements ChooseByNameItemProvider myProximityComparator = new PsiProximityComparator(context); } + private static boolean isCompiledWithoutSource(Object o) { + return o instanceof PsiCompiledElement && ((PsiCompiledElement)o).getNavigationElement() == o; + } + @Override public int compare(final Object o1, final Object o2) { int rc = myProximityComparator.compare(o1, o2); if (rc != 0) return rc; - int compare = Comparing.compare(myModel.getFullName(o1), myModel.getFullName(o2)); - if (compare == 0) { - int o1Weight; - int o2Weight; - - if (o1 instanceof PsiCompiledElement) { - PsiElement navElement = ((PsiCompiledElement)o1).getNavigationElement(); - o1Weight = navElement != o1 ? 0 : 1; - } else { - o1Weight = 0; - } - - if (o2 instanceof PsiCompiledElement) { - PsiElement navElement = ((PsiCompiledElement)o2).getNavigationElement(); - o2Weight = navElement != o2 ? 0 : 1; - } else { - o2Weight = 0; - } - - compare = o1Weight - o2Weight; - } - return compare; + int o1Weight = isCompiledWithoutSource(o1) ? 1 : 0; + int o2Weight = isCompiledWithoutSource(o2) ? 1 : 0; + return o1Weight - o2Weight; } } diff --git a/platform/lang-impl/src/com/intellij/psi/util/proximity/SameDirectoryWeigher.java b/platform/lang-impl/src/com/intellij/psi/util/proximity/SameDirectoryWeigher.java index eee2ddcc2c89..b9b2bc5210f5 100644 --- a/platform/lang-impl/src/com/intellij/psi/util/proximity/SameDirectoryWeigher.java +++ b/platform/lang-impl/src/com/intellij/psi/util/proximity/SameDirectoryWeigher.java @@ -19,13 +19,10 @@ import com.intellij.openapi.util.NullableLazyKey; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.util.ProximityLocation; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.NullableFunction; import org.jetbrains.annotations.NotNull; /** - * NOTE: This class is only registered in platform-based IDEs. In IDEA, SamePackageWeigher is used instead. - * * @author yole */ public class SameDirectoryWeigher extends ProximityWeigher { @@ -33,20 +30,23 @@ public class SameDirectoryWeigher extends ProximityWeigher { PLACE_DIRECTORY = NullableLazyKey.create("placeDirectory", new NullableFunction() { @Override public PsiDirectory fun(ProximityLocation location) { - return PsiTreeUtil.getParentOfType(location.getPosition(), PsiDirectory.class, false); + return getParentDirectory(location.getPosition()); } }); + private static PsiDirectory getParentDirectory(PsiElement element) { + while (element != null && !(element instanceof PsiDirectory)) { + element = element.getParent(); + } + return (PsiDirectory)element; + } + @Override - public Comparable weigh(@NotNull final PsiElement element, @NotNull final ProximityLocation location) { - if (location.getPosition() == null){ - return null; + public Boolean weigh(@NotNull final PsiElement element, @NotNull final ProximityLocation location) { + if (location.getPosition() == null) { + return Boolean.TRUE; } final PsiDirectory placeDirectory = PLACE_DIRECTORY.getValue(location); - if (placeDirectory == null) { - return false; - } - - return placeDirectory.equals(PsiTreeUtil.getParentOfType(element, PsiDirectory.class, false)); + return placeDirectory != null && placeDirectory.equals(getParentDirectory(element)); } } diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index 331d42b4f159..bec5f90b4909 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -464,8 +464,10 @@ - + - -