KotlinPoetによるKotlinソースファイルの生成
KSPプロセッサー内でKotlinPoetを使い、型安全なKotlinコードを生成します。
「KotlinPoetによるKotlinソースファイルの生成」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
KotlinPoetとは
KotlinPoetは、.ktソースファイルをプログラムから生成するためのSquareのKotlin APIです。整形された慣用的なKotlinコードを生成し、KSPのCodeGeneratorと自然に連携します。
依存関係の追加
プロセッサモジュールにKotlinPoetを追加します。
dependencies {
implementation("com.squareup:kotlinpoet:1.17.0")
implementation("com.squareup:kotlinpoet-ksp:1.17.0") // KSP extensions
}FileSpec:生成ファイルのルート
FileSpec.builder(packageName, fileName)がエントリポイントです。そこに型、関数、プロパティを追加し、KSPのCodeGeneratorを通じて結果を書き出します。
val file = FileSpec.builder("com.example.generated", "MyFactory")
.addType( /* TypeSpec here */ )
.build()TypeSpec:クラスの定義
クラスにはTypeSpec.classBuilder()、オブジェクトにはobjectBuilder()、インターフェースにはinterfaceBuilder()を使用します。ビルダーの呼び出しをチェーンして、関数、プロパティ、スーパーインターフェースを追加します。
val classSpec = TypeSpec.classBuilder("MyFactory")
.addModifiers(KModifier.PUBLIC)
.addFunction( /* FunSpec */ )
.build()FunSpec:関数の生成
FunSpec.builder(name)で関数を作成します。addParameter()、returns()、addStatement()を使って、関数のシグネチャと本体を構築します。
val funSpec = FunSpec.builder("create")
.addParameter("name", String::class)
.returns(String::class)
.addStatement("return "Hello, %L!", name")
.build()PropertySpec:プロパティの生成
PropertySpec.builder(name, type)を使ってプロパティを生成します。KModifier.PRIVATEやKModifier.OVERRIDEを指定したり、mutable()を使ってvarにしたりできます。
val propSpec = PropertySpec.builder("tag", String::class)
.initializer("%S", "MyClass")
.addModifiers(KModifier.PRIVATE)
.build()コードフォーマット指定子
KotlinPoetでは、addStatement()とinitializer()でフォーマット指定子を使用します。
%L— リテラル(引用符なし)%S— 文字列リテラル(引用符付き)%T— 型名(インポートを自動的に処理)%N— 名前(specまたは文字列の名前)
%Tによる自動インポート
ClassNameとともに%Tを使うと、KotlinPoetが必要なimportを自動的に追加します。import文を手作業で記述する必要はありません。
val listType = ClassName("kotlin.collections", "List")
val funSpec = FunSpec.builder("items")
.returns(listType.parameterizedBy(String::class.asTypeName()))
.addStatement("return emptyList()")
.build()KSP CodeGeneratorへの書き出し
kotlinpoet-kspブリッジを使うと、生成したFileSpecをKSPのCodeGenerator経由で書き出し、インクリメンタルビルドのメタデータを保持できます。
file.writeTo(
codeGenerator = codeGenerator,
aggregating = false
)拡張関数の生成
FunSpec.builder(name).receiver(type)を使って拡張関数を生成します。
val extFun = FunSpec.builder("toJson")
.receiver(ClassName("com.example", "User"))
.returns(String::class)
.addStatement("return Gson().toJson(this)")
.build()実践例:ファクトリージェネレーター
KSPプロセッサでデータクラスに@AutoFactoryを付与し、KotlinPoetを使ってそれぞれのデータクラス用のコンパニオンファクトリーオブジェクトを生成します。生成ファイルは元のクラスと同じパッケージに配置されます。
生成コードのテスト
ユニットテストではKotlinPoetのFileSpec.toString()を使うと、ディスクに書き出さずに生成されたソーステキストを検証できます。kotlin-compile-testing-kspライブラリを使えば、テスト内で生成コードをコンパイルして実行できます。
確認問題
KotlinPoetで、参照したクラスに必要なimportを自動的に追加するフォーマット指定子はどれですか。
振り返り:KotlinPoetによるKotlinソースファイルの生成
要点:
FileSpec→ トップレベルファイル、TypeSpec→ クラス/オブジェクト/インターフェース、FunSpec→ 関数、PropertySpec→ プロパティ- 型参照には
%Tを使用します。インポートは自動的に追加されます - KSPプロセッサでは
file.writeTo(codeGenerator)を使用して書き出します - 生成された出力の単体テストには
FileSpec.toString()を使用します
よくある質問
「KotlinPoetによるKotlinソースファイルの生成」レッスンは無料ですか?
はい。「KotlinPoetによるKotlinソースファイルの生成」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「KotlinPoetによるKotlinソースファイルの生成」で何を学びますか?
KSPプロセッサー内でKotlinPoetを使い、型安全なKotlinコードを生成します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「KotlinPoetによるKotlinソースファイルの生成」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- KSPとKAPT:KSPが高速な理由
- 最初のSymbolProcessorを作成する
- KotlinPoetによるKotlinソースファイルの生成
- GradleビルドへのKSPプロセッサーの統合