tower-lspを使ってLSPサーバを作りたい
https://zenn.dev/takl/books/0fe11c6e177223 これを1度JavaScriptで実装した上で、再度読みながら
https://github.com/IWANABETHATGUY/tower-lsp-boilerplate/tree/86e3f8603ce97c235f3af81bd784b8b4fbe9f81e を読んで見る
Chapter 07 までは tower-lsp のドキュメントを読めばなんとかなる
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
を生成している。
- compile内でuriとropeの対応を保存する
- lexer() 相当関数を実装する
- ImCompleteSemanticToken相当に変換する処理を実装する
- ImCompleteSemanticTokenからSemanticTokenに変換する処理を実装する
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
が参考になる。