Generar class de datos con KotlinPoet

Quiero generar classs de datos simples con KotlinPoet:

data class User(val id: Int) 

Lo hago así:

 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) 

Pero lo que obtengo es esto:

 data class User(id: Int) { } 

¿Cómo puedo agregar el modificador val al parámetro constructor?

    Aquí hay un problema para discutir este problema.

    La conclusión es que la forma de escribir este código es crear una propiedad que coincida con el nombre del parámetro del constructor, y es inicializado por él:

     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) 

    Sin embargo, esta característica no está disponible a partir de la versión 0.2.0 de KotlinPoet. Ya está implementado, y hay una testing para esto en el repository que está pasando, pero tendrás que esperar a que la versión 0.3.0 de KotlinPoet pueda usar esta característica, que se supone que vendrá en el siguiente Pocos diás.

    Esta function está disponible desde 0.3.0 , que ya está disponible.


    El código anterior con un formatting alternativo que coincide con su estilo original:

     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)