Kotlin Fest 2024 で発表した「もっとKotlinを好きになる!K2時代のKotlin Compiler Plugin開発 by kitakkun 」のサンプルプロジェクトです。
K2コンパイラで導入されたFIR拡張と、従来のIR拡張を組み合わせてソースプログラムの改変を行う方法を示しています。
Note
ブランチによってプラグイン実装のカバー範囲が異なります。
main: 最小構成。CompilerPluginRegistrarとExtensionのみを実装。kotlinc_option: コンパイラ引数対応。追加でCommandLineProcessorを実装。gradle_dsl: Gradle DSL対応。追加でKotlinCompilerPluginSupportPluginを実装。検証の際は事前に./gradlew publishToMavenLocalを実行してください。
より発展的な活用事例が気になる方は back-in-time-plugin も合わせてご覧ください。
プロジェクトは3つのモジュールで構成されています。
| モジュール | 概要 |
|---|---|
| greeting-annotations | @Greetableアノテーションの実装 |
| greeting-compiler | コンパイラプラグインの実装 |
| test | コンパイラプラグインの検証 |
- 改変対象のクラスに
@Greetableアノテーションを付与します。
@Greetable
class A- 改変したクラスのインスタンスを生成し、関数を呼び出します。
val a = A()
a.greet("世界") // A「こんにちは、世界!」@Greetable
class A@Greetableを持つクラスをコンパイルすると、以下に示すgreet関数の実装が自動的に追加されます。
@Greetable
class A {
fun greet(name: String) {
print("A「こんにちは、")
print(name)
println("!」")
}
}Tip
より厳密に説明すると、次の順序でクラスの改変が行われます。
FirDeclarationGenerationExtensionによるgreet関数宣言の生成
@Greetable
class A {
fun greet(name: String)
}IrGenerationExtensionによるgreet関数の実装部分の生成
@Greetable
class A {
fun greet(name: String) {
print("A「こんにちは、")
print(name)
println("!」")
}
}