Open4

tower-lspを使ってLSPサーバを作りたい

virusbb001virusbb001

chapter 08-09 ざっくり方針ぎめ

Chapter 08-09は既存のライブラリを使いたいので、tower-lsp-boilerplateの実装と合わせながら進める。
パーサライブラリは chumsky を使用している。
Chapter 09では textDocument/semanticTokens/full のみ実装しているため、 semantic_tokens_full の実装のみ注目する。

lexer() から得られたTokenと範囲を示すSpanのタプルのベクタから、さらに ImCompleteSemanticTokenのベクタに置き換えられる。
ASTからSemantic Tokensを生成している処理もあるが、今は飛ばす。
ImCompleteSemanticToken は 開始位置、長さ、トークンタイプを保持している。
ropey を用いて、ImCompleteSemanticToken から行,列番号を取得しており、そこから SemanticToken を生成している。

  1. compile内でuriとropeの対応を保存する
  2. lexer() 相当関数を実装する
  3. ImCompleteSemanticToken相当に変換する処理を実装する
  4. ImCompleteSemanticTokenからSemanticTokenに変換する処理を実装する
virusbb001virusbb001

Chapter 10

lexer() 相当で Vec<Token> を生成したので、 pub fn syntax_parse() -> impl Parser<Token, Vec<Spanned<Syntax>>, Error = Simple<Token>> + Clone を実装する。

Token から Syntax に変更する処理の実装は tower-lsp-boilerplate/src/chumsky.rsの funcs_parser が参考になる。