前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AST-GREP:基于语法和语义的代码搜索与替换,你需要了解一下!

AST-GREP:基于语法和语义的代码搜索与替换,你需要了解一下!

作者头像
埃兰德欧神
发布2024-07-15 12:21:09
860
发布2024-07-15 12:21:09
举报
文章被收录于专栏:开源地带

你是否曾花费数小时试图通过纯文本或正则表达式查找并替换代码模式?如果是,你一定深知这过程的繁琐与易错。现在有一种更高效的方法:结构化搜索与替换(Structural Search and Replace),这项技术允许你基于代码的语法和语义而非仅文本内容来查找和修改代码模式。

AST-GEP

AST-GREP正是一款快速且支持多语言的代码结构搜索、检查及重写工具。你可以形象地将它比作具备语法感知能力的grep/sed!通过模式语法或更高级的规则,它可基于抽象语法树(AST)在成千上万文件中精准定位并修改代码,实现交互式操作。

假设你需要将项目中类似os.homedir && os.homedir()的旧式安全访问方式改为 ES6 标准的可选链式操作os.homedir?.()。以往你可能需要费力定位和逐一替换,但现在只需一条 AST-GREP 命令:sg -p '

重构对比

亮点功能

  1. 极速搜索与替换:借助并行 Rust 技术,可实现数千源代码文件的极速处理⚡️⚡️⚡️
  2. 多语言支持:目前支持以下 9 种编程语言。
  1. 多场景适用:支持命令行、IDE 插件等多种使用方式,并提供交互式代码修改、语言服务器及测试工具等实用功能。
  2. 代码搜索
  • 模式语法:针对项目中的简约但不简单的搜索需求,AST-GREP 提供了直观的模式语法,如下所示:

模式语法搜索

值得一提的是,AST-GREP 在搜索时会自动过滤掉注释和不生效的代码。

  • 规则匹配:对于更复杂的场景,可以使用 YAML 配置编写规则进行匹配。 例如,项目中如果在内联 Promise.all 数组中使用 await,通常是错误的做法,违背了并行执行承诺的初衷。我们可以创建以下规则来查找这种反模式:
代码语言:javascript
复制
id: no-await-in-promise-all
language: javascript
rule:
  pattern: Promise.all($A)
  has:
    pattern: await $_
    stopBy: end
代码语言:javascript
复制
ast-grep scan --rule no-await-in-promise-all.yml # 执行规则匹配

更多规则设置参见Rule Object Reference[1]

  1. 代码重写:除了强大的搜索功能,AST-GREP 还提供了代码重写能力。继续上一个示例,假设我们要将不规范的 Promise 写法修正,可将规则改为:
代码语言:javascript
复制
id: no-await-in-promise-all
language: javascript
rule:
  pattern: await $A
  inside:
    pattern: Promise.all($_)
    stopBy: end
fix: $A

源文件

代码语言:javascript
复制
const [foo, bar] = await Promise.all([
  await getFoo(),
  getBar(),
  (async () => { await getBaz()})(),
])
代码语言:javascript
复制
sg scan -r no-await-in-promise-all.yml #执行重构

重构后

代码语言:javascript
复制
const [foo, bar] = await Promise.all([
-- await getFoo(), 
++ getFoo(), 
  getBar(),
  (async () => { await getBaz()})(),
])

AST-GREP for VS Code

虽然VS Code内置代码搜索支持正则表达式,但正则在处理代码搜索替换时,无法跨行匹配、处理嵌套结构效果不佳,且难以有效忽略注释。而基于AST-GREP技术的VS Code插件 ast-grep VSCode 很好地解决了这些痛点,极大增强了代码搜索替换的能力。

安装步骤
  1. 安装AST-GREP命令行,可根据自己系统情况任选一种
代码语言:javascript
复制
# install via npm
npm i @ast-grep/cli -g

# install via cargo, cargo是Rust的包管理器
cargo install ast-grep

# install via homebrew
brew install ast-grep
  1. 在 VS Code 中安装 ast-grep VSCode[2]
  2. 初始化项目(可选,如果要使用更高级的规则功能)
代码语言:javascript
复制
ast-grep new # 初始化ast-grep项目,创建rules/tests等

写到最后

如果你是一个团队的技术负责人,AST-GREP可以帮助你制定和执行符合你业务需求的编码最佳实践。AST-GREP的愿景是让抽象语法树的魔法普及到每个人,并让人们从繁琐的AST编程中解放出来!AST-GREP作为一款基于AST的代码处理利器,不仅拥有先进的搜索替换能力,还提供了诸如代码检查、重构、测试等一体化解决方案。通过降低 AST 编程的门槛,它让更多开发者能够享受现代编程语言基础架构带来的效率提升和创新可能。

参考资料

[1]

Rule Object Reference: https://ast-grep.github.io/reference/rule.html

[2]

ast-grep VSCode 插件: https://marketplace.visualstudio.com/items?itemName=ast-grep.ast-grep-vscode

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源地带 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 亮点功能
  • AST-GREP for VS Code
    • 安装步骤
    • 写到最后
    相关产品与服务
    腾讯云代码分析
    腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档