Skip to content

Ever wished your classes could greet? An example K2 Compiler Plugin that makes your dream come true.

Notifications You must be signed in to change notification settings

kitakkun/greeting-plugin

Repository files navigation

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

About

Ever wished your classes could greet? An example K2 Compiler Plugin that makes your dream come true.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages