你是否曾花费数小时企图通过纯文本或正则表达式查找并替换代码形式?假如是,你必定深知这进程的繁琐与易错。现在有一种更高效的办法:结构化查找与替换(Structural Search and Replace),这项技能答应你根据代码的语法和语义而非仅文本内容来查找和批改代码形式。
AST-GREP
正是一款快速且支撑多言语的代码结构查找、查看及重写东西。你可以形象地将它比作具有语法感知才能的grep/sed
!通过形式语法或更高档的规矩,它可根据笼统语法树(AST)在成千上万文件中精准定位并批改代码,完结交互式操作。
假定你需求将项目中相似os.homedir && os.homedir()
的老式安全访问方法改为 ES6 标准的可选链式操作os.homedir?.()
。以往你或许需求吃力定位和逐一替换,但现在只需一条 AST-GREP
命令:sg -p '$A && $A()' -r '$A?.()'
,就可以完结整个项目的重构,如下图所示:
亮点功用
-
极速查找与替换:借助并行 Rust 技能,可完结数千源代码文件的极速处理⚡️⚡️⚡️
-
多言语支撑:目前支撑以下 9 种编程言语。
-
多场景适用:支撑命令行、IDE 插件等多种使用方法,并供给交互式代码批改、言语服务器及测试东西等实用功用。
-
代码查找
-
形式语法:针对项目中的简约但不简略的查找需求,
AST-GREP
供给了直观的形式语法,如下所示:
值得一提的是,
AST-GREP
在查找时会自动过滤掉注释和不生效的代码。
-
规矩匹配:关于更杂乱的场景,可以使用 YAML 配置编写规矩进行匹配。
例如,项目中假如在内联
Promise.all
数组中使用await
,通常是过错的做法,违反了并行执行承诺的初衷。咱们可以创立以下规矩来查找这种反形式:
id: no-await-in-promise-all
language: javascript
rule:
pattern: Promise.all($A)
has:
pattern: await $_
stopBy: end
ast-grep scan --rule no-await-in-promise-all.yml # 执行规矩匹配
更多规矩设置参见Rule Object Reference
-
代码重写:除了强壮的查找功用,
AST-GREP
还供给了代码重写才能。继续上一个示例,假定咱们要将不规范的Promise
写法批改,可将规矩改为:
id: no-await-in-promise-all
language: javascript
rule:
pattern: await $A
inside:
pattern: Promise.all($_)
stopBy: end
fix: $A
源文件
const [foo, bar] = await Promise.all([
await getFoo(),
getBar(),
(async () => { await getBaz()})(),
])
sg scan -r no-await-in-promise-all.yml #执行重构
重构后
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
很好地解决了这些痛点,极大增强了代码查找替换的才能。
装置步骤
- 装置
AST-GREP
命令行,可根据自己体系情况任选一种
# 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
-
在 VS Code 中装置ast-grep VSCode
-
初始化项目(可选,假如要使用更高档的规矩功用)
ast-grep new # 初始化ast-grep项目,创立rules/tests等
写到最终
假如你是一个团队的技能负责人,AST-GREP
可以帮助你制定和执行符合你事务需求的编码最佳实践。AST-GREP
的愿景是让笼统语法树的魔法普及到每个人,并让人们从繁琐的AST编程中解放出来!AST-GREP
作为一款根据AST的代码处理利器,不仅拥有先进的查找替换才能,还供给了比如代码查看、重构、测试等一体化解决方案。通过降低 AST 编程的门槛,它让更多开发者可以享受现代编程言语基础架构带来的功率提升和创新或许。