LSP: [textDocument/semanticTokens/*][] requests Legacy: `analysis.highlights` notification
Semantic highlighting makes it easier for the user to understand the code by making certain syntactic and semantic aspects of the code more visible. The client typically uses this information to apply text color or other highlighting to the code being shown in the editor.
The design of the feature is largely dictated by the protocol, but there are some areas where we have some flexibility. This document will cover those areas.
Syntactic highlighting covers highlighting that is based purely on the syntax of the language. For example, the highlighting of string literals or comments is part of syntactic highlighting.
There is one question related to syntactic highlighting: the handling of keywords. Dart has three categories of identifiers with special semantics, and we needed to decide whether to explicitly represent these three categories of identifiers or whether to ignore the distinctions. It could be argued that ignoring the distinction would violate the principle of language fidelity. It could also be argued that making the distinction might be confusing for the user.
In the end, we decided that the better interpretation of the language spec is that there are two important categories: identifiers that are functioning as a keyword and identifiers that are not. As a result, we treat all of these as keywords whenever they serve the function of a keyword, and treat them as identifiers when they don't.
Semantic highlighting covers highlighting that is dependent on knowing the semantics of the code. For example, highlighting static members of a class differently than instance members requires knowing which member is being referenced and whether it's a static member.