ast-grep:13300⭐の Rust 製コード構造検索ツール、パターンコードでコードを探す
コードのリファクタリングや移行作業では、特定パターンのコードを一括で検索する必要がよくあります。例えば、古い API の呼び出し箇所をすべて見つけたり、新しい規約に合わない書き方を特定したりする場合です。従来のテキスト検索(grep)は複雑な構文に対して力不足で、完全な静的解析ツールを書くのは重すぎます。
ast-grep はこの間を埋めるエレガントな解決策を提供します。この Rust 製の CLI ツールは「コードを書くように」コードを検索できます。抽象構文木(AST)に基づいてマッチングを行い、テキストではなく構文構造を理解します。
プロジェクト概要
| 属性 | 内容 |
|---|---|
| GitHub | ast-grep/ast-grep |
| ⭐ Stars | 13.3k |
| 🔧 言語 | Rust |
| ⚡ 特徴 | AST 構造マッチング、20+ 言語対応、コード書き換え |
| 📅 更新 | 活発に開発中 |
コアコンセプト
ast-grep の核心理念はシンプルです:コードでコードを検索する。
従来の grep はテキストのみ処理できますが、ast-grep はコードの AST を解析して構造マッチングを行います。パターンコードを書けば、ast-grep が構文的に一致するコード断片をすべて見つけます。
# すべての console.log 呼び出しを検索
sg --pattern 'console.log($ARGS)' --lang ts
インストール
複数のインストール方法に対応:
# npm
npm install --global @ast-grep/cli
# Homebrew
brew install ast-grep
# Cargo
cargo install ast-grep
# pip
pip install ast-grep-cli
基本的な使い方
1. コマンドライン検索
# 未使用変数(_ で始まる)を検索
sg --pattern 'const $_ = $INIT' --lang ts
# すべての setState 呼び出しを検索
sg --pattern 'setState($VALUE)' --lang ts
2. ルールファイルの使用
.ast-grep/rules/no-console.yml を作成:
id: no-console
language: ts
rule:
pattern: console.log($$$ARGS)
message: 本番コードに console.log を残さないでください
severity: warning
実行:
sg scan
3. コード書き換え
# すべての var を const に置換
sg --pattern 'var $NAME = $INIT' --rewrite 'const $NAME = $INIT' --lang ts
高度な機能
多言語サポート
tree-sitter パーサーに基づき、ast-grep は 20 以上のプログラミング言語をサポート:
- JavaScript / TypeScript
- Python
- Rust
- Go
- Java
- C / C++
- Ruby
- その他…
メタ変数
$ で始まる識別子をワイルドカードとして使用:
$MATCH- 任意の単一 AST ノードにマッチ$$$ARGS- 複数ノードにマッチ(展開マッチング)
# 任意の関数呼び出しにマッチ
sg --pattern '$FUNC($$$ARGS)' --lang ts
オンライン Playground
ast-grep Playground でリアルタイムにパターンをテスト:
// 入力パターン
const $NAME = require('$MODULE')
// マッチ結果
const fs = require('fs') // ✓ マッチ
const path = require('path') // ✓ マッチ
import { readFile } from 'fs' // ✗ 非マッチ(異なる構造)
典型的な使用シーン
| シーン | 例 |
|---|---|
| コード移行 | 非推奨 API 呼び出しの一括置換 |
| 規約チェック | チームのコードスタイル統一 |
| 脆弱性スキャン | 潜在的なセキュリティリスク検出 |
| リファクタ補助 | 分割が必要な複雑関数の特定 |
| 教育デモ | コードパターンの分布状況の可視化 |
類似ツールとの比較
| ツール | マッチング方式 | 書き換え能力 | 使いやすさ |
|---|---|---|---|
| grep | テキスト | 限定的 | ⭐⭐⭐ |
| ast-grep | AST 構造 | 強力 | ⭐⭐⭐⭐ |
| ESLint | AST + ルール | 中程度 | ⭐⭐⭐ |
| Semgrep | AST 構造 | 強力 | ⭐⭐⭐⭐ |
Semgrep と比較して、ast-grep はより軽量で起動が高速です。ESLint と比較して、検索構文がより直感的で、複雑な Visitor パターンを書く必要がありません。
まとめ
ast-grep は「テキスト検索」と「完全な静的解析」の間を埋めます。コード移行、規約の適用、一括リファクタリングを頻繁に行うチームにとって、効率的な中間的な選択肢です。
# 一言でまとめると
sg --pattern '古いコードパターン' --rewrite '新しいコードパターン' --lang ts
コード移行、規約の展開、一括リファクタリングを頻繁に行う場合、ast-grep はツールボックスに追加する価値があります。