[Serialization] Reorganize module structure

This commit is contained in:
Dmitriy Novozhilov
2022-08-22 11:49:45 +03:00
parent 0a8cefc8a5
commit cc00dcc038
150 changed files with 493 additions and 322 deletions
@@ -0,0 +1,144 @@
FILE: abstractAndSealed.kt
@R|kotlinx/serialization/Serializable|() public sealed interface I : R|kotlin/Any| {
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<I>|
private constructor(): R|I.Companion|
}
}
@R|kotlinx/serialization/Serializable|() public sealed class X : R|I| {
protected constructor(): R|X| {
super<R|kotlin/Any|>()
}
private final var x: R|kotlin/String| = String(X)
private get(): R|kotlin/String|
private set(value: R|kotlin/String|): R|kotlin/Unit|
public final fun exposeX(): R|kotlin/String| {
^exposeX this@R|/X|.R|/X.x|
}
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<X>|
private constructor(): R|X.Companion|
}
}
@R|kotlinx/serialization/Serializable|() public abstract class Y : R|X| {
public constructor(): R|Y| {
super<R|X|>()
}
private final var y: R|kotlin/String| = String(Y)
private get(): R|kotlin/String|
private set(value: R|kotlin/String|): R|kotlin/Unit|
public final fun exposeY(): R|kotlin/String| {
^exposeY this@R|/Y|.R|/Y.y|
}
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<Y>|
private constructor(): R|Y.Companion|
}
}
@R|kotlinx/serialization/Serializable|() public final class Bottom : R|Y| {
public constructor(): R|Bottom| {
super<R|Y|>()
}
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<Bottom>|
private constructor(): R|Bottom.Companion|
}
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<Bottom>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|Bottom|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|Bottom|
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
public final fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
private constructor(): R|Bottom.$serializer|
}
}
public final fun testData(results: R|kotlin/String|): R|kotlin/String| {
when () {
!=(R|<local>/results|, String(OK)) -> {
^testData R|<local>/results|
}
}
lval serial: R|kotlinx/serialization/KSerializer<Bottom>| = Q|Bottom|.R|/Bottom.Companion.serializer|()
lval j: R|kotlinx/serialization/json/Json| = R|kotlinx/serialization/json/Json|(<L> = Json@fun R|kotlinx/serialization/json/JsonBuilder|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|kotlinx/serialization/json/JsonBuilder.encodeDefaults| = Boolean(true)
}
)
lval s: R|kotlin/String| = R|<local>/j|.R|kotlinx/serialization/json/Json.encodeToString|<R|Bottom|>(R|<local>/serial|, R|/Bottom.Bottom|())
when () {
!=(R|<local>/s|, String({"x":"X","y":"Y"})) -> {
^testData <strcat>(String(Incorrect encoding: ), R|<local>/s|)
}
}
lval decoded: R|Bottom| = R|<local>/j|.R|kotlinx/serialization/json/Json.decodeFromString|<R|Bottom|>(R|<local>/serial|, String({"x":"1","y":"2"}))
when () {
!=(R|<local>/decoded|.R|/X.exposeX|(), String(1)) -> {
^testData String(Incorrect X)
}
}
when () {
!=(R|<local>/decoded|.R|/Y.exposeY|(), String(2)) -> {
^testData String(Incorrect Y)
}
}
^testData String(OK)
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlinx/serialization/ExperimentalSerializationApi|))) public final fun testKinds(): R|kotlin/String| {
when () {
!=(Q|I|.R|/I.Companion.serializer|().R|SubstitutionOverride<kotlinx/serialization/KSerializer.descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|>|.R|kotlinx/serialization/descriptors/SerialDescriptor.kind|, Q|kotlinx/serialization/descriptors/PolymorphicKind.SEALED|) -> {
^testKinds String(Not sealed: I)
}
}
when () {
!=(Q|X|.R|/X.Companion.serializer|().R|SubstitutionOverride<kotlinx/serialization/KSerializer.descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|>|.R|kotlinx/serialization/descriptors/SerialDescriptor.kind|, Q|kotlinx/serialization/descriptors/PolymorphicKind.SEALED|) -> {
^testKinds String(Not sealed: X)
}
}
when () {
!=(Q|Y|.R|/Y.Companion.serializer|().R|SubstitutionOverride<kotlinx/serialization/KSerializer.descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|>|.R|kotlinx/serialization/descriptors/SerialDescriptor.kind|, Q|kotlinx/serialization/descriptors/PolymorphicKind.OPEN|) -> {
^testKinds String(Not polymorphic: Y)
}
}
lval serial: R|kotlinx/serialization/KSerializer<Bottom>| = Q|Bottom|.R|/Bottom.Companion.serializer|()
when () {
!=(R|<local>/serial|.R|SubstitutionOverride<kotlinx/serialization/KSerializer.descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|>|.R|kotlinx/serialization/descriptors/SerialDescriptor.kind|, Q|kotlinx/serialization/descriptors/StructureKind.CLASS|) -> {
^testKinds String(Not class: Bottom)
}
}
^testKinds String(OK)
}
public final fun box(): R|kotlin/String| {
^box R|/testData|(R|/testKinds|())
}
@@ -0,0 +1,51 @@
// WITH_STDLIB
import kotlinx.serialization.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.json.*
@Serializable
sealed interface I
@Serializable
sealed class X: I {
private var x = "X"
fun exposeX() = x
}
@Serializable
abstract class Y: X() {
private var y = "Y"
fun exposeY() = y
}
@Serializable
class Bottom: Y()
fun testData(results: String): String {
if (results != "OK") return results
val serial = Bottom.serializer()
val j = Json { encodeDefaults = true }
val s = j.encodeToString(serial, Bottom())
if (s != """{"x":"X","y":"Y"}""") return "Incorrect encoding: $s"
val decoded = j.decodeFromString(serial, """{"x":"1","y":"2"}""")
if (decoded.exposeX() != "1") return "Incorrect X"
if (decoded.exposeY() != "2") return "Incorrect Y"
return "OK"
}
@OptIn(ExperimentalSerializationApi::class)
fun testKinds(): String {
if (I.serializer().descriptor.kind != PolymorphicKind.SEALED) return "Not sealed: I"
if (X.serializer().descriptor.kind != PolymorphicKind.SEALED) return "Not sealed: X"
if (Y.serializer().descriptor.kind != PolymorphicKind.OPEN) return "Not polymorphic: Y"
val serial = Bottom.serializer()
if (serial.descriptor.kind != StructureKind.CLASS) return "Not class: Bottom"
return "OK"
}
fun box(): String {
return testData(testKinds())
}
@@ -0,0 +1,58 @@
FILE: classWithCompanionObject.kt
@R|kotlinx/serialization/Serializable|() public final class SomeClass : R|kotlin/Any| {
public constructor(i: R|kotlin/Int|): R|SomeClass| {
super<R|kotlin/Any|>()
}
public final val i: R|kotlin/Int| = R|<local>/i|
public get(): R|kotlin/Int|
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<SomeClass>|
private constructor(): R|SomeClass.Companion|
}
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<SomeClass>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|SomeClass|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|SomeClass|
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
public final fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
private constructor(): R|SomeClass.$serializer|
}
}
public final fun box(): R|kotlin/String| {
lval targetString: R|kotlin/String| = String({"i":42})
lval serializer: R|kotlinx/serialization/KSerializer<SomeClass>| = Q|SomeClass.Companion|.R|/SomeClass.Companion.serializer|()
lval descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor| = R|<local>/serializer|.R|SubstitutionOverride<kotlinx/serialization/KSerializer.descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|>|
when () {
!=(R|<local>/descriptor|.R|kotlin/Any.toString|(), String(SomeClass(i: kotlin.Int))) -> {
^box <strcat>(String(Incorrect SerialDescriptor.toString(): ), R|<local>/descriptor|)
}
}
lval instance: R|SomeClass| = R|/SomeClass.SomeClass|(Int(42))
lval string: R|kotlin/String| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.encodeToString|<R|SomeClass|>(R|<local>/serializer|, R|<local>/instance|)
when () {
!=(R|<local>/string|, R|<local>/targetString|) -> {
^box <strcat>(String(Incorrect serialization result: expected ), R|<local>/targetString|, String(, got ), R|<local>/string|)
}
}
lval instance2: R|SomeClass| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.decodeFromString|<R|SomeClass|>(R|<local>/serializer|, R|<local>/string|)
when () {
!=(R|<local>/instance2|.R|/SomeClass.i|, R|<local>/instance|.R|/SomeClass.i|) -> {
^box <strcat>(String(Incorrect deserialization result: expected ), R|<local>/instance|.R|/SomeClass.i|, String(, got ), R|<local>/instance2|.R|/SomeClass.i|)
}
}
^box String(OK)
}
@@ -0,0 +1,22 @@
// WITH_STDLIB
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
class SomeClass(val i: Int)
fun box(): String {
val targetString = """{"i":42}"""
val serializer = SomeClass.Companion.serializer()
val descriptor = serializer.descriptor
if (descriptor.toString() != "SomeClass(i: kotlin.Int)") return "Incorrect SerialDescriptor.toString(): $descriptor"
val instance = SomeClass(42)
val string = Json.encodeToString(serializer, instance)
if (string != targetString) return "Incorrect serialization result: expected $targetString, got $string"
val instance2 = Json.decodeFromString(serializer, string)
if (instance2.i != instance.i) return "Incorrect deserialization result: expected ${instance.i}, got ${instance2.i}"
return "OK"
}
@@ -0,0 +1,61 @@
FILE: classWithGenericParameters.kt
@R|kotlinx/serialization/Serializable|() public final class GenericBox<T, V> : R|kotlin/Any| {
public constructor<T, V>(i: R|kotlin/Int|, t: R|T|, vs: R|kotlin/collections/List<V>|): R|GenericBox<T, V>| {
super<R|kotlin/Any|>()
}
public final val i: R|kotlin/Int| = R|<local>/i|
public get(): R|kotlin/Int|
public final val t: R|T| = R|<local>/t|
public get(): R|T|
public final val vs: R|kotlin/collections/List<V>| = R|<local>/vs|
public get(): R|kotlin/collections/List<V>|
public final companion object Companion : R|kotlin/Any| {
public final fun <T, V> serializer(typeSerial0: R|kotlinx/serialization/KSerializer<T>|, typeSerial1: R|kotlinx/serialization/KSerializer<V>|): R|kotlinx/serialization/KSerializer<GenericBox<T, V>>|
private constructor(): R|GenericBox.Companion|
}
public final class $serializer<T, V> : R|kotlinx/serialization/internal/GeneratedSerializer<GenericBox<T, V>>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|GenericBox<T, V>|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|GenericBox<T, V>|
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
public final fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
public final fun typeParametersSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
private constructor(): R|GenericBox.$serializer<T, V>|
private constructor(typeSerial0: R|kotlinx/serialization/KSerializer<T>|, typeSerial1: R|kotlinx/serialization/KSerializer<V>|): R|GenericBox.$serializer<T, V>|
}
}
public final fun box(): R|kotlin/String| {
lval box: R|GenericBox<kotlin/String, kotlin/Boolean>| = R|/GenericBox.GenericBox|<R|kotlin/String|, R|kotlin/Boolean|>(Int(42), String(foo), R|kotlin/collections/listOf|<R|kotlin/Boolean|>(vararg(Boolean(true), Boolean(false))))
lval serial: R|kotlinx/serialization/KSerializer<GenericBox<kotlin/String, kotlin/Boolean>>| = Q|GenericBox|.R|/GenericBox.Companion.serializer|<R|kotlin/String|, R|kotlin/Boolean|>(Q|kotlin/String|.R|kotlinx/serialization/builtins/serializer|(), Q|kotlin/Boolean|.R|kotlinx/serialization/builtins/serializer|())
lval target: R|kotlin/String| = String({"i":42,"t":"foo","vs":[true,false]})
lval s: R|kotlin/String| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.encodeToString|<R|GenericBox<kotlin/String, kotlin/Boolean>|>(R|<local>/serial|, R|<local>/box|)
when () {
!=(R|<local>/target|, R|<local>/s|) -> {
^box <strcat>(String(Incorrect serialization: ), R|<local>/s|)
}
}
lval decoded: R|GenericBox<kotlin/String, kotlin/Boolean>| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.decodeFromString|<R|GenericBox<kotlin/String, kotlin/Boolean>|>(R|<local>/serial|, R|<local>/s|)
when () {
!=(R|<local>/box|.R|SubstitutionOverride</GenericBox.t: R|kotlin/String|>|, R|<local>/decoded|.R|SubstitutionOverride</GenericBox.t: R|kotlin/String|>|) || !=(R|<local>/box|.R|SubstitutionOverride</GenericBox.vs: R|kotlin/collections/List<kotlin/Boolean>|>|, R|<local>/decoded|.R|SubstitutionOverride</GenericBox.vs: R|kotlin/collections/List<kotlin/Boolean>|>|) -> {
^box String(Incorrect deserialization)
}
}
^box String(OK)
}
@@ -0,0 +1,23 @@
// WITH_STDLIB
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import kotlinx.serialization.builtins.*
@Serializable
class GenericBox<T, V>(
val i: Int,
val t: T,
val vs: List<V>
)
fun box(): String {
val box = GenericBox(42, "foo", listOf(true, false))
val serial = GenericBox.serializer(String.serializer(), Boolean.serializer())
val target = """{"i":42,"t":"foo","vs":[true,false]}"""
val s = Json.encodeToString(serial, box)
if (target != s) return "Incorrect serialization: $s"
val decoded = Json.decodeFromString(serial, s)
if (box.t != decoded.t || box.vs != decoded.vs) return "Incorrect deserialization"
return "OK"
}
@@ -0,0 +1,94 @@
FILE: defaultProperties.kt
@R|kotlinx/serialization/Serializable|() public final data class SomeClass : R|kotlin/Any| {
public constructor(ctor: R|kotlin/Int| = Int(42), ctorDependent: R|kotlin/Int| = R|<local>/ctor|.R|kotlin/Int.plus|(Int(1))): R|SomeClass| {
super<R|kotlin/Any|>()
}
public final val ctor: R|kotlin/Int| = R|<local>/ctor|
public get(): R|kotlin/Int|
public final val ctorDependent: R|kotlin/Int| = R|<local>/ctorDependent|
public get(): R|kotlin/Int|
public final var body: R|kotlin/String| = String()
public get(): R|kotlin/String|
public set(value: R|kotlin/String|): R|kotlin/Unit|
public final var bodyDependent: R|kotlin/Int| = this@R|/SomeClass|.R|/SomeClass.ctor|.R|kotlin/Int.plus|(Int(2))
public get(): R|kotlin/Int|
public set(value: R|kotlin/Int|): R|kotlin/Unit|
public final operator fun component1(): R|kotlin/Int|
public final operator fun component2(): R|kotlin/Int|
public final fun copy(ctor: R|kotlin/Int| = this@R|/SomeClass|.R|/SomeClass.ctor|, ctorDependent: R|kotlin/Int| = this@R|/SomeClass|.R|/SomeClass.ctorDependent|): R|SomeClass|
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<SomeClass>|
private constructor(): R|SomeClass.Companion|
}
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<SomeClass>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|SomeClass|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|SomeClass|
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
public final fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
private constructor(): R|SomeClass.$serializer|
}
}
public final fun test(targetString: R|kotlin/String|): R|kotlin/String| {
lval json: R|kotlinx/serialization/json/Json| = R|kotlinx/serialization/json/Json|(<L> = Json@fun R|kotlinx/serialization/json/JsonBuilder|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|kotlinx/serialization/json/JsonBuilder.encodeDefaults| = Boolean(true)
}
)
lval c: R|SomeClass| = R|/SomeClass.SomeClass|(Int(1)).R|kotlin/apply|<R|SomeClass|>(<L> = apply@fun R|SomeClass|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=EXACTLY_ONCE> {
this@R|special/anonymous|.R|/SomeClass.body| = String(x)
}
)
lval s: R|kotlin/String| = R|<local>/json|.R|kotlinx/serialization/json/Json.encodeToString|<R|SomeClass|>(Q|SomeClass|.R|/SomeClass.Companion.serializer|(), R|<local>/c|)
when () {
!=(R|<local>/s|, R|<local>/targetString|) -> {
^test R|<local>/s|
}
}
lval i2: R|SomeClass| = R|<local>/json|.R|kotlinx/serialization/json/Json.decodeFromString|<R|SomeClass|>(Q|SomeClass|.R|/SomeClass.Companion.serializer|(), String({}))
when () {
!=(R|<local>/i2|.R|/SomeClass.ctor|, Int(42)) -> {
^test String(Incorrect default ctor)
}
}
when () {
!=(R|<local>/i2|.R|/SomeClass.ctorDependent|, Int(43)) -> {
^test String(Incorrect default ctorDependent)
}
}
when () {
!=(R|<local>/i2|.R|/SomeClass.body|, String()) -> {
^test String(Incorrect default body)
}
}
when () {
!=(R|<local>/i2|.R|/SomeClass.bodyDependent|, Int(44)) -> {
^test String(Incorrect default bodyDependent)
}
}
^test String(OK)
}
public final fun box(): R|kotlin/String| {
^box R|/test|(String({"ctor":1,"ctorDependent":2,"body":"x","bodyDependent":3}))
}
@@ -0,0 +1,28 @@
// WITH_STDLIB
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
data class SomeClass(val ctor: Int = 42, val ctorDependent: Int = ctor + 1) {
var body: String = ""
var bodyDependent = ctor + 2
}
fun test(targetString: String): String {
val json = Json { encodeDefaults = true }
val c = SomeClass(1).apply { body = "x" }
val s = json.encodeToString(SomeClass.serializer(), c)
if (s != targetString) return s
val i2 = json.decodeFromString(SomeClass.serializer(), "{}")
if (i2.ctor != 42) return "Incorrect default ctor"
if (i2.ctorDependent != 43) return "Incorrect default ctorDependent"
if (i2.body != "") return "Incorrect default body"
if (i2.bodyDependent != 44) return "Incorrect default bodyDependent"
return "OK"
}
fun box(): String {
return test("""{"ctor":1,"ctorDependent":2,"body":"x","bodyDependent":3}""")
}
@@ -0,0 +1,132 @@
FILE: enums.kt
public final enum class Plain : R|kotlin/Enum<Plain>| {
private constructor(): R|Plain| {
super<R|kotlin/Enum<Plain>|>()
}
public final static enum entry A: R|Plain|
public final static enum entry B: R|Plain|
public final static fun values(): R|kotlin/Array<Plain>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|Plain| {
}
public final static val entries: R|kotlin/enums/EnumEntries<Plain>|
public get(): R|kotlin/enums/EnumEntries<Plain>|
}
@R|kotlinx/serialization/Serializable|() public final enum class WithNames : R|kotlin/Enum<WithNames>| {
private constructor(): R|WithNames| {
super<R|kotlin/Enum<WithNames>|>()
}
@R|kotlinx/serialization/SerialName|(value = String(A)) public final static enum entry ENTRY1: R|WithNames| = object : R|WithNames| {
private constructor(): R|<anonymous>| {
super<R|WithNames|>()
}
}
@R|kotlinx/serialization/SerialName|(value = String(B)) public final static enum entry ENTRY2: R|WithNames| = object : R|WithNames| {
private constructor(): R|<anonymous>| {
super<R|WithNames|>()
}
}
public final static fun values(): R|kotlin/Array<WithNames>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|WithNames| {
}
public final static val entries: R|kotlin/enums/EnumEntries<WithNames>|
public get(): R|kotlin/enums/EnumEntries<WithNames>|
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<WithNames>|
private constructor(): R|WithNames.Companion|
}
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<WithNames>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|WithNames|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|WithNames|
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
public final fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
private constructor(): R|WithNames.$serializer|
}
}
@R|kotlinx/serialization/Serializable|() public final class Holder : R|kotlin/Any| {
public constructor(p: R|Plain|, w: R|WithNames|): R|Holder| {
super<R|kotlin/Any|>()
}
public final val p: R|Plain| = R|<local>/p|
public get(): R|Plain|
public final val w: R|WithNames| = R|<local>/w|
public get(): R|WithNames|
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<Holder>|
private constructor(): R|Holder.Companion|
}
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<Holder>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|Holder|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|Holder|
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
public final fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
private constructor(): R|Holder.$serializer|
}
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlinx/serialization/InternalSerializationApi|))) public final fun testSerializers(): R|kotlin/String| {
lval cs: R|kotlin/Array<kotlinx/serialization/KSerializer<*>>| = (Q|Holder|.R|/Holder.Companion.serializer|() as R|kotlinx/serialization/internal/GeneratedSerializer<*>|).R|SubstitutionOverride<kotlinx/serialization/internal/GeneratedSerializer.childSerializers: R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|>|()
lval str1: R|kotlin/String| = R|<local>/cs|.R|SubstitutionOverride<kotlin/Array.get: R|kotlinx/serialization/KSerializer<*>|>|(Int(0)).R|kotlin/Any.toString|()
when () {
R|<local>/str1|.R|kotlin/text/contains|(String(kotlinx.serialization.internal.EnumSerializer)).R|kotlin/Boolean.not|() -> {
^testSerializers R|<local>/str1|
}
}
^testSerializers String(OK)
}
public final fun testSerialization(previous: R|kotlin/String|): R|kotlin/String| {
when () {
!=(R|<local>/previous|, String(OK)) -> {
^testSerialization R|<local>/previous|
}
}
lval h: R|Holder| = R|/Holder.Holder|(Q|Plain|.R|/Plain.B|, Q|WithNames|.R|/WithNames.ENTRY1|)
lval s: R|kotlin/String| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.encodeToString|<R|Holder|>(Q|Holder|.R|/Holder.Companion.serializer|(), R|<local>/h|)
when () {
!=(R|<local>/s|, String({"p":"B","w":"A"})) -> {
^testSerialization R|<local>/s|
}
}
^testSerialization String(OK)
}
public final fun box(): R|kotlin/String| {
^box R|/testSerialization|(R|/testSerializers|())
}
@@ -0,0 +1,45 @@
// WITH_STDLIB
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import kotlinx.serialization.internal.*
enum class Plain {
A, B
}
@Serializable enum class WithNames {
@SerialName("A") ENTRY1,
@SerialName("B") ENTRY2
}
@Serializable
class Holder(val p: Plain, val w: WithNames)
@OptIn(InternalSerializationApi::class)
fun testSerializers(): String {
val cs = (Holder.serializer() as GeneratedSerializer<*>).childSerializers()
val str1 = cs[0].toString()
if (!str1.contains("kotlinx.serialization.internal.EnumSerializer")) return str1
/**
* Serialization 1.4.1+ have runtime factories to create EnumSerializer instead of synthetic $serializer, saving bytecode
* and bringing consistency. After updating the version, uncomment this block.
*/
// val str2 = cs[1].toString()
// if (!str2.contains("kotlinx.serialization.internal.EnumSerializer")) return str2
return "OK"
}
fun testSerialization(previous: String): String {
if (previous != "OK") return previous
val h = Holder(Plain.B, WithNames.ENTRY1)
val s = Json.encodeToString(Holder.serializer(), h)
if (s != """{"p":"B","w":"A"}""") return s
return "OK"
}
fun box(): String {
return testSerialization(testSerializers())
}
@@ -0,0 +1,77 @@
FILE: inlineClasses.kt
@R|kotlinx/serialization/Serializable|() @R|kotlin/jvm/JvmInline|() public final inline class Foo : R|kotlin/Any| {
public constructor(i: R|kotlin/Int|): R|Foo| {
super<R|kotlin/Any|>()
}
public final val i: R|kotlin/Int| = R|<local>/i|
public get(): R|kotlin/Int|
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<Foo>|
private constructor(): R|Foo.Companion|
}
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<Foo>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|Foo|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|Foo|
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
public final fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
private constructor(): R|Foo.$serializer|
}
}
@R|kotlinx/serialization/Serializable|() public final class Holder : R|kotlin/Any| {
public constructor(f: R|Foo|): R|Holder| {
super<R|kotlin/Any|>()
}
public final val f: R|Foo| = R|<local>/f|
public get(): R|Foo|
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<Holder>|
private constructor(): R|Holder.Companion|
}
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<Holder>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|Holder|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|Holder|
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
public final fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
private constructor(): R|Holder.$serializer|
}
}
public final fun box(): R|kotlin/String| {
when () {
Q|Foo|.R|/Foo.Companion.serializer|().R|SubstitutionOverride<kotlinx/serialization/KSerializer.descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|>|.R|kotlinx/serialization/descriptors/SerialDescriptor.isInline|.R|kotlin/Boolean.not|() -> {
^box String(Incorrect descriptor)
}
}
lval s: R|kotlin/String| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.encodeToString|<R|Holder|>(Q|Holder|.R|/Holder.Companion.serializer|(), R|/Holder.Holder|(R|/Foo.Foo|(Int(42))))
when () {
!=(R|<local>/s|, String({"f":42})) -> {
^box R|<local>/s|
}
}
^box String(OK)
}
@@ -0,0 +1,19 @@
// WITH_STDLIB
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import kotlinx.serialization.internal.*
@Serializable
@JvmInline
value class Foo(val i: Int)
@Serializable
class Holder(val f: Foo)
fun box(): String {
if(!Foo.serializer().descriptor.isInline) return "Incorrect descriptor"
val s = Json.encodeToString(Holder.serializer(), Holder(Foo(42)))
if (s != """{"f":42}""") return s
return "OK"
}
@@ -0,0 +1,70 @@
FILE: multipleProperties.kt
@R|kotlinx/serialization/Serializable|() public final class SomeClass : R|kotlin/Any| {
public constructor(ctor: R|kotlin/Int|): R|SomeClass| {
super<R|kotlin/Any|>()
}
public final val ctor: R|kotlin/Int| = R|<local>/ctor|
public get(): R|kotlin/Int|
public final var body: R|kotlin/String| = String()
public get(): R|kotlin/String|
public set(value: R|kotlin/String|): R|kotlin/Unit|
public final val getter: R|kotlin/Int|
public get(): R|kotlin/Int| {
^ Int(42)
}
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<SomeClass>|
private constructor(): R|SomeClass.Companion|
}
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<SomeClass>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|SomeClass|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|SomeClass|
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
public final fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
private constructor(): R|SomeClass.$serializer|
}
}
public final fun test(targetString: R|kotlin/String|): R|kotlin/String| {
lval c: R|SomeClass| = R|/SomeClass.SomeClass|(Int(1)).R|kotlin/apply|<R|SomeClass|>(<L> = apply@fun R|SomeClass|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=EXACTLY_ONCE> {
this@R|special/anonymous|.R|/SomeClass.body| = String(x)
}
)
lval s: R|kotlin/String| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.encodeToString|<R|SomeClass|>(Q|SomeClass|.R|/SomeClass.Companion.serializer|(), R|<local>/c|)
when () {
!=(R|<local>/s|, R|<local>/targetString|) -> {
^test R|<local>/s|
}
}
lval i: R|SomeClass| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.decodeFromString|<R|SomeClass|>(Q|SomeClass|.R|/SomeClass.Companion.serializer|(), R|<local>/s|)
when () {
!=(R|<local>/i|.R|/SomeClass.ctor|, R|<local>/c|.R|/SomeClass.ctor|) -> {
^test String(Incorrect ctor)
}
}
when () {
!=(R|<local>/i|.R|/SomeClass.body|, R|<local>/c|.R|/SomeClass.body|) -> {
^test String(Incorrect body)
}
}
^test String(OK)
}
public final fun box(): R|kotlin/String| {
^box R|/test|(String({"ctor":1,"body":"x"}))
}
@@ -0,0 +1,26 @@
// WITH_STDLIB
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
class SomeClass(val ctor: Int) {
var body: String = ""
// Not serializable: no backing field
val getter: Int get() = 42
}
fun test(targetString: String): String {
val c = SomeClass(1).apply { body = "x" }
val s = Json.encodeToString(SomeClass.serializer(), c)
if (s != targetString) return s
val i = Json.decodeFromString(SomeClass.serializer(), s)
if (i.ctor != c.ctor) return "Incorrect ctor"
if (i.body != c.body) return "Incorrect body"
return "OK"
}
fun box(): String {
return test("""{"ctor":1,"body":"x"}""")
}
@@ -0,0 +1,98 @@
FILE: privatePropertiesSerialization.kt
@R|kotlinx/serialization/Serializable|() public open class Parent : R|kotlin/Any| {
public constructor(ctor: R|kotlin/Int|): R|Parent| {
super<R|kotlin/Any|>()
}
private final val ctor: R|kotlin/Int| = R|<local>/ctor|
private get(): R|kotlin/Int|
private final var body: R|kotlin/String| = String(42)
private get(): R|kotlin/String|
private set(value: R|kotlin/String|): R|kotlin/Unit|
public final fun checkDeser(c: R|kotlin/Int|, b: R|kotlin/String|): R|kotlin/String| {
when () {
!=(this@R|/Parent|.R|/Parent.ctor|, R|<local>/c|) -> {
^checkDeser <strcat>(String(Ctor : ), this@R|/Parent|.R|/Parent.ctor|)
}
}
when () {
!=(this@R|/Parent|.R|/Parent.body|, R|<local>/b|) -> {
^checkDeser <strcat>(String(Body : ), this@R|/Parent|.R|/Parent.body|)
}
}
^checkDeser String(OK)
}
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<Parent>|
private constructor(): R|Parent.Companion|
}
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<Parent>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|Parent|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|Parent|
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
public final fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
private constructor(): R|Parent.$serializer|
}
}
@R|kotlinx/serialization/Serializable|() public final class Derived : R|Parent| {
public constructor(): R|Derived| {
super<R|Parent|>(Int(42))
}
public final companion object Companion : R|kotlin/Any| {
public final fun serializer(): R|kotlinx/serialization/KSerializer<Derived>|
private constructor(): R|Derived.Companion|
}
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<Derived>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|Derived|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|Derived|
public final val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor|
public get(): R|kotlinx/serialization/descriptors/SerialDescriptor|
public final fun childSerializers(): R|kotlin/Array<kotlinx/serialization/KSerializer<*>>|
private constructor(): R|Derived.$serializer|
}
}
public final fun test(targetString: R|kotlin/String|): R|kotlin/String| {
lval c: R|Derived| = R|/Derived.Derived|()
lval j: R|kotlinx/serialization/json/Json| = R|kotlinx/serialization/json/Json|(<L> = Json@fun R|kotlinx/serialization/json/JsonBuilder|.<anonymous>(): R|kotlin/Unit| <inline=NoInline> {
this@R|special/anonymous|.R|kotlinx/serialization/json/JsonBuilder.encodeDefaults| = Boolean(true)
}
)
lval s: R|kotlin/String| = R|<local>/j|.R|kotlinx/serialization/json/Json.encodeToString|<R|Derived|>(Q|Derived|.R|/Derived.Companion.serializer|(), R|<local>/c|)
when () {
!=(R|<local>/s|, R|<local>/targetString|) -> {
^test R|<local>/s|
}
}
lval d: R|Derived| = R|<local>/j|.R|kotlinx/serialization/json/Json.decodeFromString|<R|Derived|>(Q|Derived|.R|/Derived.Companion.serializer|(), String({"ctor":43,"body":"43"}))
^test R|<local>/d|.R|/Parent.checkDeser|(Int(43), String(43))
^test String(OK)
}
public final fun box(): R|kotlin/String| {
^box R|/test|(String({"ctor":42,"body":"42"}))
}
@@ -0,0 +1,37 @@
// WITH_STDLIB
/**
* write$Self and synthetic constructor are required for correct serialization and deserialization of private fields,
* otherwise inaccessible from e.g. Derived.$serializer.serialize().
* This test verifies that.
*/
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
open class Parent(private val ctor: Int) {
private var body: String = "42"
fun checkDeser(c: Int, b: String): String {
if (this.ctor != c) return "Ctor : ${this.ctor}"
if (this.body != b) return "Body : ${this.body}"
return "OK"
}
}
@Serializable
class Derived: Parent(42)
fun test(targetString: String): String {
val c = Derived()
val j = Json { encodeDefaults = true }
val s = j.encodeToString(Derived.serializer(), c)
if (s != targetString) return s
val d = j.decodeFromString(Derived.serializer(), """{"ctor":43,"body":"43"}""")
return d.checkDeser(43, "43")
return "OK"
}
fun box(): String {
return test("""{"ctor":42,"body":"42"}""")
}
@@ -0,0 +1,26 @@
FILE: serializableObject.kt
@R|kotlinx/serialization/Serializable|() public final object FooBar : R|kotlin/Any| {
private constructor(): R|FooBar| {
super<R|kotlin/Any|>()
}
public final fun serializer(): R|kotlinx/serialization/KSerializer<FooBar>|
}
public final fun box(): R|kotlin/String| {
lval encoded: R|kotlin/String| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.encodeToString|<R|FooBar|>(Q|FooBar|.R|/FooBar.serializer|(), Q|FooBar|)
when () {
!=(R|<local>/encoded|, String({})) -> {
^box R|<local>/encoded|
}
}
lval decoded: R|FooBar| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.decodeFromString|<R|FooBar|>(Q|FooBar|.R|/FooBar.serializer|(), R|<local>/encoded|)
when () {
!==(R|<local>/decoded|, Q|FooBar|) -> {
^box String(Incorrect object instance)
}
}
^box String(OK)
}
@@ -0,0 +1,15 @@
// WITH_STDLIB
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
object FooBar
fun box(): String {
val encoded = Json.encodeToString(FooBar.serializer(), FooBar)
if (encoded != "{}") return encoded
val decoded = Json.decodeFromString(FooBar.serializer(), encoded)
if (decoded !== FooBar) return "Incorrect object instance"
return "OK"
}