メインコンテンツまでスキップ

Rome Tools

· 約4分

Rome は、JavaScript と TypeScript のパースに様々な技術を使用しています。このチュートリアルでは、それらを理解しやすい順序で要約しています。

歴史

  • Rome のコードベースは TypeScript から Rust に書き直されました。詳細は Rome will be rewritten in Rust をご覧ください。
  • この決定は、rslintrust-analyzer の作者との話し合いの結果行われました。
  • rust-analyzer は、IDE のようなツールを具象構文木をベースに構築できることを証明しました。
  • rslint は、rust-analyzer で使用されているライブラリを用いて、 Rust で JavaScript のパーサーを実装できることを証明しました。
  • Rome は、作者の許可を得て rslint のコードベースを自分たちのリポジトリに移植しました。

具象構文木 (CST)

  • ベースライブラリは rowan と呼ばれており、詳細は overview of rowan をご覧ください。
  • Rowan (red-green trees としても知られている) は、赤いベリーを実らせる Rowan という木にちなんで名付けられました。
  • red-green trees の由来は、C# の作者によるブログ記事で説明されています。
  • Rowan は、ソースコードのすべてを記述する損失のない CST を定義し、構文木の親、子、兄弟ノードなどを走査する一連の API を提供します。
  • AST よりも CST を利用する利点については、Pure AST based linting sucks をご覧ください。
  • CST は完全に回復可能なパーサーを構築する手段を提供します。

文法

  • AST と同様に文法を定義する必要があります。文法は、xtask/codegen を使用して自動生成されます。
  • 文法は ungrammar という DSL から生成されます。
  • 入力の ungrammar の ソースファイルは、xtask/codegen/js.ungram にあります。
  • 生成されるコードは、 rome_js_syntax/src/generated にあります。

エントリーポイント

Rome のコードベースは大きくなり、パーサーのエントリーポイントを見つけるのが少し難しくなっています。

初めての方のために、コードを実行するためのバイナリのエントリーポイントである rome_cli クレートを見てみましょう。

cargo run -p rome_cli

touch test.js
cargo run -p rome_cli -- check ./test.js

rome_cli は最終的に rome_js_parser::parse を呼び出します。

https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/parse.rs#L178-L187

実際のパーサーのコードはこちらのように始まります。

https://github.com/rome/tools/blob/9815467c66688773bc1bb6ef9a5b2d86ca7b3682/crates/rome_js_parser/src/syntax/program.rs#L14-L17

コントリビューション

  • CONTRIBUTING.md には、コントリビューションの方法の説明があります。
  • パーサーのテストについては、cargo codegen test をご確認ください。
  • 適合テストについては、 cargo coverage をご覧ください。
  • 分からないことがあれば、Discord サーバー で自由に質問できます。
備考

JavaScript / TypeScript パーサーは 99% 完成しています。コントリビューションの最善の方法は、独自のコードベースで Rome をテストするか、Github の問題を確認することです。