ast-grep
Flujo de trabajo
- Escribe un fragmento de prueba que represente el código objetivo.
- Escribe la regla (comienza con
pattern, escala akind+has/insidesi es necesario). - Prueba con
--stdinantes de buscar en el código base. - Busca en el código base una vez que la regla coincida.
Errores críticos
Usa siempre stopBy: end en reglas relacionales
Sin él, has/inside se detienen en el primer nodo que no coincide, en lugar de recorrer todo el subárbol:
# MAL — no encontrará coincidencias anidadas profundas
has:
pattern: await $EXPR
# BIEN
has:
pattern: await $EXPR
stopBy: end
Escapa las metavariables en el shell
$VAR es interpretado por el shell. Escapa con barra invertida o usa comillas simples:
# Con comillas dobles: escapa con barra invertida
ast-grep scan --inline-rules "id: test
language: javascript
rule:
pattern: await \$EXPR" .
# Con comillas simples: no necesita escape
ast-grep scan --inline-rules 'id: test
language: javascript
rule:
pattern: await $EXPR' .
Las metavariables deben ser el contenido único de un nodo AST
Estos no funcionan: obj.on$EVENT, "Hello $WORLD", a $OP b, $jq
Usa $$OP para nodos sin nombre (operadores, puntuación). Usa $$$ARGS para cero o más nodos.
Pruebas con --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
Depuración con --debug-query
Cuando las reglas no coinciden, inspecciona el AST para encontrar los valores correctos de kind:
ast-grep run --pattern 'your code here' --lang javascript --debug-query=cst
Formatos: cst (todos los nodos), ast (solo los nombrados), pattern (cómo ve ast-grep tu patrón).
Sintaxis de reglas
Consulta references/rule_reference.md para la referencia completa de reglas (reglas atómicas, relacionales, compuestas y metavariables).