コンテンツにスキップ
Zenn Dev Ryo Kawamata Articles 2038aa5eb42a5b

RecastでASTを探索してコードを動的に変換する

  • URL: https://zenn.dev/ryo_kawamata/articles/2038aa5eb42a5b
  • 日付: 2026-06-26
  • Tier: Tier 3
  • 要旨: JavaScriptのAST(抽象構文木)を操作するライブラリRecastの機能と使用例を解説した記事。Recastはparse・visit・printの3ステップでコードの探索・変換・再出力ができ、namedTypes(型チェック)・builders(Nodeの生成)・prettyPrint(整形出力)などの補助APIも提供する。デフォルトはEsprimaパーサーだが、TypeScriptやJSXパーサーへの切り替えも可能。大規模コードベースでのリファクタリング自動化ツール(let→const置換、console.log削除、型アノテーション追加など)を作成する際に実用的に機能する。

詳細

Recastの基本フロー

  • parse(): コード文字列をASTに変換
  • visit(): ASTを探索し、特定Nodeを見つけて改変する(visitIdentifier、visitVariableDeclaration等のメソッドを登録)
  • print(): ASTをコード文字列に再変換(変更されていない部分は元の書式を保持)

補助API

  • types.namedTypes: Node型のチェックに使用(例: n.CallExpression.check(node))
  • types.builders: 新しいNodeを生成(例: b.callExpression(b.identifier(“add”), […]))
  • prettyPrint(): コードを整形して出力(print()は元の書式を維持するが、prettyPrint()は整形する)

パーサーの切り替え

  • デフォルト: Esprima JavaScript parser
  • TypeScript対応: import TSParser from "recast/parsers/typescript" を第2引数に指定

実装サンプル(テストコード付き)

  • let→const置換: visitVariableDeclarationでnode.kindを変更
  • console.log削除: visitExpressionStatementでpath.prune()呼び出し
  • use strict追加: visitProgramでbody.unshift()を使用
  • 型アノテーション追加: TypeScriptパーサーでvisitFunctionDeclaration、b.tsTypeAnnotation(b.tsStringKeyword())でアノテーション生成