SATySFi Language Server の現状と今後

2.8K Views

March 16, 22

スライド概要

2021/06/26 に開催された SATySFi Conf 2021 の発表資料です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

SATYSFI Language Server の 現状と今後 monaqa 2021 年 6 月 26 日

2.

自己紹介 名前: monaqa Twitter: @mo_naqa GitHub: monaqa 技術系コミュニティ所属 SATYSFI Slack vim-jp Slack Rust-jp Slack SATYSFI 歴: 2 年ぐらい 1/29

3.

今までに作った SATYSFI関連のプログラム SATYSFI クラスファイル・パッケージ SLYDIFI スライド作成用のクラスファイル (本スライドも SLYDIFI製) easytable シンプルな記法で書ける表組版 (SATYSFI Conf 2020で発表) figbox 柔軟な図表の配置 railway グラフィックスの作成支援 enumitem 豊富なスタイルの箇条書き AZMath アクセント、 括弧、 amsmathライクな数式環境 その他 satysfi-parser satysfi-language-server Rust 製の SATYSFIパーサ Rust 製の SATYSFI language server (今日のお話) 2/29

4.

目次 Language Server Protocol SATYSFI Language Server の現状 SATYSFI Language Server の実装 SATYSFI Language Server の今後の課題と発展性 3/29

5.

Language Server Protocol Language Server Protocol

6.

Language Server Protocol (LSP) コード補完やエラー情報の提示など、 開発 (+ 執筆) に役立つ様々な機能 をあらゆるエディタに提供するために考案されたプロトコル。 User Language Client (Editor) テキスト⼊⼒ Language Server Request (Completion) “L100, C3 の \te の後に 出すべき補完候補を教えて” 補完候補表⽰ Response “\textbf, \TeX だよ” Language Server Protocol Language Server Protocol 4/29

7.

Language Server (言語サーバ) ある言語の開発に役立つ機能をサービスとして提供したもの。 言語別に実装され、以下のような機能を提供する。 補完 診断情報表示 詳細表示 定義ジャンプ リネーム コードアクション ⋮ ユーザが挿入しようとしている変数名・メソッド名などを予測 して候補を表示する 静的解析によるエラーや警告を表示する カーソル上の変数・関数の型情報やドキュメンテーションなど を表示する カーソル上の変数が定義されている場所に移動する カーソル上の変数名を変更する 言語に応じて様々な処理を実行する(カーソル下にあるモジュー ルのインポート、getter/setter の自動作成など) ⋮ Language Server Protocol 5/29

8.

なぜ LSP が注目されているのか LSP の登場前 エディタ・言語毎に各々プラグインや拡張を作る必要があった テキストエディタ プログラミング⾔語 VSCode Vim Emacs … … マイナー エディタ Language Server Protocol 6/29

9.

なぜ LSP が注目されているのか LSP の登場前 マイナーなエディタ・言語では使用者が少なく実装も進まない テキストエディタ プログラミング⾔語 VSCode Vim Emacs … … マイナー エディタ Language Server Protocol 6/29

10.

なぜ LSP が注目されているのか LSP の登場後 各言語・エディタの実装が 1 つで済むため、無駄が少なく開発も楽 テキストエディタ プログラミング⾔語 VSCode Vim Language Server Protocol Emacs … … マイナー エディタ Language Server Protocol 6/29

11.

SATYSFI Language Server の現状 SATYSFI Language Server の現状

12.

SATYSFI Language Server とは テキストエディタ プログラミング⾔語 VSCode Vim Language Server Protocol Emacs … … マイナー エディタ SATYSFI Language Server の現状 7/29

13.

SATYSFI Language Server とは テキストエディタ プログラミング⾔語 VSCode Vim Language Server Protocol Emacs … … ココ! マイナー エディタ SATYSFI Language Server の現状 7/29

14.

SATYSFI Language Server 以下の GitHub リポジトリで開発中 monaqa/satysfi-language-server The SATySFi Language Server Rust 15 1 現在動作を確認しているクライアント Neovim + coc.nvim(本スライドの作成にも使用) Visual Studio Code(拡張機能のデバッグモードでのみ) 本スライドでは利用者が多いであろう VSCode でのデモの様子を掲載 ちゃんとした VSCode の拡張をどなたか作ってもらえると助かります SATYSFI Language Server の現状 8/29

15.

現在提供している機能 診断情報の表示 詳細情報のホバー表示 定義ジャンプ 補完 SATYSFI Language Server の現状 9/29

16.

現在提供している機能 診断情報の表示 詳細情報のホバー表示 定義ジャンプ 補完 SATYSFI Language Server の現状 10/29

17.

診断情報の表示 構文エラーの箇所と原因を表示 いくつかのエラーについては具体的なエラー原因を表示 パーサの手に負えないものはエラー箇所と期待される字句のみ表示 SATYSFI Language Server の現状 11/29

18.

現在提供している機能 (再掲) 診断情報の表示 詳細情報のホバー表示 定義ジャンプ 補完 SATYSFI Language Server の現状 12/29

19.

詳細情報のホバー表示 変数やコマンドにカーソルを合わせると、 その詳細を表示 (現在は変数 / コマンドの種類と、 判明しているもののみ型情報を表示) SATYSFI Language Server の現状 13/29

20.

詳細情報のホバー表示 変数やコマンドにカーソルを合わせると、 その詳細を表示 (現在は変数 / コマンドの種類と、 判明しているもののみ型情報を表示) SATYSFI Language Server の現状 13/29

21.

現在提供している機能 (再掲) 診断情報の表示 詳細情報のホバー表示 定義ジャンプ 補完 SATYSFI Language Server の現状 14/29

22.

定義ジャンプ コマンドや変数の定義にジャンプ (ファイルを跨いでも有効) SATYSFI Language Server の現状 15/29

23.

定義ジャンプ コマンドや変数の定義にジャンプ (ファイルを跨いでも有効) SATYSFI Language Server の現状 15/29

24.

定義ジャンプ コマンドや変数の定義にジャンプ (ファイルを跨いでも有効) SATYSFI Language Server の現状 15/29

25.

現在提供している機能 (再掲) 診断情報の表示 詳細情報のホバー表示 定義ジャンプ 補完 SATYSFI Language Server の現状 16/29

26.

コマンドの補完機能 ユーザが示す文字列に続く名前のコマンドを候補に表示 (ソースコードを読んで補完候補を生成) SATYSFI Language Server の現状 17/29

27.

コマンドの補完機能 ユーザが示す文字列に続く名前のコマンドを候補に表示 (ソースコードを読んで補完候補を生成) SATYSFI Language Server の現状 17/29

28.

コマンドの補完機能 ユーザが示す文字列に続く名前のコマンドを候補に表示 (ソースコードを読んで補完候補を生成) SATYSFI Language Server の現状 17/29

29.

変数名の補完 プログラムモードでは変数や関数名も補完できる SATYSFI Language Server の現状 18/29

30.

変数名の補完 プログラムモードでは変数や関数名も補完できる SATYSFI Language Server の現状 18/29

31.

補完機能の特徴 カーソル位置のモードを考慮して補完候補を表示 プログラムモードのとき 水平モードのとき (垂直モード以外のところではブロックコマンドの補完が出てこない) SATYSFI Language Server の現状 19/29

32.

補完機能の特徴 コマンド引数の型に応じて異なるスニペットを展開 SATYSFI Language Server の現状 20/29

33.

補完機能の特徴 コマンド引数の型に応じて異なるスニペットを展開 型 スニペット展開結果 inline-text {} block-text < > inline-text list {| |} その他の list []; その他の型 (); SATYSFI Language Server の現状 20/29

34.

SATYSFI Language Server の使用感 基本的に、静的型付け言語と LSP は相性が良い 静的解析で型が判明すれば賢い補完や診断情報をユーザに提示できるため SATYSFI も例外ではない 変数やコマンドに型が付くことで開発体験が向上する モードに応じた補完候補の出し分け 型に応じたスニペットの出し分け etc. SATYSFI の型システムに詳しくないライトユーザこそ使ってほしい 開発者の実力とリソースさえ揃えば、かなり便利な機能が実現できる SATYSFI Language Server の現状 21/29

35.

SATYSFI Language Server の実装 SATYSFI Language Server の実装

36.

実装言語: Rust Rust を選んだ理由 Rust を学びたかった 優れたパフォーマンス・省メモリ性・安全性に惹かれた 静的型付け言語であること由来の書きやすさに惹かれた Rust で書かれた代表的な language server が複数あった Rust rust-analyzer Deno Deno Language Server LATEX TexLab SATYSFI Language Server の実装 22/29

37.

パーサの実装 パーサは language server と別リポジトリで開発 monaqa/satysfi-parser SATySFi parser writtern in Rust. Rust 7 2 Parsing expression grammar (PEG) を用いたパーサ rust-peg というパーサジェネレータを使用 現在は字句解析と構文解析を同時に行う エラー回復やカーソル位置のモードの把握に難あり SATYSFI Language Server の実装 23/29

38.

サーバ機能の実装 (概観) DocumentData 構造体にファイルの内容を保持 ファイルの文字列 構文木 環境 ( Environment ) モジュール(名前、定義の位置) 変数(名前、型情報、定義の位置) コマンド(名前、型情報、定義の位置) SATYSFI Language Server の実装 24/29

39.

各リクエストに対する処理の流れ (抜粋) ファイルが開かれたとき / 変更されたとき (didOpen/didChange) ファイルを構文解析し、成功したらそのファイルの Environment を作成 未解析の依存パッケージ ( @require: xxxx / @import: xxxx ) を構文解析し、 成功すれば先程同様 Environment を作成 補完リクエストがあったとき (completion) カーソル位置のモード(水平モード、数式モードなど)を構文木から取得 そのモードに出現しうる変数 / コマンドのうち、 カーソル位置をスコープ に含むものを Environment から検索 得られた変数 / コマンドを返却 コマンドの場合、型情報があればスニペットを作成 SATYSFI Language Server の実装 25/29

40.

SATYSFI Language Server の 今後の課題と発展性 今後の課題と発展性 SATYSFI Language Server の

41.

エラー回復機構が強力なパーサ エラー回復:文法の誤りを含むコードを適切に処理すること Language server が処理するテキストには文法エラーが高確率で含まれる 例:補完リクエスト時に送られる、入力途中のテキスト ちゃんとやるのはかなり難しい 文法には規則があるが、誤りには一般に規則がない 最低限必要なエラー回復処理はすでに実装 不完全なコマンド文法への対処など 現時点では、1 つでも回復不能なエラーがあると情報を全く取れなくなる カーソル位置のモードや依存パッケージぐらいは取りたい SATYSFI Language Server の今後の課題と発展性 26/29

42.

型検査・型推論機能の追加 まだ型検査・型推論器は実装されていない 変数・コマンドの型推論・型検査によって実現できそうなこと 型エラーの診断情報表示 シグニチャが明記されていないコマンド・変数の補完、詳細情報表示 レコードのフィールド名での補完候補の絞り込み パイプライン演算子直後の補完候補の絞り込み etc. SATYSFI Language Server の今後の課題と発展性 27/29

43.

その他の発展性 Doc comment のホバー表示 ソースコードに直接書かれたドキュメントを参照する機能 現在 doc comment 機能が言語本体の機能として構想されている Auto import コマンド補完の際やコードアクションによって必要な依存を自動解決 予め ~/.satysfi/dist/packages などの全ファイルを見ておけば可能 Code action(言語ならではの特別な編集操作を実現する機能) 未定義のコマンドがあるとき、その定義の雛形をプリアンブルに追加 モジュール内で定義した関数・コマンドのシグニチャを sig に追加 SATYSFI Language Server の今後の課題と発展性 28/29

44.

まとめ SATYSFI language server を開発中 補完機能、定義ジャンプ、ホバー、エラーの表示などの機能を実装 Neovim + coc.nvim や Visual Studio Code 上で動く 今後も様々な発展性が考えられる エラー回復機構の強力なパーサ 型推論・型検査器 その他、Doc comment や Auto import など 是非使ってみてください! monaqa/satysfi-language-server The SATySFi Language Server Rust 15 1 29/29