Skip to content

コンパイラプラグイン

コンパイラプラグインは、コンパイラ自体を修正することなく、コンパイル中のコードを分析または変更するためにコンパイルプロセスにフックします。例えば、コードにアノテーションを付加したり、他のフレームワークやAPIとの互換性を持たせるために新しいコードを生成したりできます。

このページでは、利用可能なKotlinコンパイラプラグインと、ユースケースに適したプラグインがない場合の対処法について説明します。

Kotlinチームは、以下のコンパイラプラグインをメンテナンスしています。

プラグイン説明
All-openアノテーションが付加されたクラスとそのメンバを自動的に open にし、フレームワークが実行時にそれらを拡張できるようにします。
AtomicFUアトミック操作を、ロックフリーな並行処理のための効率的なプラットフォーム固有の実装に変換します。
DataFrameDataFrame を安全かつKotlinフレンドリーな方法で扱うための、型付けされたAPIを生成します。
jvm-abi-genアプリケーションバイナリインターフェース (ABI) のJARファイルを生成します。
js-plain-objectsKotlinクラスをプレーンなJavaScriptオブジェクトとして公開し、JSのツールやライブラリとの相互運用性を向上させます。
kaptKotlinコード上でJavaのアノテーションプロセッサを実行し、追加のソースファイルを生成します。
LombokKotlinコードが、Javaソース内のLombokアノテーションによって生成されたコードを理解し、利用できるようにします。
no-argアノテーションが付加されたクラスに対して引数なしのコンストラクタを生成し、それを必要とするフレームワークをサポートします。
Power-assert式の各部分の値を詳細に表示することで、アサーション失敗時の情報を強化します。
SAM with receiverSAMインターフェースがレシーバ付きラムダを使用できるようにし、よりDSLらしい構文を可能にします。
Serializationリフレクションを使用せずにKotlinオブジェクトをシリアライズおよびデシリアライズするコードを生成します。

GoogleのAndroidチームは以下をメンテナンスしています。

プラグイン説明
Compose compiler Gradle pluginComposeコンパイラをGradleと統合し、宣言型UI機能とCompose固有の最適化を有効にします。
Parcelize pluginParcelable 実装を自動的に生成し、Androidコンポーネント間でKotlinオブジェクトを受け渡しできるようにします。

これらのプラグインではカバーできない方法でコンパイルプロセスを調整する必要がある場合は、まず Kotlin Symbol Processing (KSP) APIAndroid lint などの外部リンターを使用できるかどうかを確認してください。 Kotlin Slack を閲覧したり、問い合わせを行って、ユースケースに関するアドバイスを求めることもできます。

それでも必要なものが見つからない場合は、カスタムコンパイラプラグインを作成することができます。KotlinコンパイラプラグインAPIは不安定 (unstable)であるため、この手法は最終手段としてのみ使用してください。カスタムコンパイラプラグインを作成する場合、コンパイラの新しいリリースごとに破壊的変更が導入されるため、メンテナンスに継続的かつ多大な労力を投じる必要があります。