🐶

TypeScriptのASTで遊ぶ

に公開

2025/11/1に開催されたKotlin Fest 2025に参加してきました。

考え、行動するきっかけをいただけた素敵なカンファレンスでした。運営、スポンサー、スピーカーの皆さんありがとうございましたmm

どのセッションも楽しく、学びがありました。その中でデッドコード消せてますか?はとても共感できるものでした。

スピーカーのTaskさんは、いらなくなったコードは消したい一方で後回しになりかねないものでもあると指摘。わかりみ。具体的事例の一つとしてフィーチャーフラグの削除を自動化した事例を紹介されていました。詳しくは、スライドをご覧ください。

このセッションに触発されて勉強中のTypeScriptでPoCを実装してみました。TypeScriptではCompiler APIを利用してASTを手軽に操作することができました。感動。

要点を以下にまとめます。(コードの全量はこちら

  • ts.createSourceFileでソースコードからルートノードを得る。

  • 好みのビジターを自身で実装する。

  • ts.forEachChild(node, callback);でトラバースできる。

    • nodeはts.Node(恐らくすべてのノードに適用される型)。
    • callbackはビジター。
  • isFeatureReleased("CALC_FEE")を特定する。

    • ts.isCallExpression(node)で関数呼び出しを特定。
    • ts.isIdentifier(node.expression)で式の識別子(関数名など)を特定。
    • node.expression.text === 'isFeatureReleased'で所望の関数を特定。
    • node.argumentsで引数にアクセス。
  • const isReleased = isFeatureReleased("CALC_FEE")を特定する。

    • node.parentisFeatureReleased("CALC_FEE")の親ノードにアクセス。(これ便利!)
    • ts.isVariableDeclaration(node)で変数宣言を特定。
  • if (isReleased) {}を特定する。

    • ts.isIfStatement(node)でif文を特定。
    • IfStatementexpressionは条件式の部分。なので、node.expression.textで引数の変数名を特定。
  • calcFee(100)を残して、それ以外の関連コードを削除する。

    • 変数宣言: 変数宣言ノードのテキストを空にする。
    • if: ifのthenにあたるコードを取り出して、if全体と置き換える。

    ※ノードを置き換えるでもよいかもしれない。

Compiler APIなるものにより手軽にASTをいじくれて感動しました。まだ表面を触ったに過ぎないのでもっと遊び倒したいと思いました。

おしまい

Discussion