はじめに
コードベースが大きくなってくると、「この書き方をしている箇所を全部探したい」という場面が増えてきます。
普通のgrepで検索しても、テキストベースだから意図しないものまで引っかかったり、逆に空白やフォーマットの違いで見逃したりする。これ、意外とストレスなんですよね。
そんな悩みを解決してくれるのが ast-grep です。
抽象構文木(AST)ベースでコードを構造的に検索できるので、「コードの意味」を理解した上で検索・置換ができます。GitHubスター11.6k超えで、SWCやCodeRabbitなど著名なプロジェクトでも採用されているツールです。
ast-grepの特徴・メリット
1. 構造を理解した検索ができる
テキストマッチングではなく、ASTノードでマッチングするので、空白やコメントの有無に左右されません。
例えば「関数呼び出しの前にnullチェックをしているパターン」を探したいとき、通常のgrepだと正規表現を頑張って書く必要がありますが、ast-grepなら直感的に書けます。
2. 書き慣れたコードでパターンを記述
パターン記述が「普通のコードを書くような感覚」でできるのが良いですね。
$VARIABLE のようなメタ変数を使えば、任意のノードにマッチさせることができます。複雑な正規表現を覚える必要がありません。
3. 高速な処理性能
Rustで実装されていて、tree-sitterをパーサーに使用。マルチコア対応で、数千ファイルを一瞬で処理できます。
大規模リファクタリングのときに、この速さは本当にありがたいです。
4. 20以上の言語に対応
JavaScript、TypeScript、Python、Rust、Go、Java、C、C#など、主要な言語はほぼカバーしています。
カスタム言語の登録も可能なので、DSLを使っているプロジェクトでも対応できます。
インストール方法
お好みのパッケージマネージャーでインストールできます。
# npm(Node.jsユーザーにおすすめ)
npm install --global @ast-grep/cli
# Homebrew(macOS)
brew install ast-grep
# pip(Pythonユーザー向け)
pip install ast-grep-cli
# Cargo(Rustユーザー向け)
cargo install ast-grep --locked
# Scoop(Windows)
scoop install main/ast-grep
個人的には、Node.js環境があるならnpmで入れるのが楽だと思います。
基本的な使い方
シンプルな検索
# console.logを検索
ast-grep -p 'console.log($MSG)' -l js
-p でパターン、-l で言語を指定します。$MSG はメタ変数で、任意の引数にマッチします。
検索して置換
# var を let に変換
ast-grep -p 'var $NAME = $VALUE' -r 'let $NAME = $VALUE' -l js
-r で置換パターンを指定。これだけで構造的な置換ができます。
ファイルを直接書き換え
# -i オプションでインプレース編集
ast-grep -p 'var $NAME = $VALUE' -r 'let $NAME = $VALUE' -l js -i
-i を付けると実際にファイルを書き換えます。大量のファイルを一括で修正したいときに便利です。
実践的な例:Optional Chaining への変換
# a && a() を a?.() に変換
ast-grep -p '$A && $A()' -r '$A?.()' -l ts
古いコードベースをモダンな書き方にアップデートするときに使えます。
実践的なユースケース
ライブラリ移行時の一括置換
APIの書き方が変わったライブラリをアップデートするとき、ast-grepが活躍します。
# 例:Zodiosライブラリの移行
ast-grep -p 'new Zodios($URL, $CONF as const,)' -r 'new Zodios($URL, $CONF)' -l ts -i
正規表現では難しい複雑なパターンも、構造的にマッチできるので安心です。
非推奨パターンの検出
YAMLでカスタムルールを定義すれば、独自のリントルールとしても使えます。
# スキャンコマンドでルールベースの検査
ast-grep scan
CIに組み込んで、コーディング規約違反を自動検出する使い方もできますね。
大規模リファクタリング
関数名の変更や、引数の順序変更など、IDEの機能だけでは難しいリファクタリングも対応可能です。
プログラマティックなAPI(Node.js、Python)も用意されているので、複雑な変換ロジックを書くこともできます。
まとめ
ast-grepは、コード検索の概念を変えてくれるツールです。
- ASTベースで構造的な検索・置換ができる
- 書き慣れたコードでパターンを記述
- Rust製で高速、20以上の言語に対応
- 大規模リファクタリングやリント用途にも使える
正直なところ、一度使うと普通のgrepには戻れなくなります。
リファクタリングや技術的負債の解消に取り組んでいるなら、ぜひ試してみてください。時短になりますし、何より「取りこぼし」の心配がなくなるのが精神的に楽なんですよね。
公式サイト: https://ast-grep.github.io/