piecemeal

Project Url: bnorm/piecemeal
More: Author   ReportBugs   
Tags:

Warning Work in progress.

Kotlin FIR+IR plugin for generating a nested Mutable class and associated build function.

import dev.bnorm.piecemeal.Piecemeal

@Piecemeal
class Person(
    val name: String,
    val nickname: String? = name,
    val age: Int = 0,
)

The above example will generate the following

@Piecemeal
class Person private constructor(
    val name: String,
    val nickname: String? = name,
    val age: Int = 0,
) {
    fun toMutable(): Mutable {
        val mutable = Mutable()
        mutable.name = name
        mutable.nickname = nickname
        mutable.age = age
        return mutable
    }

    inline fun copy(transform: Person.Mutable.() -> Unit): Person {
        val tmp = this.toMutable()
        tmp.transform
        return tmp.build()
    }

    companion object {
        @JvmSynthetic // Hide from Java callers who should use Mutable.
        fun build(builder: Person.Mutable.() -> Unit): Person {
            return Mutable().apply(builder).build()
        }
    }

    class Mutable {
        @set:JvmSynthetic // Hide 'void' setter from Java.
        var name: String? = null

        @set:JvmSynthetic // Hide 'void' setter from Java.
        var nickname: String? = null

        @set:JvmSynthetic // Hide 'void' setter from Java.
        var age: Int? = null

        fun setName(name: String?): Mutable {
            this.name = name
            return this
        }

        fun setNickname(nickname: String?): Mutable {
            this.nickname = nickname
            return this
        }

        fun setAge(age: Int): Mutable {
            this.age = age
            return this
        }

        fun build(): Person {
            val name = name ?: throw IllegalStateException("Missing required parameter 'name'.")
            val nickname = nickname ?: name
            val age = age ?: 0

            return Person(
                name = name,
                nickname = nickname ?: name,
                age = age,
            )
        }
    }
}

Various References

Development

When working with compiler tests, it is recommended to use Kotlin Compiler Test Helper.

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools