# Adding Navigation This document describes what navigation is and how to enhance it. ## Overview Navigation is the ability to move from one piece of text to a related location. This includes such things as jumping to the declaration of an identifier or opening a file based on a URI or file path. ## Enhancing navigation If we have decided to provide navigation from a given kind of text that was previously not supported, you can add that support by modifying the class `_DartNavigationComputerVisitor`. That class is a `RecursiveAstVisitor`, so the first task is to figure out which kind of node contains the text at the origin. You can then either add a new `visit` method for the node or edit an existing method. If you're adding a new `visit` method, you'll need to invoke the overridden method to ensure that children are still visited. Within the `visit` method, compute the region from which the user can navigate and the location to which they should be navigated. There are some utility methods in `_DartNavigationCollector`, to make common cases easier, or you can use `computer.collector.addRegion` to add an arbitrary region. ## Testing the navigation The tests for navigation are in the class `AnalysisNotificationNavigationTest`. The tests generally follow the following pattern: 1. Use `addTestFile` to add a file containing both the origin and target of the navigation. 2. Use `await prepareNavigation();` to compute and cache navigation results. 3. Use `assertHasRegion` to test that the offset of the string in the test file is a navigation origin, and `assertHasTarget` to ensure the target to which the user will be navigated.