| # Adding Semantic Highlighting | |
| This document describes what semantic highlighting is and how to enhance it. | |
| ## Overview | |
| Syntactic highlighting is the support that styles tokens in the source code | |
| based on where those tokens are located in the grammar. For example, syntactic | |
| highlighting is used to apply a color to all of the keywords and | |
| pseudo-keywords. | |
| Semantic highlighting includes syntactic highlighting, but additionally styles | |
| tokens based on their semantics. For example, semantic highlighting is used to | |
| apply a color to type names or a strikethrough to deprecated elements. | |
| Note that the analysis server isn't the only implementation of syntactic | |
| highlighting that the Dart team controls, and all of the implementations should | |
| be kept reasonably consistent with each other. | |
| ## Enhancing semantic highlighting | |
| If we have decided to change semantic highlighting, you can add that support by | |
| modifying the class `_DartUnitHighlightsComputerVisitor`. That class is a | |
| `RecursiveAstVisitor`, so the first task is to figure out which kind of node | |
| contains the text to be styled. 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, use one of the private methods on the `computer` to | |
| associate a highlight region with a `HighlightRegionType`. The mapping from a | |
| highlight type to actual text styling is handled by the client (and is in some | |
| cases user controlled). | |
| ## Testing semantic highlighting | |
| The tests for semantic highlighting are in the class | |
| `AnalysisNotificationHighlightsTest`. | |
| The tests generally follow the following pattern: | |
| 1. Use `addTestFile` to add a file containing code that should be highlighted. | |
| 2. Use `await prepareHighlights();` to compute and cache the semantic | |
| highlighting results. | |
| 3. Use `assertHasRegion` to test that the expected highlight type is associated | |
| with the region that matches the search string. If the search string needs to | |
| be longer than the highlight region in order to be unique, then the optional | |
| length argument can be provided so specify the expected length of the region. |