From 060b465fff5e26b0ca0acfd4c57fd337c6f6733b Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Sat, 12 Oct 2019 02:24:47 +0300 Subject: [PATCH] more on IDEA-160274 Field Call Hierarchy When a field is used in a method, the hierarchy takes you to the line of the method definition instead of the line in the method where the field is used. GitOrigin-RevId: 47e9df4670e20c4cd07c3ca64f68ba1bdb826a50 --- .../call/CallerMethodsTreeStructure.java | 15 ++++----------- .../testData/ide/hierarchy/call/Field/A.java | 1 + .../hierarchy/call/Field/Field_verification.xml | 3 +++ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/call/CallerMethodsTreeStructure.java b/java/java-impl/src/com/intellij/ide/hierarchy/call/CallerMethodsTreeStructure.java index a5df8d6b732b..7ccefaaa2347 100644 --- a/java/java-impl/src/com/intellij/ide/hierarchy/call/CallerMethodsTreeStructure.java +++ b/java/java-impl/src/com/intellij/ide/hierarchy/call/CallerMethodsTreeStructure.java @@ -9,11 +9,9 @@ import com.intellij.psi.*; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.psi.search.searches.ReferencesSearch; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.ArrayUtilRt; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.JBIterable; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -98,15 +96,10 @@ public final class CallerMethodsTreeStructure extends HierarchyTreeStructure { assert enclosingElement instanceof PsiField; - Set methodsToFindForField = new HashSet<>(); - ReferencesSearch.search(enclosingElement, enclosingElement.getUseScope()).forEach(reference -> { - PsiMethod method = PsiTreeUtil.getParentOfType(reference.getElement(), PsiMethod.class); - if (method != null) methodsToFindForField.add(method); - }); - - return JBIterable.from(methodsToFindForField) - .map(method -> new CallHierarchyNodeDescriptor(myProject, nodeDescriptor, method, false, false)) - .toArray(new CallHierarchyNodeDescriptor[]{}); + return ReferencesSearch + .search(enclosingElement, enclosingElement.getUseScope()).findAll().stream() + .map(PsiReference::getElement).distinct() + .map(e -> new CallHierarchyNodeDescriptor(myProject, nodeDescriptor, e, false, false)).toArray(); } private static boolean isLocalOrAnonymousClass(PsiMember enclosingElement) { diff --git a/java/java-tests/testData/ide/hierarchy/call/Field/A.java b/java/java-tests/testData/ide/hierarchy/call/Field/A.java index df862135f233..8a7d242c6fcb 100644 --- a/java/java-tests/testData/ide/hierarchy/call/Field/A.java +++ b/java/java-tests/testData/ide/hierarchy/call/Field/A.java @@ -7,6 +7,7 @@ public class A { public static void main2(String[] args) { testField += ""; + testField += "b"; } public static void main3(String[] args) { diff --git a/java/java-tests/testData/ide/hierarchy/call/Field/Field_verification.xml b/java/java-tests/testData/ide/hierarchy/call/Field/Field_verification.xml index 750d94c52d2a..fe5d83121f56 100644 --- a/java/java-tests/testData/ide/hierarchy/call/Field/Field_verification.xml +++ b/java/java-tests/testData/ide/hierarchy/call/Field/Field_verification.xml @@ -5,6 +5,9 @@ + + +