Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go の analysis パッケージで自作するリファクタリングツール

Go の analysis パッケージで自作するリファクタリングツール

株式会社ナレッジワーク 宮田聖也
2025/3/25 golang.tokyo #38での登壇資料です
https://golangtokyo.connpass.com/event/348079/

More Decks by KNOWLEDGE WORK / 株式会社ナレッジワーク

Other Decks in Technology

Transcript

  1. © Knowledge Work Inc. 2 • 宮⽥聖也 (38tter) • ソフトウェアエンジニア@ナレッジワーク

    • Golang, Ruby が好き • 趣味:🍺🍺🍺, ⚽ (󰧹, 󰎼), 🎸, 📷 ⾃⼰紹介
  2. © Knowledge Work Inc. リファクタリングは... 5 5 必要な⼯数も 1 min

    から 1 month まで様々 有効な⼿段も当然異なる 先延ばしにしがち
  3. © Knowledge Work Inc. go/analysis 9 9 • https://pkg.go.dev/golang.org/x/tools/go/analysis •

    モジュール化された静的解析を提供 • コードを実⾏せずに⾏う検査 • 共通のインターフェースで再利⽤性が⾼い • CLI, IDE, Testing Framework などから利⽤ • analysis.Analyzer
  4. © Knowledge Work Inc. go/ast 10 10 • https://pkg.go.dev/golang.org/x/tools/go/ast •

    AST (抽象構⽂⽊) • ソースコードを⽊構造で表現したもの • コード中の字句の意味(式、⽂、宣⾔)や、 ファイル上の位置、親⼦関係を取得可能
  5. © Knowledge Work Inc. go/analysis + go/ast によるリファクタの流れ 13 13

    字句解析&構⽂解析 AST(抽象構⽂⽊) 取得 AST のノードを巡回 指摘箇所を検出(&修正)
  6. © Knowledge Work Inc. 14 analyzer の実装例: コマンドインターフェース 字句解析&構⽂解析 AST(抽象構⽂⽊)

    取得 AST のノードを巡回 指摘箇所を検出(&修正) 実装者が AST 取得を意識する必要がない
  7. © Knowledge Work Inc. 15 analyzer の実装例: run の内部処理 字句解析&構⽂解析

    AST(抽象構⽂⽊) 取得 AST のノードを巡回 指摘箇所を検出(&修正)
  8. © Knowledge Work Inc. 16 analyzer の実装例: run の内部処理 字句解析&構⽂解析

    AST(抽象構⽂⽊) 取得 AST のノードを巡回 指摘箇所を検出(&修正)
  9. © Knowledge Work Inc. 21 analyzer の実装: run の内部処理 字句解析&構⽂解析

    AST(抽象構⽂⽊) 取得 AST のノードを巡回 指摘箇所を検出(&修正) ドメインイベントの型をレシーバに取るメソッド 編集箇所はノードの brace の内側 置き換え後のテキスト 任意の内容が書ける
  10. © Knowledge Work Inc. eg - example-based refactoring 23 23

    Go 公式のコードリプレイスツール • https://pkg.go.dev/golang.org/x/tools/cmd/eg 式(expression) のリプレイスに限定 • ⽂(statement), 宣⾔(declaration) は指定できない 差分を記述した template を与えて実⾏ • before: 式A, after: 式B と書ける • eg だけに easy (?) リプレイスにともなう import の追加も⾏われる • ただし不要になった import は削除されない • eg 実⾏後に goimports の実⾏が推奨
  11. © Knowledge Work Inc. eg: 型安全なコードリプレイス 24 24 置き換え後の式の戻り値の型が⼀致 •

    func before, func after のシグネチャ (types.Signature) の⼀致が要求される before の式が after の式にアサインできるか検証 • types.AssignableTo
  12. © Knowledge Work Inc. eg: 式(expression) のリプレイスに限定 25 25 指摘箇所の検出は

    ast.Expr の⼀致を検証 • ワイルドカードによる⽐較も可能 expression 以外の statements の指定は(あえて)スコープアウト • `eg --help` でも注意事項として記載
  13. © Knowledge Work Inc. まとめ 26 26 • go/analysis +

    go/ast による静的解析はリファクタツールにも応⽤できる AST ノードの情報により柔軟なコードリプレイスが可能 コードスタイルの変更に伴う修正などの複雑なコンテキストも落とし込める AST の学習コストが⼀定必要となる → fix typo から負債解消のための⼤規模なリファクタリング PJ まで • eg では型安全なリファクタが可能 expression に限定される テンプレートファイルベースで、チーム内共有も容易 学習コストは少ない → ⾮推奨なライブラリの置き換えや、コーディングスタイルの強制など