ast-grep 代码搜索重写
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/ast-grep-structural-code-search-rewrite
技能介绍
要解决的问题
当你需要在大型代码库中做批量代码修改时,基于正则表达式的搜索与替换往往是最直接的选择,但它有一个致命缺陷:正则只关心文本字符,不理解代码的语法结构。一段代码从 foo(bar) 变成 foo(bar, ) 或者换行位置调整后,正则就可能失效,导致误匹配或漏匹配。
更麻烦的是,正则无法区分同名但语义不同的标识符。比如你想匹配所有 result 变量的赋值语句,但代码里可能同时存在局部变量 result、类成员 this.result 和函数返回值 result,正则难以区分它们在语法树中的真实位置。
核心能力与工作方式
ast-grep(命令 sg)用 AST 模式匹配来解决这个问题。它先把源代码解析成抽象语法树,然后在语法树层级进行模式匹配,而非在文本层面做字符串比较。
核心工作流包括三个步骤:
- 模式匹配:编写一个 AST 模式来描述你想找的代码结构。模式本身就是一段代码,
ast-grep会把它解析成 AST 后与目标代码的 AST 做结构比较。 - 通配符锚定:用
$符号加大写字母作为通配符,例如$MATCH,可以匹配任意单个 AST 节点。这个设计可以类比为正则中的.,但它匹配的是语法节点而非字符。 - 搜索、检查与重写:匹配完成后,可以对结果做检查(比如确认是否符合预期),也可以直接生成重写后的代码,实现自动化批量修改。
适用边界与注意点
- 模式必须符合目标语言的语法:
ast-grep的模式本质上是一段合法代码,如果你的模式本身语法不合法,解析阶段就会失败。 - 语言覆盖度取决于上游支持:
ast-grep支持的语言取决于其解析器后端。使用前需要确认目标语言是否在支持列表中。 - 通配符粒度是单个节点:
$MATCH只匹配一个 AST 节点,如果你需要匹配跨越多个节点的子树,需要显式写出结构而非依赖通配符。 - 复杂重写仍需人工审查:对于涉及多步变换或语义保持的复杂重写,建议先在小范围验证模式匹配结果,再逐步扩大应用范围,避免批量修改引入回归。
使用场景
- 在大型前端仓库中批量替换所有事件回调为 async/await 写法,正则容易漏掉参数结构不同的变体。
- 需要把一个大型 Go 代码库中的旧错误处理模式统一迁移到新接口,人工逐文件改容易出错。
- 审计 Rust 代码库,自动标记所有不符合团队规范的 mut 使用位置。
- 在 Python 项目中重命名某个高频调用的函数,同时更新所有调用点的参数结构。
适合人员
- 前端工程师:维护大型 TypeScript/React 代码库,需要批量重构组件回调并保持类型安全。
- 后端工程师:负责多语言微服务架构迁移,需要可靠地替换跨仓库的重复代码模式。
- 平台工程师:搭建代码规范自动化检查流水线,希望用 AST 匹配替代脆弱的正则规则。
- 代码审计师:审查开源依赖库的安全模式,需要精准定位所有危险 API 调用的语法变体。