🧊

特定のcrateで公開されてるstructとenumを列挙する

たとえば、oxc_astでは数多のASTノードが公開されてる。

それらを列挙して一覧したい場合に、どういうやり方があるか?っていう。

ソースを見る案

最初に思いつくのはこれ。

https://github.com/oxc-project/oxc/blob/main/crates/oxc_ast/src/ast/js.rs

ただ、ファイルも分かれてるし、もちろん余分な情報もあるし、なによりmacroなんかがあると読みにくい。

docs.rsで見る案

https://docs.rs/oxc_ast/0.79.0/oxc_ast/ast/index.html#structs

イメージとしてはこれが一番近い。

けど、structの詳細は別ページになってたりと、一覧性がいまいち。

スクレイピングすればいいけど、できればしたくない・・・。

rust-analyzerを使う案

https://rust-lang.github.io/rust-analyzer/ide/

LSP経由でそういう情報を引き抜けるのでは・・・と思ったが、やり方がよくわからなかった。

というわけで

最終的に辿り着いたのが、cargo rustdocでcrateを指定し、なおかつJSONで出力させるという方法。

cargo +nightly rustdoc -p oxc_ast -Z unstable-options --output-format json

nightlyが必要な上にunstableという綱渡ではあるけど、これでJSONを用意して、それを整形する。

ちなみに、cargo doccargo rustdocは、後者の方がよりプリミティブなAPIになってるらしい。

https://github.com/rust-lang/cargo/blob/840b83a10fb0e039a83f4d70ad032892c287570a/src/bin/cargo/commands/doc.rs https://github.com/rust-lang/cargo/blob/840b83a10fb0e039a83f4d70ad032892c287570a/src/bin/cargo/commands/rustdoc.rs

JSONは手に入ったが、とにかくデカくて構造もどうなってるのかイマイチわからんかったので、Claude様によしなにやらせた結果、こういうスクリプトになった。

https://github.com/leaysgur/oxc-ast-mcp/blob/02989b41eea8680263c846b59ef5edbea40ffefd/generate-oxc_ast-nodes.mjs

そうして出力されたのがこれ。こういう作業にはAIがめちゃめちゃ便利よね。

https://github.com/leaysgur/oxc-ast-mcp/blob/02989b41eea8680263c846b59ef5edbea40ffefd/ast-nodes.generated.json

欲しかったやつができた!