以下の内容はhttps://fs0414.hatenablog.com/entry/2025/11/29/185839より取得しました。


fast lean, ast-grep / speaker note

fs0414.github.io

kichijojipm.connpass.com

total 5min

-- 0min timmer start

fast lean, ast-grepというテーマで話します。よろしくお願いします。 こんばんは、fujitani soraです。 株式会社xxxのソフトウェアエンジニアです。あとはスライドに書いてあるようないろいろに取り組んでいます。 最近はcode formatterが好きで、Prettierのバグを直したり、自作のRust製Ruby Code Formatterを公開したりしました。

本題に入ります。 みなさんCLIからコード検索という操作をすることがあると思いますが、こんなケースを考えてみてください。 isNodeという関数の呼び出しだけを正確に検索したいです。 何らかの手段で文字列による検索をすると思いますが、意外と難しいです。

例えばgrepによる文字列検索だと、オプション次第ですがデフォルトではあいまい検索による一致やコメントアウトまでヒットしてしまう。みたいなケースがあってかなり難しいです。 正規表現による検索を考えてみますが、これもwhite spaceや改行、検索対象の関数が取るパラメータの違いなどの問題で難しいケースがあります。まぁあと正規表現を検索の度に書きたい人は多分いないと思います。

この課題を解決するアプローチの一つとして、抽象構文木の構造から検索するというものがあると考えています。 コードの字面ではなくParse結果によるコードの構造を検索できれば、特定文字列に一致し、かつそれが構文木の上でも関数呼び出しであるということを検索できれば、その他の要因に依存しない検索を達成できます 抽象構文木, abstract syntax tree, 以降はastと呼びます。

--- 1min

このようなastを考慮した検索, 一括置換の手段として、ast-grepというCLI toolを布教したいのがこのセッションです。 ast-grep, 使ったことがある人は手を挙げていただいていいですか? (たぶん50人中5~10人くらいのヨミ) そうですね、今日から検索するときの手札の一つにしていただけますと。

一度スライドを見てほしいのですが、このようにコードを文字列そのままではなく、関数やそのパラメータなどに抽象化して検索クエリとすることができます。

--- 2min

How to Useについてみていきます。 Prettierには入力をParseした後のオブジェクトを変換するPinterというモジュール内で、isNode関数がどれくらい使われているかを見ていきます。 ast-grepではcli実行のオプションとして条件を指定することができます。 スライドの例だと、langで検索対象言語、patternで検索したい構文パターン、対象ディレクトリを指定します. 実際にこの関数は複数ケースで利用されていて、最初に求めていた正確な関数呼び出しの検索に成功します。

ここまでの説明だと、結局複雑なパターンをCLI実行するという意味で、正規表現で辛かった複雑性をカバーできていないように思いますが、ast-grepはyml fileに実行コードパターンを記述しておき、scan optionによって再現性を持った実行を行うことが可能です。 この機能によって、custom linterとしての応用や、Agentのsoruceに利用するケースなど、一気に使用法に幅が出てくるのもいいところです。

-- 3min

最後の例示として、リファクタリングをサポートするケースを紹介します。 javascriptでは配列の末尾要素にアクセスするための方法としてarray.atが用意されており、EcmaScriptというjsの標準仕様とされています。 prettierでは実際に、asが仕様化される前の構文とされた後の構文が混在している状況になっています。 これはast-grepによって検出可能です。 そしてast-grepの特徴的な機能として、検索されたコードをCLIから直接書き換えることができます。 うまく使えばAPIの破壊的変更に一括で対応するなどのユースケースに使えます。 僕はLSP Renameではカバーできない一括置換にはよくこの機能を利用しています。 また、デフォルトではdry runである故に誤検出のリスクを抑えた書き換えにも対応しています。

--- 4min

まだ若いツールなので使用事例はそこまで多くありませんが、コードに対する人間やAIからのアプローチとして手軽に構文木を使えることは便利なケースが多そうだし、手札の一つとして持っておけるといいと思っています。 軽くまとめで、ruleをyamlとしておいておけたり、構文解析可能で対応があれば言語に依存せずに使用できるところはとてもいいなと思っています。 ツール個別のcustom lintを覚えるよりも汎用的で扱いやすい仕組みになれるかもなとかも思っています。

では、自分の発表は以上になりますが、 Terminal界隈(?)のイベントが増えているのを最近観測していて、自分も貢献したり仲良くなれると嬉しいなと思ってます。 ありがとうございました。

-- done




以上の内容はhttps://fs0414.hatenablog.com/entry/2025/11/29/185839より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14