is a Kotlin compiler plugin that generates
toString functions for annotated classes based on their properties. Inspired by
Jake Wharton’s blog post on maintaining compatibility in public
, it partially mimics the behavior of
Kotlin data classes while leaving out the
componentN functions, which are difficult to
maintain without breaking API compatibility. Our Paraphrase
runtimes use Poko.
toString functions are familiar to all JVM developers. But Kotlin
generates the exact same set of functions for data classes on all of its multiplatform targets—not
just the JVM. It stands to reason that Poko should do the same. And thanks to a slew of recent
contributions from Jake, now it does! In addition to the JVM and Android platforms it has supported
since its first release 3 years ago, Poko 0.15.0 now supports native and JS targets as well.
The generated functions behave the same on all platforms, and by default implement the same behavior
that data classes implement:
hashCode depend on each of the class’s primary
constructor properties, and
toString prints the values of each of these properties.
In addition to standard data class behavior, Poko also recently added support for respecting array
content via an
@ArrayContentBased annotation. Normally, data classes and Poko classes compare
array properties only by reference (unlike collections, which always compare contents), because this
mirrors the JVM’s default treatment of arrays. But in some cases, the performance gains of using
arrays are considerable—particularly on JS, where
List types involve several wrappers around the
Array. In runtimes like those of Paraphrase and Redwood, which are only invoked by
generated code, the awkwardness of using array properties is less important than this performance
@ArrayContentBased makes it possible to opt in to array use in these cases. Like the
rest of Poko, it now works for all target platforms.
Whether using arrays or not, it’s important for library authors to maintain API compatibility across releases. Now, Kotlin multiplatform library authors can easily ship public data models with minimal concern about breaking their APIs.
This post concludes Cash App’s Summer of Kotlin Multiplatform series.