ast-grep
Workflow
- Schreibe einen Testschnipsel, der den Zielcode repräsentiert
- Schreibe die Regel (beginne mit
pattern, steigere aufkind+has/insidefalls nötig) - Teste mit
--stdin, bevor du die Codebasis durchsuchst - Durchsuche die Codebasis, sobald die Regel zutrifft
Wichtige Fallstricke
Verwende immer stopBy: end bei relationalen Regeln
Ohne stopBy: end stoppen has/inside am ersten nicht passenden Knoten, anstatt den gesamten Teilbaum zu durchlaufen:
# FALSCH – übersieht tief verschachtelte Treffer
has:
pattern: await $EXPR
# RICHTIG
has:
pattern: await $EXPR
stopBy: end
Maskiere Metavariablen in der Shell
$VAR wird von der Shell interpretiert. Entweder maskieren oder in einfache Anführungszeichen setzen:
# Doppelt angeführt: mit Backslash maskieren
ast-grep scan --inline-rules "id: test
language: javascript
rule:
pattern: await \$EXPR" .
# Einfach angeführt: keine Maskierung nötig
ast-grep scan --inline-rules 'id: test
language: javascript
rule:
pattern: await $EXPR' .
Metavariablen müssen den alleinigen Inhalt eines AST-Knotens bilden
Diese funktionieren nicht: obj.on$EVENT, "Hello $WORLD", a $OP b, $jq
Verwende $$OP für unbenannte Knoten (Operatoren, Satzzeichen). Verwende $$$ARGS für null oder mehrere Knoten.
Testen mit --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
Debuggen mit --debug-query
Wenn Regeln nicht zutreffen, inspiziere den AST, um die korrekten kind-Werte zu finden:
ast-grep run --pattern 'your code here' --lang javascript --debug-query=cst
Formate: cst (alle Knoten), ast (nur benannte), pattern (wie ast-grep dein Muster sieht).
Regelsyntax
Siehe references/rule_reference.md für die vollständige Regelreferenz (atomare, relationale, zusammengesetzte Regeln und Metavariablen).