Example of how compiler plugin works by implementating a fraction of kotlinx.serialization plugin.
Given:
@Serializable
class Data(val i: String)
Generates:
@Serializable
class Data(val i: String) {
companion object {
fun serializer(): KSerializer<Data> = `$serializer`
}
private object `$serializer` : KSerializer<Data> {
private val delegate = StringSerializer()
override val descriptor = delegate.descriptor
override fun serialize(encoder: Encoder, data: Data) =
delegate.serialize(encoder, data.toString())
override fun deserialize(decoder: Decoder) =
TODO()
}
}
compiler-plugin
folder - the plugin itself
integration
folder - playground
See SerializationResolveExtension
in compiler-plugin
folder
See SerializationErrors
and SerializationDeclarationChecker
in compiler-plugin
folder
See SerializationLoweringExtension
and SerializationLoweringClassGeneration
in compiler-plugin
folder