p4analyzer icon indicating copy to clipboard operation
p4analyzer copied to clipboard

Proposal for supporting semantic highlighting

Open timjroberts opened this issue 1 year ago • 1 comments

Discussed in https://github.com/p4lang/p4analyzer/discussions/23

Originally posted by qobilidop April 20, 2023 Semantic highlighting is a feature supported by LSP[1], and major editors/IDEs (like VS Code[2]) through LSP. The benefits of semantic highlighting are explained in more detail in [2]. I think it is a very useful feature, and a natural fit for p4analyzer to implement. As a reference, rust-analyzer has implemented this feature already[3].

Reference:

  • [1] https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_semanticTokens
  • [2] https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide
  • [3] https://github.com/rust-lang/rust-analyzer/issues/604
  • [4] https://github.com/build2/build2/issues/109

timjroberts avatar Apr 24 '23 15:04 timjroberts

The challenge of building a good semantic highlighter is that it should be architecture-aware, meaning that things like:

  • The names of externs (extern constructors) and their parameters
  • The names of extern methods and their parameters
  • The names of architecture-specific types (typedefs, structs, headers, enums, etc.) and constants
  • The names of architecture-specific package (package constructrors) and their parameters

should be properly highlighted. All this information can be gleaned by analyzing the architecture-specific include files, such as tna.p4, psa.p4, etc.

In addition to that, the highlighter should also be target-aware so that it can properly highlight:

  • target-specific annotations
  • target-specific table attributes (properties)

Unfortunately, there is no standard method to retrieve those. Intel's Tofino compiler allows one to dump all Tofino-specific annotations, but there is no way to dump Tofino-specific table attributes (fortunately, there are not that many).

Semantic highlighter for Emacs supports all the above (@timjroberts -- ask me for the latest version), but only for TNA and T2NA, because all those definitions are hard-coded inside (and I do even update them periodically).

p4analyzer should definitely do better than that.

vgurevich avatar May 05 '23 02:05 vgurevich