Flutter Engine
The Flutter Engine
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.