KotlinPoet 1.0 is here!
KotlinPoet is a collection of Kotlin API that makes generating .kt
files easy. It’s inspired by JavaPoet, a Java code generation library, which powers a number of widely used frameworks, such as Dagger.
KotlinPoet has been around for over a year and is used by a number of popular libraries, such as Moshi and SQLDelight. It’s sweet, it’s battle-tested, it’s ready for prime-time, and today we’re announcing KotlinPoet 1.0! 🎉
Hello World, KotlinPoet! 👋
Here’s a HelloWorld
file from KotlinPoet’s README page:
class Greeter(val name: String) {
fun greet() {
println("Hello, $name")
}
}
fun main(vararg args: String) {
Greeter(args[0]).greet()
}
And this is the code to generate it with KotlinPoet:
val greeterClass = ClassName("", "Greeter")
val file = FileSpec.builder("", "HelloWorld")
.addType(TypeSpec.classBuilder("Greeter")
.primaryConstructor(FunSpec.constructorBuilder()
.addParameter("name", String::class)
.build())
.addProperty(PropertySpec.builder("name", String::class)
.initializer("name")
.build())
.addFunction(FunSpec.builder("greet")
.addStatement("println(%P)", "Hello, \$name")
.build())
.build())
.addFunction(FunSpec.builder("main")
.addParameter("args", String::class, VARARG)
.addStatement("%T(args[0]).greet()", greeterClass)
.build())
.build()
file.writeTo(System.out)
A few things to point out here:
- Specs. KotlinPoet models the file structure using a set of Spec classes, each representing a specific Kotlin construct. Each Spec has an associated Builder class that makes it simple to configure the Spec. All Specs should ultimately be added to a
FileSpec
, which represents a.kt
file. - Types. Referencing types is easy, as most of KotlinPoet’s API is optimized to work with Kotlin’s
KClass
. There are also a few classes that allow you to introduce your own types, such asClassName
,LambdaTypeName
,ParameterizedTypeName
and others. - Custom format specifiers. KotlinPoet comes with a number of format specifiers, which work similarly to
%s
and%d
. For instance,%S
will turn its argument into a double-quoted String, and%L
can take an entire Spec as an argument. - Output. Once you’re done configuring the Specs, call
writeTo()
on theFileSpec
to output the model into the selected destination, supported options includekotlin.Appendable
,java.io.File
andjava.nio.file.Path
.
KotlinPoet can generate extension and single-expression functions, nullable types, data classes, expect
/actual
definitions and much much more! To learn more about KotlinPoet API, check out the KDoc and README.
It’s codegen time!