ast-grep について
ast-grep の構文検索ルールを作成・デバッグするスキルです。テスト用コードからルールを組み立て、`--stdin` で検証し、AST クエリを調べる手順を説明します。
主な機能
- 01テストコードからルールを作成
- 02`--stdin` によるルールのテスト
- 03`--debug-query` によるクエリ確認
- 04リレーショナルルールの走査設定
- 05シェル内のメタ変数のエスケープ
活用シーン
- 01コードベース内の構文パターンを検索
- 02全体検索の前にルールを検証
- 03ネストしたノードを検出できないルールをデバッグ
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ poteto/ noodle --skill ast-grepインストール後、Claude Code で/ast-grepを入力して読み込まれたか確認します。
同梱ファイルreferences/rule_reference.md
詳細
ast-grep
ワークフロー
- 対象コードを表すテスト用スニペットを作成します
- ルールを作成します(
patternから始め、必要に応じてkindとhas/insideに進みます) - コードベースを検索する前に、
--stdinでテストします - ルールが一致したら、コードベースを検索します
重要な注意点
リレーショナルルールでは常にstopBy: endを使用します
これを指定しないと、has/insideはサブツリー全体をたどらず、最初に一致しないノードで探索を停止します。
# WRONG — will miss deeply nested matches
has:
pattern: await $EXPR
# RIGHT
has:
pattern: await $EXPR
stopBy: end
シェルではメタ変数をエスケープします
$VARはシェルによって解釈されます。エスケープするか、シングルクォートで囲んでください。
# Double-quoted: escape with backslash
ast-grep scan --inline-rules "id: test
language: javascript
rule:
pattern: await \$EXPR" .
# Single-quoted: no escaping needed
ast-grep scan --inline-rules 'id: test
language: javascript
rule:
pattern: await $EXPR' .
メタ変数はASTノードの内容全体である必要があります
次の例は動作しません:obj.on$EVENT、"Hello $WORLD"、a $OP b、$jq
名前のないノード(演算子、句読点)には$$OPを使用します。ノード数が0個以上の場合は$$$ARGSを使用します。
--stdinでのテスト
echo "async function test() { await fetch(); }" | ast-grep scan --inline-rules 'id: test
language: javascript
rule:
kind: function_declaration
has:
pattern: await $EXPR
stopBy: end' --stdin
--debug-queryでのデバッグ
ルールが一致しない場合は、ASTを調べて正しいkindの値を見つけます。
ast-grep run --pattern 'your code here' --lang javascript --debug-query=cst
形式:cst(すべてのノード)、ast(名前付きノードのみ)、pattern(ast-grepによるパターンの解釈)。
ルールの構文
ルールの全リファレンス(アトミックルール、リレーショナルルール、複合ルール、メタ変数)については、references/rule_reference.mdを参照してください。
コメント
Markdown 対応