0Pricing
Kotlin Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. KSPとKAPT:KSPが高速な理由
  2. 最初のSymbolProcessorを作成する
  3. KotlinPoetによるKotlinソースファイルの生成
  4. GradleビルドへのKSPプロセッサーの統合
← Kotlin Academyに戻る