Skip to content

Latest commit

 

History

History
86 lines (66 loc) · 2.98 KB

README.md

File metadata and controls

86 lines (66 loc) · 2.98 KB

Greeting Compiler Plugin (K2)

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 コンパイラプラグインの検証

使い方

  1. 改変対象のクラスに@Greetableアノテーションを付与します。
@Greetable
class A
  1. 改変したクラスのインスタンスを生成し、関数を呼び出します。
val a = A()
a.greet("世界") // A「こんにちは、世界!」

コンパイル時に起こっていること

@Greetable
class A

@Greetableを持つクラスをコンパイルすると、以下に示すgreet関数の実装が自動的に追加されます。

@Greetable
class A {
    fun greet(name: String) {
        print("A「こんにちは、")
        print(name)
        println("!」")
    }
}

Tip

より厳密に説明すると、次の順序でクラスの改変が行われます。

  1. FirDeclarationGenerationExtensionによるgreet関数宣言の生成
@Greetable
class A {
    fun greet(name: String)
}
  1. IrGenerationExtensionによるgreet関数の実装部分の生成
@Greetable
class A {
    fun greet(name: String) {
        print("A「こんにちは、")
        print(name)
        println("!」")
    }
}