From e9e57efef9a70f12e58568461a0661794ec22516 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 11 Oct 2019 12:57:28 +0700 Subject: [PATCH] IDEA-224600 Order of Types in Method Hierarchy is not correct. GitOrigin-RevId: e8f9ae4f9406f9ce513bd396cfc3078a2d7268f9 --- .../method/MethodHierarchyTreeStructure.java | 2 +- .../CyclicInheritance_verification.xml | 4 ++-- .../ExtendsImplementsChain_verification.xml | 5 +++++ .../hierarchy/method/ExtendsImplementsChain/X.java | 14 ++++++++++++++ .../ide/hierarchy/JavaMethodHierarchyTest.java | 4 ++++ 5 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/ide/hierarchy/method/ExtendsImplementsChain/ExtendsImplementsChain_verification.xml create mode 100644 java/java-tests/testData/ide/hierarchy/method/ExtendsImplementsChain/X.java diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyTreeStructure.java b/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyTreeStructure.java index 06fc9b2bdc65..5524bf9a8b90 100644 --- a/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyTreeStructure.java +++ b/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyTreeStructure.java @@ -58,7 +58,7 @@ public final class MethodHierarchyTreeStructure extends HierarchyTreeStructure { while (true) { PsiMethod superMethod = ArrayUtil.getFirstElement(method.findSuperMethods()); if (superMethod == null || superClasses.contains(superMethod.getContainingClass())) break; - superClasses.addAll(findInheritanceChain(method.getContainingClass(), superMethod.getContainingClass())); + superClasses.addAll(0, findInheritanceChain(method.getContainingClass(), superMethod.getContainingClass())); method = superMethod; } return superClasses; diff --git a/java/java-tests/testData/ide/hierarchy/method/CyclicInheritance/CyclicInheritance_verification.xml b/java/java-tests/testData/ide/hierarchy/method/CyclicInheritance/CyclicInheritance_verification.xml index 0651507a8e47..2644e2457018 100644 --- a/java/java-tests/testData/ide/hierarchy/method/CyclicInheritance/CyclicInheritance_verification.xml +++ b/java/java-tests/testData/ide/hierarchy/method/CyclicInheritance/CyclicInheritance_verification.xml @@ -1,6 +1,6 @@ - + - + diff --git a/java/java-tests/testData/ide/hierarchy/method/ExtendsImplementsChain/ExtendsImplementsChain_verification.xml b/java/java-tests/testData/ide/hierarchy/method/ExtendsImplementsChain/ExtendsImplementsChain_verification.xml new file mode 100644 index 000000000000..301c3ed68f60 --- /dev/null +++ b/java/java-tests/testData/ide/hierarchy/method/ExtendsImplementsChain/ExtendsImplementsChain_verification.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/java/java-tests/testData/ide/hierarchy/method/ExtendsImplementsChain/X.java b/java/java-tests/testData/ide/hierarchy/method/ExtendsImplementsChain/X.java new file mode 100644 index 000000000000..2c22299afa86 --- /dev/null +++ b/java/java-tests/testData/ide/hierarchy/method/ExtendsImplementsChain/X.java @@ -0,0 +1,14 @@ +interface A { + public void foo(); +} +class B implements A { + @Override + public void foo() {} +} + +class C extends B { + @Override + public void foo() { + System.out.println("C.foo"); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/ide/hierarchy/JavaMethodHierarchyTest.java b/java/java-tests/testSrc/com/intellij/java/ide/hierarchy/JavaMethodHierarchyTest.java index 5dd1de33750a..fdc94f5d7eb5 100644 --- a/java/java-tests/testSrc/com/intellij/java/ide/hierarchy/JavaMethodHierarchyTest.java +++ b/java/java-tests/testSrc/com/intellij/java/ide/hierarchy/JavaMethodHierarchyTest.java @@ -72,6 +72,10 @@ public class JavaMethodHierarchyTest extends HierarchyViewTestBase { doTest("D", "foo", "X.java"); } + public void testExtendsImplementsChain() throws Exception { + doTest("C", "foo", "X.java"); + } + private void doTest(final String classFqn, final String methodName, final String... fileNames) throws Exception { doHierarchyTest(() -> { final PsiClass psiClass = JavaPsiFacade.getInstance(getProject()).findClass(classFqn, ProjectScope.getProjectScope(getProject()));