如何自动将ast-grep重写规则应用于文件?

问题描述 投票:0回答:1

我正在使用 ast-grep,一个用于代码结构搜索和重写的 CLI 工具,来查找和替换代码中的某些模式。我编写了一个带有一些重写规则的 YAML 文件,我可以使用

sg scan
在终端中查看匹配和替换。但是,我不确定如何自动将更改应用到原始文件,而不需要手动编辑它。

这是我的 YAML 文件的示例

rule.yaml
:

id: replace-var-with-let
language: js
rule:
  pattern: var $A = $B
fix: let $A = $B

这是我的测试文件的示例

test.js

var x = 10;
var y = 20;
var z = x + y;
console.log(z);

这是

sg scan
的输出:

sg scan -r rule.yaml test.js
test.js
help[replace-var-with-let]:
@@ -0,4 +0,4 @@
1  │-var x = 10;
  1│+let x = 10
2 2│ var y = 20;
3 3│ var z = x + y;
4 4│ console.log(z);
help[replace-var-with-let]:
@@ -0,4 +0,4 @@
1 1│ var x = 10;
2  │-var y = 20;
  2│+let y = 20
3 3│ var z = x + y;
4 4│ console.log(z);
help[replace-var-with-let]:
@@ -0,4 +0,4 @@
1 1│ var x = 10;
2 2│ var y = 20;
3  │-var z = x + y;
  3│+let z = x + y
4 4│ console.log(z);

如何让ast-grep直接修改代码文件,使其变成:

let x = 10;
let y = 20;
let z = x + y;
console.log(z);

我使用ast-grep版本0.19.0,JavaScript作为编程语言,Mac OSX作为操作系统。

shell search replace command-line abstract-syntax-tree
1个回答
2
投票

ast-grep 不会直接修改文件,但会将修改后的代码打印到终端。您可以使用

--update-all
-U
标志将更改写入文件。请参阅重写指南。这类似于
eslint --fix
选项或
prettier -w

以下是将更改应用到文件的命令:

$ sg scan -r rule.yaml test.js -U
# or 
$ sg scan -r rule.yaml test.js --update-all

有关更多信息,您可以查看命令行参考

https://ast-grep.github.io/reference/cli/scan.html#u-update-all

© www.soinside.com 2019 - 2024. All rights reserved.