KotlinPoetでHello Worldする

はじめに

KotlinPoetとはKotlinのソースコードを生成するためのライブラリです。KotlinFest 2019でKotlinPoetに関する発表があり、早速使ってみています。

KotlinPoetによるソースコードの生成

名前と会社名のプロパティと挨拶用の関数を持つパーソンクラス、それを呼び出すメイン関数を生成してみます。

 

package jp.co.casareal.hello

import com.squareup.kotlinpoet.FileSpec
import com.squareup.kotlinpoet.FunSpec
import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.ParameterSpec
import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.TypeSpec

fun main() {
    // ビルダーの作成
    val typeSpecBuilder = TypeSpec.classBuilder("Person")
        .addModifiers(KModifier.DATA)

    // コンストラクタ
    typeSpecBuilder.primaryConstructor(
        FunSpec.constructorBuilder()
            .addParameters(
                listOf(
                    ParameterSpec.builder("name", String::class).build(),
                    ParameterSpec.builder("company", String::class).build()
                )
            ).build()
    )

    // プロパティ
    typeSpecBuilder.addProperties(
        listOf(
            PropertySpec.builder("name", String::class).initializer("name").build(),
            PropertySpec.builder("company", String::class).initializer("company").build()
        )
    )

    // 関数
    typeSpecBuilder.addFunction(
        FunSpec.builder("greeting")
            .addStatement("""println("こんにちは!%Lの%Lです。")""", "\${this.company}", "\${this.name}").build()
    )

    // ビルド
    val typeSpec = typeSpecBuilder.build()


    // メイン関数の生成
    val mainFunction = FunSpec.builder("main").addCode("""
        Person("森","カサレアル").greeting()
    """.trimIndent()).build()

    // ファイルの作成
    val fileSpec = FileSpec
        // パッケージ名とファイル名
        .builder("jp.co.casareal.hello", "Person")
        // クラスの追加
        .addType(typeSpec)
        // 関数の追加
        .addFunction(mainFunction)
        .build()

    fileSpec.writeTo(System.out)
}

生成されたコード

実行すると以下のコードが出力されます。

package jp.co.casareal.hello

data class Person(
    val name: String,
    val company: String
) {
    fun greeting() {
        println("こんにちは!${this.company}の${this.name}です。")
    }
}

fun main() {
    Person("森", "カサレアル").greeting()
}

おわりに

公式サイトが充実しているので困ったら公式サイト見るとだいたいのことは解決できると思います。

今回はサンプルなので簡単なものしか生成していませんが、Spring Frameworkを使ってバックエンドの開発をしているときに、KotlinPoetを使ってDBのメタ情報からController,Service,Repositoryの各レイヤーのベースを生成する使い方をしています。

同じようなコードを大量に実装する場合にKotlinPoetを使えば楽ができそうですね。


--------------------------
システム開発のご要望・ご相談はこちらから

コメントを残す

メールアドレスが公開されることはありません。