ast-grep
https://gyazo.com/604f6fee55bf9cfa0bcf2076bea35d0d
ASTを解析した上で、grepやlintや置換ができる
基本
scan周り
いくつかの前提がある
それらのruleは、yamlに書かれる
ただし、1つのymlに書けるruleは1つだけである
ast-grepは、ruleに対するテストを書ける
ast-grepは、使い回せる汎用的なruleを定義できる
ast-grepを使うと、上記のように、異なるの役割を持つyamlがたくさん登場する
これらを一箇所で管理するために、特定のdirectoryを設けて
コマンド実行時にそれを参照できるようにしたい
といったことをやるのが
linter用?それ以外にも使える?
元々どういうユースケースを想定しているのか知りたい
複数ルールを列挙してその検索を再利用可能にするようなもの?
shellscriptを書いてast-grepを直接呼ぶのとはなにか違うの?
これは単純に4種類のdirectoryの場所を特定するだけのもの
code:_
my-awesome-project
|- rules # where rules go
|- rule-tests # test cases for rules
|- utils # global utility rules for reusing
|- sgconfig.yml # root configuration file
rule testsってなに?
utility rulesてなに?
不要であれば無視すれば良い
rewriteもできる
コマンドで1行で書いたり、yamlで書いたりできるらしい
$ sg -p '$A && $A()' -r '$A?.()'
https://gyazo.com/e30d18b7538a9aaa82be96cf5431265c https://ast-grep.github.io/
yamlでの例
ミスってawaitを付けているPromise.allを探す
code:yml
id: no-await-in-promise-all
language: typescript
rule:
pattern: await $A
inside:
pattern: Promise.all($)
stopBy:
fix: $A
2023/12/26現在は以下に対応してるっぽい
C
Python
Ruby
Rust
TypeScript
TSX
便利そう
なんでlintいれたんだ