KotlinのソースコードをASTレベルで書き換えるツールを作っている話

1.5K Views

July 19, 22

スライド概要

Server-Side Kotlin Meetup vol.4における発表資料です。

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

Kotlinのソースコードを ASTレベルで書き換えるツールを 作っている話 Bill One Engineering Unit Sansan株式会社 加藤 耕太 部署 名前

2.

加藤 耕太(Kota Kato) Sansan株式会社 技術本部 Bill One Engineering Unit@関西支店 写真が入ります Sansan株式会社所属のソフトウェアエンジニア。 クラウド請求書受領サー ビス「Bill One」のアーキテクトとして、サーバーサイド Kotlinを含む技術選 定から立ち上げに関わり、現在に至るまで開発および技術マネジメントに 従事。 最近は Kotlin / TypeScript / React / Google Cloud をよく触ってい る。 著書:Pythonクローリング&スクレイピング データ収集・解析のための実践開発ガイド

3.

営業DXサービス キャリアプロフィール 名刺作成サービス クラウド請求書受領サービス クラウド契約業務サービス

4.

今日お話ししたいこと - KotlinのソースコードをASTレベルで書き換えるツールを作っている話 > 背景 > 作っているツール: ktcodeshift > まとめ ※AST: Abstract Syntax Tree, 抽象構文木 木構造として表現

5.

背景

6.

モチベーション Kotlinで長く開発する上で、Kotlinのソースコードを一括で書き換える手段を 持っておきたい 括弧の対応など、正規表現による単純な一括置換では難しい場合もある 例えば - JUnit 4 → 5への移行 - Ktor 1.x → 2.xへの移行(Location→Resourceへの移行) - アプリケーションで共通利用している関数のシグネチャ変更

7.

既存の方法1 IntelliJ IDEAのStructural search and replace機能 Structural search and replace | IntelliJ IDEA https://www.jetbrains.com/help/idea/structural-search-and-replace.html

8.

Structural search and replaceの制約 - UIからしか実行できず、試行錯誤しづらい - 大きく変えようとすると予期しない結果になった 期待 実際

9.

既存の方法2 kastreeというKotlinのASTを操作するライブラリのMutableVisitor 引用元: cretz/kastree: Simple Kotlin Source AST and Syntax Parsing, Editing, and Writing https://github.com/cretz/kastree

10.

kastreeの制約 - 2019年で開発が止まっている > 最新のKotlinでは動作しない > 類似プロジェクトとして紹介されている kotlinx/ast には AST→ソースコードの変換機能がない - 変換時に一部のコメントが欠落してしまうことがある

11.

他の言語での選択肢 - JavaParser - Home https://javaparser.org/ - facebook/jscodeshift: A JavaScript codemod toolkit. https://github.com/facebook/jscodeshift jscodeshiftを参考に作ってみよう (所属企業ではなく個人としての取り組み)

12.

jscodeshiftの使い方 コマンド 変換スクリプト (transform.js) 引用元: https://github.com/facebook/jscodeshift

13.

作っているツール: ktcodeshift

14.

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

15.

ktcodeshiftの使い方 コマンド 変換スクリプト (*.transform.kts)

16.

変換例: JUnit 4→5への移行 JUnit4 JUnit5

17.

変換スクリプト例: JUnit 4→5への移行(抜粋) https://github.com/orangain/ktcodeshift/blob/main/ktcodeshift-cli/src/test/resources/examples/JUnit4To5.transform.kts

18.

変換スクリプト例: JUnit 4→5への移行(抜粋) https://github.com/orangain/ktcodeshift/blob/main/ktcodeshift-cli/src/test/resources/examples/JUnit4To5.transform.kts

19.

今後の課題 - 変換用APIのブラッシュアップ - IntelliJ IDEAでの補完 - 型情報の参照 - K2コンパイラへの対応?

20.

まとめ

21.

まとめ - ktcodeshiftというKotlinのソースコードをASTレベルで書き換えるツールを 作っている > 変換関数をKotlin Scriptで記述 > 複数ファイルに一括適用するためのコマンドを提供 > ktastをラップした変換用のAPIを提供 - 開発中ですが、もし良ければ使ってみてフィードバックいただけると嬉しいです - 他にもっと良い方法をご存知の方はぜひ教えてください

23.

おまけ: プログラムからKotlin Scriptを実行する方法 Get started with Kotlin custom scripting – tutorial | Kotlin https://kotlinlang.org/docs/custom-script-deps-tutorial.html

\初めてのセミナーを開催します/

採用セミナー開催