ast-grep
워크플로우
- 대상 코드를 나타내는 테스트 스니펫을 작성합니다.
- 규칙을 작성합니다(
pattern으로 시작하고, 필요시kind+has/inside로 확장). - 코드베이스 검색 전에
--stdin으로 테스트합니다. - 규칙이 일치하면 코드베이스를 검색합니다.
중요한 주의사항
관계 규칙에는 항상 stopBy: end 사용
has/inside는 stopBy: end 없이 전체 하위 트리를 탐색하지 않고 첫 번째 비일치 노드에서 멈춥니다:
# 잘못된 예 - 깊이 중첩된 일치 항목을 놓칩니다.
has:
pattern: await $EXPR
# 올바른 예
has:
pattern: await $EXPR
stopBy: end
셸에서 메타변수 이스케이프
$VAR는 셸에서 해석됩니다. 이스케이프하거나 작은따옴표를 사용하세요:
# 큰따옴표: 백슬래시로 이스케이프
ast-grep scan --inline-rules "id: test
language: javascript
rule:
pattern: await \$EXPR" .
# 작은따옴표: 이스케이프 불필요
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를 참조하세요.