5.7K Views
July 19, 22
スライド概要
Server-Side Kotlin Meetup vol.4における発表資料です。
Kotlinのソースコードを ASTレベルで書き換えるツールを 作っている話 Bill One Engineering Unit Sansan株式会社 加藤 耕太 部署 名前
加藤 耕太(Kota Kato) Sansan株式会社 技術本部 Bill One Engineering Unit@関西支店 写真が入ります Sansan株式会社所属のソフトウェアエンジニア。 クラウド請求書受領サー ビス「Bill One」のアーキテクトとして、サーバーサイド Kotlinを含む技術選 定から立ち上げに関わり、現在に至るまで開発および技術マネジメントに 従事。 最近は Kotlin / TypeScript / React / Google Cloud をよく触ってい る。 著書:Pythonクローリング&スクレイピング データ収集・解析のための実践開発ガイド
営業DXサービス キャリアプロフィール 名刺作成サービス クラウド請求書受領サービス クラウド契約業務サービス
今日お話ししたいこと - KotlinのソースコードをASTレベルで書き換えるツールを作っている話 > 背景 > 作っているツール: ktcodeshift > まとめ ※AST: Abstract Syntax Tree, 抽象構文木 木構造として表現
背景
モチベーション Kotlinで長く開発する上で、Kotlinのソースコードを一括で書き換える手段を 持っておきたい 括弧の対応など、正規表現による単純な一括置換では難しい場合もある 例えば - JUnit 4 → 5への移行 - Ktor 1.x → 2.xへの移行(Location→Resourceへの移行) - アプリケーションで共通利用している関数のシグネチャ変更
既存の方法1 IntelliJ IDEAのStructural search and replace機能 Structural search and replace | IntelliJ IDEA https://www.jetbrains.com/help/idea/structural-search-and-replace.html
Structural search and replaceの制約 - UIからしか実行できず、試行錯誤しづらい - 大きく変えようとすると予期しない結果になった 期待 実際
既存の方法2 kastreeというKotlinのASTを操作するライブラリのMutableVisitor 引用元: cretz/kastree: Simple Kotlin Source AST and Syntax Parsing, Editing, and Writing https://github.com/cretz/kastree
kastreeの制約 - 2019年で開発が止まっている > 最新のKotlinでは動作しない > 類似プロジェクトとして紹介されている kotlinx/ast には AST→ソースコードの変換機能がない - 変換時に一部のコメントが欠落してしまうことがある
他の言語での選択肢 - JavaParser - Home https://javaparser.org/ - facebook/jscodeshift: A JavaScript codemod toolkit. https://github.com/facebook/jscodeshift jscodeshiftを参考に作ってみよう (所属企業ではなく個人としての取り組み)
jscodeshiftの使い方 コマンド 変換スクリプト (transform.js) 引用元: https://github.com/facebook/jscodeshift
作っているツール: ktcodeshift
ktcodeshift - Kotlinのソースコードを一括で書き換えるツール > 変換関数をKotlin Scriptで記述 > 複数ファイルに一括適用するためのコマンドを提供 > ktastをラップした変換用のAPIを提供 - ktastはkastreeをフォークしたライブラリで、Kotlin 1.7対応と コメントや空白を維持した変換を実現 - kastreeと同様にKotlin Compiler APIを使用 orangain/ktcodeshift: Toolkit for running codemods over multiple Kotlin files inspired by jscodeshift. https://github.com/orangain/ktcodeshift
ktcodeshiftの使い方 コマンド 変換スクリプト (*.transform.kts)
変換例: JUnit 4→5への移行 JUnit4 JUnit5
変換スクリプト例: JUnit 4→5への移行(抜粋) https://github.com/orangain/ktcodeshift/blob/main/ktcodeshift-cli/src/test/resources/examples/JUnit4To5.transform.kts
変換スクリプト例: JUnit 4→5への移行(抜粋) https://github.com/orangain/ktcodeshift/blob/main/ktcodeshift-cli/src/test/resources/examples/JUnit4To5.transform.kts
今後の課題 - 変換用APIのブラッシュアップ - IntelliJ IDEAでの補完 - 型情報の参照 - K2コンパイラへの対応?
まとめ
まとめ - ktcodeshiftというKotlinのソースコードをASTレベルで書き換えるツールを 作っている > 変換関数をKotlin Scriptで記述 > 複数ファイルに一括適用するためのコマンドを提供 > ktastをラップした変換用のAPIを提供 - 開発中ですが、もし良ければ使ってみてフィードバックいただけると嬉しいです - 他にもっと良い方法をご存知の方はぜひ教えてください
おまけ: プログラムからKotlin Scriptを実行する方法 Get started with Kotlin custom scripting – tutorial | Kotlin https://kotlinlang.org/docs/custom-script-deps-tutorial.html