用途:ast-grep 用于结构化代码搜索,当代码形状和元素之间的关系比纯文本更重要时使用,例如查找没有错误处理的异步函数。
推荐工作流:先写一个代表目标代码的测试片段;再写规则,从 pattern 开始,必要时升级到 kind 配合 has/inside;用 --stdin 验证规则匹配后,再对整个代码库执行搜索。
规则与关系要点:关系型规则始终使用 stopBy: end,否则 has/inside 会在第一个不匹配的节点处停止,而非遍历整个子树,从而漏掉深层嵌套的匹配。例如 has 下应写 pattern: await $EXPR 并加 stopBy: end。
元变量限制:元变量必须是 AST 节点的唯一内容,obj.on$EVENT、"Hello $WORLD"、a $OP b、$jq 这类写法不可用。未命名节点(运算符、标点)用 $$OP,零个或多个节点用 $$$ARGS。在 shell 中执行需转义或单引号包裹,避免 $VAR 被 shell 解释。
测试与调试:可用 --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,格式有 cst(全部节点)、ast(仅命名节点)、pattern(ast-grep 看待模式的方式)。
完整规则语法(原子、关系、组合规则和元变量)参见 references/rule_reference.md。资料未提供收费、价格、支持语言清单和平台信息。