「目の前にないものや、すごく簡単な変更(名前の変更とか)じゃないと編集するのが難しいんだよね。少なくとも、正規表現で探してテキストオブジェクトで削除するみたいな、基本的なことは理解できるけど。これがast-grepみたいなツールのいいところなんだ。パターン言語がほぼコードそのものみたいに読めるから、目の前で変換が見える(少なくとも小規模なケースでは)し、それについて考えることができる。」
TypeScriptの例:
ガード句をオプショナルチェイニングに変換
ast-grep -pattern '$A && $A.$B' --rewrite '$A?.$B' -lang ts
自己代入をヌリッシュコアレッシング代入に変換
ast-grep -pattern '$X = $X ?? $Y' --rewrite '$X ??= $Y' -l ts
アロー関数を関数宣言に変換(asyncや戻り値の型注釈用に別のパターンが必要だけど)
ast-grep -pattern 'const $NAME = ($$$PARAMS) => { $$$BODY }' --rewrite 'function $NAME($$$PARAMS) { $$$BODY }' -l ts
indexOfチェックを.includes()に変換
ast-grep -pattern '$A.indexOf($B) !== -1' --rewrite '$A.includes($B)' -l ts
$Xや$Aは任意のASTノードにマッチするメタ変数で、同じメタ変数が2回出てくると(例えば$X = $X ?? $Y)、その2つの出現が同じコードにバインドされる必要があるから、x = x ?? yはマッチするけど、x = y ?? zはマッチしない。yamlルールを使えばもっと高度なこともできるけど、視覚的には直感的じゃない。残念ながら、コーディングエージェントはast-grepパターンを書くのがまだかなり下手だと思う。おそらくトレーニングデータが少ないからだろうね。これが改善されるといいな。このツール自体はしっかりしてるよ!