Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SATySFi Language Server の現状と今後

monaqa
June 26, 2021

SATySFi Language Server の現状と今後

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

monaqa

June 26, 2021
Tweet

More Decks by monaqa

Other Decks in Programming

Transcript

  1. 2/29 今までに作った SATYSFI関連のプログラム SATYSFI クラスファイル・パッケージ SLYDIFI スライド作成用のクラスファイル (本スライドも SLYDIFI製) easytable

    シンプルな記法で書ける表組版 (SATYSFI Conf 2020で発表) figbox 柔軟な図表の配置 railway グラフィックスの作成支援 enumitem 豊富なスタイルの箇条書き AZMath アクセント、 括弧、 amsmathライクな数式環境 その他 satysfi-parser Rust 製の SATYSFIパーサ satysfi-language-server Rust 製の SATYSFI language server (今日のお話)
  2. 3/29 目次 Language Server Protocol SATYSFI Language Server の現状 SATYSFI

    Language Server の実装 SATYSFI Language Server の今後の課題と発展性
  3. Language Server Protocol 4/29 Language Server Protocol (LSP) コード補完やエラー情報の提示など、 開発

    (+ 執筆) に役立つ様々な機能 をあらゆるエディタに提供するために考案されたプロトコル。 “L100, C3 の \te の後に 出すべき補完候補を教えて” “\textbf, \TeX だよ” Request (Completion) Language Client (Editor) Language Server Protocol User Language Server Response テキスト⼊⼒ 補完候補表⽰
  4. Language Server Protocol 5/29 Language Server (言語サーバ) ある言語の開発に役立つ機能をサービスとして提供したもの。 言語別に実装され、以下のような機能を提供する。 補完

    ユーザが挿入しようとしている変数名・メソッド名などを予測 して候補を表示する 診断情報表示 静的解析によるエラーや警告を表示する 詳細表示 カーソル上の変数・関数の型情報やドキュメンテーションなど を表示する 定義ジャンプ カーソル上の変数が定義されている場所に移動する リネーム カーソル上の変数名を変更する コードアクション 言語に応じて様々な処理を実行する (カーソル下にあるモジュー ルのインポート、 getter/setter の自動作成など) ⋮ ⋮
  5. Language Server Protocol 6/29 なぜ LSP が注目されているのか LSP の登場後 各言語・エディタの実装が

    1 つで済むため、無駄が少なく開発も楽 … … VSCode Vim Emacs マイナー エディタ テキストエディタ プログラミング⾔語 Language Server Protocol
  6. SATYSFI Language Server の現状 7/29 SATYSFI Language Server とは …

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

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

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

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

    を学びたかった 優れたパフォーマンス・省メモリ性・安全性に惹かれた 静的型付け言語であること由来の書きやすさに惹かれた Rust で書かれた代表的な language server が複数あった Rust rust-analyzer Deno Deno Language Server LATEX TexLab
  11. SATYSFI Language Server の実装 23/29 パーサの実装 パーサは language server と別リポジトリで開発

    monaqa/satysfi-parser SATySFi parser writtern in Rust. Rust 7 2 Parsing expression grammar (PEG) を用いたパーサ rust-peg というパーサジェネレータを使用 現在は字句解析と構文解析を同時に行う エラー回復やカーソル位置のモードの把握に難あり
  12. SATYSFI Language Server の実装 24/29 サーバ機能の実装 (概観) DocumentData 構造体にファイルの内容を保持 ファイルの文字列

    構文木 環境 (Environment) モジュール(名前、定義の位置) 変数(名前、型情報、定義の位置) コマンド(名前、型情報、定義の位置)
  13. SATYSFI Language Server の実装 25/29 各リクエストに対する処理の流れ (抜粋) ファイルが開かれたとき / 変更されたとき

    (didOpen/didChange) ファイルを構文解析し、成功したらそのファイルの Environment を作成 未解析の依存パッケージ ( @require: xxxx / @import: xxxx ) を構文解析し、 成功すれば先程同様 Environment を作成 補完リクエストがあったとき (completion) カーソル位置のモード(水平モード、数式モードなど)を構文木から取得 そのモードに出現しうる変数 / コマンドのうち、 カーソル位置をスコープ に含むものを Environment から検索 得られた変数 / コマンドを返却 コマンドの場合、型情報があればスニペットを作成
  14. SATYSFI Language Server の今後の課題と発展性 26/29 エラー回復機構が強力なパーサ エラー回復:文法の誤りを含むコードを適切に処理すること Language server が処理するテキストには文法エラーが高確率で含まれる

    例:補完リクエスト時に送られる、入力途中のテキスト ちゃんとやるのはかなり難しい 文法には規則があるが、誤りには一般に規則がない 最低限必要なエラー回復処理はすでに実装 不完全なコマンド文法への対処など 現時点では、 1 つでも回復不能なエラーがあると情報を全く取れなくなる カーソル位置のモードや依存パッケージぐらいは取りたい
  15. SATYSFI Language Server の今後の課題と発展性 28/29 その他の発展性 Doc comment のホバー表示 ソースコードに直接書かれたドキュメントを参照する機能

    現在 doc comment 機能が言語本体の機能として構想されている Auto import コマンド補完の際やコードアクションによって必要な依存を自動解決 予め ~/.satysfi/dist/packages などの全ファイルを見ておけば可能 Code action (言語ならではの特別な編集操作を実現する機能) 未定義のコマンドがあるとき、その定義の雛形をプリアンブルに追加 モジュール内で定義した関数・コマンドのシグニチャを sig に追加
  16. 29/29 まとめ SATYSFI language server を開発中 補完機能、定義ジャンプ、ホバー、エラーの表示などの機能を実装 Neovim + coc.nvim

    や Visual Studio Code 上で動く 今後も様々な発展性が考えられる エラー回復機構の強力なパーサ 型推論・型検査器 その他、 Doc comment や Auto import など monaqa/satysfi-language-server The SATySFi Language Server Rust 15 1 是非使ってみてください!