diff --git a/java/java-indexing-api/src/com/intellij/psi/search/searches/ClassInheritorsSearch.java b/java/java-indexing-api/src/com/intellij/psi/search/searches/ClassInheritorsSearch.java index be4c4f81eb8a..e07692008ff9 100644 --- a/java/java-indexing-api/src/com/intellij/psi/search/searches/ClassInheritorsSearch.java +++ b/java/java-indexing-api/src/com/intellij/psi/search/searches/ClassInheritorsSearch.java @@ -156,7 +156,7 @@ public class ClassInheritorsSearch extends ExtensibleQueryFactory search(@NotNull SearchParameters parameters) { - return INSTANCE.createQuery(parameters); + return INSTANCE.createUniqueResultsQuery(parameters); } public static Query search(@NotNull final PsiClass aClass, @NotNull SearchScope scope, final boolean checkDeep, final boolean checkInheritance) { diff --git a/java/java-tests/testData/psi/search/inheritors/multipleInheritance/Test.java b/java/java-tests/testData/psi/search/inheritors/multipleInheritance/Test.java new file mode 100644 index 000000000000..4b76063ec05a --- /dev/null +++ b/java/java-tests/testData/psi/search/inheritors/multipleInheritance/Test.java @@ -0,0 +1,3 @@ +interface I {} +class A implements I {} +class B extends A implements I{} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java index 69637123c55c..6e3b0ccdff82 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java @@ -116,7 +116,7 @@ public class ImplementationsViewTest extends LightCodeInsightFixtureTestCase { try { final String[] visibleFiles = component.getVisibleFiles(); Assert.assertArrayEquals(Arrays.toString(visibleFiles), - new String[]{"a.java (AFoo)", "a.java (AFoo1 in AFoo)", "a.java (AFoo3 in AFoo)", "a.java (AFoo2 in AFoo)"}, visibleFiles); + new String[]{"a.java (AFoo)", "a.java (AFoo1 in AFoo)", "a.java (AFoo2 in AFoo)", "a.java (AFoo3 in AFoo)"}, visibleFiles); } finally { component.removeNotify(); diff --git a/java/java-tests/testSrc/com/intellij/psi/search/InheritorsTest.java b/java/java-tests/testSrc/com/intellij/psi/search/InheritorsTest.java index 11aa9b6a260d..4d6291e85a2d 100644 --- a/java/java-tests/testSrc/com/intellij/psi/search/InheritorsTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/search/InheritorsTest.java @@ -53,6 +53,10 @@ public class InheritorsTest extends PsiTestCase{ doTest("x.Test", "", true, "x.Goo", "x.Zoo"); } + public void testMultipleInheritance() throws Exception { + doTest("I", "", true, "A", "B"); + } + private void doTest(String className, String packageScopeName, final boolean deep, String... inheritorNames) throws Exception { final PsiClass aClass = myJavaFacade.findClass(className); assertNotNull(aClass); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java b/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java index 312978accbd8..36395b3bef79 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java @@ -60,10 +60,8 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; -import java.util.ArrayList; -import java.util.HashSet; +import java.util.*; import java.util.List; -import java.util.Set; public class ImplementationViewComponent extends JPanel { @NonNls private static final String TEXT_PAGE_KEY = "Text"; @@ -173,7 +171,7 @@ public class ImplementationViewComponent extends JPanel { toolbarPanel.add(myToolbar.getComponent(), gc); setPreferredSize(new Dimension(600, 400)); - + update(elements, new PairFunction, Boolean>() { @Override public Boolean fun(final PsiElement[] psiElements, final List fileDescriptors) { @@ -273,7 +271,7 @@ public class ImplementationViewComponent extends JPanel { @Override public Boolean fun(PsiElement[] psiElements, List fileDescriptors) { if (psiElements.length == 0) return false; - + final Project project = psiElements[0].getProject(); myElements = psiElements; @@ -302,7 +300,7 @@ public class ImplementationViewComponent extends JPanel { else { myFileChooser.setVisible(false); myCountLabel.setVisible(false); - + VirtualFile file = psiFile.getVirtualFile(); if (file != null) { myLabel.setIcon(getIconForFile(psiFile)); @@ -321,9 +319,9 @@ public class ImplementationViewComponent extends JPanel { return true; } }); - + } - + private static void update(@NotNull PsiElement[] elements, @NotNull PairFunction, Boolean> fun) { List candidates = new ArrayList(elements.length); List files = new ArrayList(elements.length); @@ -333,6 +331,15 @@ public class ImplementationViewComponent extends JPanel { names.add(((PsiNamedElement)element).getName()); } } + Arrays.sort(elements, new Comparator() { + @Override + public int compare(PsiElement e1, PsiElement e2) { + if (e1 instanceof PsiNamedElement && e2 instanceof PsiNamedElement) { + return Comparing.compare(((PsiNamedElement)e1).getName(), ((PsiNamedElement)e2).getName()); + } + return e1.hashCode() - e2.hashCode(); + } + }); for (PsiElement element : elements) { PsiFile file = getContainingFile(element); if (file == null) continue;