Open4
LSPづくりのためのメモ
![ktz_alias](https://zenn-dev.github.io/default-avatars/dark/k.png)
LSPをどう実装したらいいのか1㍉もわからないので、関連しそうなことを片っ端から突っ込むスレ
参考にしたリンク
- Tree-sitter
- tree-sitter-sql
- lezer-parser/import-tree-sitter-scanner
- tree-sitterからleser構文へ変換するツール
- codemirrorのsyntax highlight用
- https://github.com/lezer-parser/import-tree-sitter
- なんかフォーク
- tree-sitterからleser構文へ変換するツール
- rain言語のcodemirror用LSP
- wasm-lspのチュートリアル (VS Code)
- Using WebAssembly for Extension Development
- Using WebAssembly for Extension Development - Part Two
- https://code.visualstudio.com/blogs/2024/06/07/wasm-part2
- Rustのクレートlsp_typesを使った解説
- lsp_types
- サンプル
- duckdb本家のwasm-shellはwasmでduckdb-wasmと連携している
- The
wasm-bindgen
Guide - supabase-community/postgres_lsp
- https://github.com/supabase-community/postgres_lsp
-
PostgreSQL
特化LSP
-
Rust
実装- wasm-bindgenつかってるから多分wasm
- コード補完のための構文解析は
tree-sitter-sql
を使用 - Feature (サブクレートとして実装されている)
- DB接続
- コマンド実行 (command)
- コード補完 (completion)
- 診断表示 (diagnostics)
- hover表示
- inlay hint表示
- lint
- (などなど)
- sqls-server/sqls
- https://github.com/sqls-server/sqls
- 汎用DatabaseLSP
-
Go
実装 - Featur
- https://github.com/sqls-server/sqls/blob/master/internal/lsp/lsp.go
- hover表示
- コード補完 (completion)
- 定義へのリンク
- コードアクション
- コードレンズ
- フォーマッター
- コマンド実行 (command)
- Language Server Protocol の仕様 及び実装方法
![ktz_alias](https://zenn-dev.github.io/default-avatars/dark/k.png)
tree-sitter
コード補完のための構文木構築にはtree-sitter
が多く用いられている印象
-
tree-sitter
のパーザを作るためには専用のルール定義を用意する必要がある- ルールは
EBNF
ライク
- ルールは
-
duckdb
はyacc
でパーザを作っているため、変換が必要- 幸いにして
duckdb/third_party/libpg_query/grammar/grammar_out.output
を出力してくれている -
Grammer
セクションを入力にできる。 - 必要に応じて、
Terminals, with rules where they appear
から終端記号を抽出- 大抵は
Grammer
セクションから抽出できる
- 大抵は
- 幸いにして
-
Grammer
セクションの内容を扱いやすくするため、Json
などの汎用フォーマットで抜き出す。 -
Grammer AST
をEBNF
に変換する -
EBNF
にtree-sitter
の記述を付け足す。
これでなんかいけそうな雰囲気
![ktz_alias](https://zenn-dev.github.io/default-avatars/dark/k.png)
組み込むと便利そうなやつ
- SQL formatter
- sqruff
- リンターもついてる
- https://github.com/quarylabs/sqruff
- sqruff
![ktz_alias](https://zenn-dev.github.io/default-avatars/dark/k.png)
wasm 関連
- wasm-bindgen で「この型が欲しいときはこう書く」集
- WebAssembly JavaScript Interfaceについて - W3C WD要約と所感
- Rustで学ぶWebAssembly Interface Type入門
- The WebAssembly Component Modelの仕様