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("!」")
}
}