コードのリファクタリングや移行作業では、特定パターンのコードを一括で検索する必要がよくあります。例えば、古い API の呼び出し箇所をすべて見つけたり、新しい規約に合わない書き方を特定したりする場合です。従来のテキスト検索(grep)は複雑な構文に対して力不足で、完全な静的解析ツールを書くのは重すぎます。

ast-grep はこの間を埋めるエレガントな解決策を提供します。この Rust 製の CLI ツールは「コードを書くように」コードを検索できます。抽象構文木(AST)に基づいてマッチングを行い、テキストではなく構文構造を理解します。

プロジェクト概要

属性内容
GitHubast-grep/ast-grep
⭐ Stars13.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-grepAST 構造強力⭐⭐⭐⭐
ESLintAST + ルール中程度⭐⭐⭐
SemgrepAST 構造強力⭐⭐⭐⭐

Semgrep と比較して、ast-grep はより軽量で起動が高速です。ESLint と比較して、検索構文がより直感的で、複雑な Visitor パターンを書く必要がありません。

まとめ

ast-grep は「テキスト検索」と「完全な静的解析」の間を埋めます。コード移行、規約の適用、一括リファクタリングを頻繁に行うチームにとって、効率的な中間的な選択肢です。

# 一言でまとめると
sg --pattern '古いコードパターン' --rewrite '新しいコードパターン' --lang ts

コード移行、規約の展開、一括リファクタリングを頻繁に行う場合、ast-grep はツールボックスに追加する価値があります。