We’re currently designing a new IDE feature named Call Hierarchy. Essentially, it allows you to find places where a given method is called, which is similar to how Find All References currently works. However, unlike Find All References, the Call Hierarchy feature provides more deep understanding and more detailed information about calls.
You can invoke the Call Hierarchy toolwindow by right-clicking on a method, property or constructor name in the code editor and choosing View Call Hierarchy from the context menu:
A toolwindow will appear docked on the bottom of the Visual Studio window:
You can expand the node for the method to see information about it: incoming calls to the method ("Calls To") and outgoing calls ("Calls From"):
Here’s how it works. A method (or a property, or a constructor) is displayed as a root in the treeview. You can expand the node to get a list of "search categories" – things you want to find. Four search categories are currently supported:
- Calls To – "incoming" calls to this member
- Calls From – "outgoing" calls mentioned in this member’s body
- Overrides – available only for abstract or virtual members
- Implements – finds places where an interface member is implemented
When you expand a search node (such as Calls To ‘GetCallableMethods’), a solution-wide search is started in the background and the results appear under the Calls To folder. You can click on a result, and the details will appear in the Details list view on the right hand side.
The Details list view shows all the exact call sites and locations in code where GetCallableMethods is called from GenerateXsdForComplexTypes. We see that the method is being called only once, the line of code is shown, as well as file name and position in the file. Double-clicking on that call site will navigate to it in the code editor.
The advantages of Call Hierarchy compared to Find All References is that it allows you to explore and drill deep multiple levels into the call graph (find caller’s caller etc.) Also, Call Hierarchy has deeper and more fine-granular understanding of the source code – while Find All References just finds the symbols, Call Hierarchy differentiates abstract and virtual methods, interface implementations, actual calls from delegate creation expressions, etc. Also it works like a scratch-pad: you can add any member as another root-level item in the call hierarchy tool window and have several members displayed there at once. Finally, the Details Pane given information about the concrete call sites, if a method is being called several times in the body of the calling method.
In the toolbar you can select the scope of the search: search in currently opened file only, current project or the entire solution.
Refresh button re-fills the treeview in case the original source code was modified.
If a root node of the treeview is selected, the "Delete Root" button will remove it from the treeview. You can add any member as a new root in the treeview by right-clicking on it in the context menu:
or adding it from the source code as described in the beginning.
Finally, the Toggle Details Pane button shows or hides the details pane.
Some design issues and implementation details
Although the feature is already implemented and if you have the Visual Studio 2010 CTP, you can already play with Call Hierarchy, we’re still not quite happy with the current UI design, usability and the user experience.
For example, one issue that we’re seeing is that it takes 2 mouseclicks and 2 mousemoves to invoke the Find All References search, but it takes 4 mouseclicks and 4 mousemoves to get the callers list for a given method (1 click – menu invocation, 1 click – menu item selection, 1 click – expand the treeview node for the method, 1 click – expand the "Calls To" folder). Although the search itself will be slightly faster than Find All References, the perceived complexity of invoking the feature is something we definitely want to improve. We want this feature to be at least as good and usable as Find All References, but also provide additional benefits, otherwise people will just not use the feature and continue using Find All References.
I think I’ll stop for now and see what kind of feedback you guys might have about this. In the next blog post I plan to share more of our current thinking and what we’d like to change. For now, I’d be really interested to know what you think and if you have any suggestions or ideas. Now it’s not too late, and we can change the feature based on your feedback.