Creating a data class with KotlinPoet

I want to create a simple data class using KotlinPoet:

data class User(val id: Int)

      

I do it like this:

val builder = KotlinFile.builder("", "Foo")
val classBuilder = TypeSpec.classBuilder("User").addModifiers(KModifier.DATA)
val ctor = FunSpec.constructorBuilder()
ctor.addParameter("id", Int::class)
classBuilder.primaryConstructor(ctor.build())
builder.addType(classBuilder.build())
builder.build().writeTo(System.out)

      

But I am getting the following:

data class User(id: Int) {
}

      

How do I add a modifier val

to a constructor parameter?

+3


source to share


1 answer


Here is an issue discussing this issue.

The conclusion is that the way to write this code is to create a property that matches the name of the constructor parameter and is initialized by it:

KotlinFile.builder("", "Foo")
        .addType(TypeSpec.classBuilder("User")
                .addModifiers(KModifier.DATA)
                .primaryConstructor(FunSpec.constructorBuilder()
                        .addParameter("id", Int::class)
                        .build())
                .addProperty(PropertySpec.builder("id", Int::class)
                        .initializer("id")
                        .build())
                .build()
        )
        .build()
        .writeTo(System.out)

      

However, this feature is not available in the 0.2.0

KotlinPoet version . It is already implemented and test exists in this repository , but you will have to wait for the 0.3.0

release of KotlinPoet to be able to use this feature, which should appear in the next few days.



This feature is available from 0.3.0

, which is currently missing.


The preceding code, with alternate formatting that matches your original style:

val builder = KotlinFile.builder("", "Foo")
val classBuilder = TypeSpec.classBuilder("User").addModifiers(KModifier.DATA)

val ctor = FunSpec.constructorBuilder()
ctor.addParameter("id", Int::class)
classBuilder.primaryConstructor(ctor.build())

val idProperty = PropertySpec.builder("id", Int::class).initializer("id").build()
classBuilder.addProperty(idProperty)

builder.addType(classBuilder.build())
builder.build().writeTo(System.out)

      

+2


source







All Articles