Open7
LSPづくりのためのメモ

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 の仕様 及び実装方法
- 新しいマークダウンパーサーが必要な理由
- Markdown LSPの話
- https://meetup-jp.nhncloud.com/3341

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
の記述を付け足す。
これでなんかいけそうな雰囲気

組み込むと便利そうなやつ
- SQL formatter
- sqruff
- リンターもついてる
- https://github.com/quarylabs/sqruff
- sqruff

wasm 関連
- wasm-bindgen で「この型が欲しいときはこう書く」集
- WebAssembly JavaScript Interfaceについて - W3C WD要約と所感
- Rustで学ぶWebAssembly Interface Type入門
- The WebAssembly Component Modelの仕様

VSCode Extension関連
- duckdb-wasm を使った VSCode 拡張機能の作り方
- Using Vite for bundling your Visual Studio Code extension
- Bundling Extensions
- Modern VS Code extension development: The basics
- VSCode for webのextension
- VSCode for desktopのextension

wasmのデバッグ
wasm-pack
でビルド後、vite dev
で起動したサーバでもデバッグできる

vecode for webのextension