Added support of named companion in serializable class to the FIR

Merge-request: KT-MR-7472
This commit is contained in:
Sergey.Shanshin
2022-10-27 12:48:29 +00:00
committed by Space Team
parent 8d8d0d9922
commit d4cfb002d0
10 changed files with 237 additions and 55 deletions
@@ -0,0 +1,146 @@
FILE: serializableWithCompanion.kt
package com.example
public final class NonSerializable : R|kotlin/Any| {
public constructor(): R|com/example/NonSerializable| {
super<R|kotlin/Any|>()
}
public final companion object Companion : R|kotlin/Any| {
private constructor(): R|com/example/NonSerializable.Companion| {
super<R|kotlin/Any|>()
}
public final fun foo(): R|kotlin/String| {
^foo String(OK)
}
}
}
@R|kotlinx/serialization/Serializable|() public final data class WithCompanion : R|kotlin/Any| {
public constructor(i: R|kotlin/Int|): R|com/example/WithCompanion| {
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| {
private constructor(): R|com/example/WithCompanion.Companion| {
super<R|kotlin/Any|>()
}
public final fun foo(): R|kotlin/String| {
^foo String(OK)
}
public final fun serializer(): R|kotlinx/serialization/KSerializer<com/example/WithCompanion>|
}
public final operator fun component1(): R|kotlin/Int|
public final fun copy(i: R|kotlin/Int| = this@R|com/example/WithCompanion|.R|com/example/WithCompanion.i|): R|com/example/WithCompanion|
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<com/example/WithCompanion>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|com/example/WithCompanion|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|com/example/WithCompanion|
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|com/example/WithCompanion.$serializer|
}
}
@R|kotlinx/serialization/Serializable|() public final data class WithNamedCompanion : R|kotlin/Any| {
public constructor(i: R|kotlin/Int|): R|com/example/WithNamedCompanion| {
super<R|kotlin/Any|>()
}
public final val i: R|kotlin/Int| = R|<local>/i|
public get(): R|kotlin/Int|
public final companion object Named : R|kotlin/Any| {
private constructor(): R|com/example/WithNamedCompanion.Named| {
super<R|kotlin/Any|>()
}
public final fun foo(): R|kotlin/String| {
^foo String(OK)
}
public final fun serializer(): R|kotlinx/serialization/KSerializer<com/example/WithNamedCompanion>|
}
public final operator fun component1(): R|kotlin/Int|
public final fun copy(i: R|kotlin/Int| = this@R|com/example/WithNamedCompanion|.R|com/example/WithNamedCompanion.i|): R|com/example/WithNamedCompanion|
public final object $serializer : R|kotlinx/serialization/internal/GeneratedSerializer<com/example/WithNamedCompanion>| {
public final fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|com/example/WithNamedCompanion|): R|kotlin/Unit|
public final fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|com/example/WithNamedCompanion|
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|com/example/WithNamedCompanion.$serializer|
}
}
public final fun box(): R|kotlin/String| {
R|com/example/encodeAndDecode|<R|com/example/WithCompanion|>(Q|com/example/WithCompanion|.R|com/example/WithCompanion.Companion.serializer|(), R|com/example/WithCompanion.WithCompanion|(Int(1)), String({"i":1}))?.{ $subj$.R|kotlin/let|<R|kotlin/String|, R|kotlin/Nothing|>(<L> = let@fun <anonymous>(it: R|kotlin/String|): R|kotlin/Nothing| <inline=Inline, kind=EXACTLY_ONCE> {
^box R|<local>/it|
}
) }
R|com/example/encodeAndDecode|<R|com/example/WithNamedCompanion|>(Q|com/example/WithNamedCompanion|.R|com/example/WithNamedCompanion.Named.serializer|(), R|com/example/WithNamedCompanion.WithNamedCompanion|(Int(2)), String({"i":2}))?.{ $subj$.R|kotlin/let|<R|kotlin/String|, R|kotlin/Nothing|>(<L> = let@fun <anonymous>(it: R|kotlin/String|): R|kotlin/Nothing| <inline=Inline, kind=EXACTLY_ONCE> {
^box R|<local>/it|
}
) }
when () {
!=(Q|com/example/NonSerializable|.R|com/example/NonSerializable.Companion.foo|(), String(OK)) -> {
^box Q|com/example/NonSerializable|.R|com/example/NonSerializable.Companion.foo|()
}
}
when () {
!=(Q|com/example/WithCompanion|.R|com/example/WithCompanion.Companion.foo|(), String(OK)) -> {
^box Q|com/example/WithCompanion|.R|com/example/WithCompanion.Companion.foo|()
}
}
when () {
!=(Q|com/example/WithNamedCompanion|.R|com/example/WithNamedCompanion.Named.foo|(), String(OK)) -> {
^box Q|com/example/WithNamedCompanion|.R|com/example/WithNamedCompanion.Named.foo|()
}
}
^box String(OK)
}
private final fun <T> encodeAndDecode(serializer: R|kotlinx/serialization/KSerializer<T>|, value: R|T|, expectedEncoded: R|kotlin/String|, expectedDecoded: R|T?| = Null(null)): R|kotlin/String?| {
lval encoded: R|kotlin/String| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.encodeToString|<R|T|>(R|<local>/serializer|, R|<local>/value|)
when () {
!=(R|<local>/encoded|, R|<local>/expectedEncoded|) -> {
^encodeAndDecode R|<local>/encoded|
}
}
lval decoded: R|T| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.decodeFromString|<R|T|>(R|<local>/serializer|, R|<local>/encoded|)
when () {
!=(R|<local>/decoded|, R|<local>/expectedDecoded| ?: R|<local>/value|) -> {
^encodeAndDecode <strcat>(String(DECODED=), R|<local>/decoded|.R|kotlin/toString|())
}
}
^encodeAndDecode Null(null)
}
@@ -0,0 +1,56 @@
// WITH_STDLIB
package com.example
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import kotlinx.serialization.encoding.*
import kotlinx.serialization.descriptors.*
class NonSerializable {
companion object {
fun foo(): String {
return "OK"
}
}
}
@Serializable
data class WithCompanion(val i: Int) {
companion object {
fun foo(): String {
return "OK"
}
}
}
@Serializable
data class WithNamedCompanion(val i: Int) {
companion object Named {
fun foo(): String {
return "OK"
}
}
}
fun box(): String {
encodeAndDecode(WithCompanion.serializer(), WithCompanion(1), """{"i":1}""")?.let { return it }
encodeAndDecode(WithNamedCompanion.serializer(), WithNamedCompanion(2), """{"i":2}""")?.let { return it }
if (NonSerializable.foo() != "OK") return NonSerializable.foo()
if (WithCompanion.foo() != "OK") return WithCompanion.foo()
if (WithNamedCompanion.foo() != "OK") return WithNamedCompanion.foo()
return "OK"
}
private fun <T> encodeAndDecode(serializer: KSerializer<T>, value: T, expectedEncoded: String, expectedDecoded: T? = null): String? {
val encoded = Json.encodeToString(serializer, value)
if (encoded != expectedEncoded) return encoded
val decoded = Json.decodeFromString(serializer, encoded)
if (decoded != (expectedDecoded ?: value)) return "DECODED=${decoded.toString()}"
return null
}
@@ -1,8 +1,7 @@
FILE: serializerViaCompanion.kt
@FILE:R|kotlin/Suppress|(names = vararg(String(COMPANION_OBJECT_AS_CUSTOM_SERIALIZER_DEPRECATED)))
package com.example
@R|kotlinx/serialization/Serializable|() public final data class WithCompanion : R|kotlin/Any| {
@R|kotlinx/serialization/Serializable|(with = <getClass>(Q|com/example/WithCompanion.Companion|)) public final data class WithCompanion : R|kotlin/Any| {
public constructor(i: R|kotlin/Int|): R|com/example/WithCompanion| {
super<R|kotlin/Any|>()
}
@@ -31,7 +30,7 @@ FILE: serializerViaCompanion.kt
public final fun copy(i: R|kotlin/Int| = this@R|com/example/WithCompanion|.R|com/example/WithCompanion.i|): R|com/example/WithCompanion|
}
@R|kotlinx/serialization/Serializable|() public final data class WithNamedCompanion : R|kotlin/Any| {
@R|kotlinx/serialization/Serializable|(with = <getClass>(Q|com/example/WithNamedCompanion.Named|)) public final data class WithNamedCompanion : R|kotlin/Any| {
public constructor(i: R|kotlin/Int|): R|com/example/WithNamedCompanion| {
super<R|kotlin/Any|>()
}
@@ -60,7 +59,7 @@ FILE: serializerViaCompanion.kt
public final fun copy(i: R|kotlin/Int| = this@R|com/example/WithNamedCompanion|.R|com/example/WithNamedCompanion.i|): R|com/example/WithNamedCompanion|
}
@R|kotlinx/serialization/Serializable|() public final data class WithExplicitType : R|kotlin/Any| {
@R|kotlinx/serialization/Serializable|(with = <getClass>(Q|com/example/WithExplicitType.Companion|)) public final data class WithExplicitType : R|kotlin/Any| {
public constructor(i: R|kotlin/Int|): R|com/example/WithExplicitType| {
super<R|kotlin/Any|>()
}
@@ -89,7 +88,7 @@ FILE: serializerViaCompanion.kt
public final fun copy(i: R|kotlin/Int| = this@R|com/example/WithExplicitType|.R|com/example/WithExplicitType.i|): R|com/example/WithExplicitType|
}
@R|kotlinx/serialization/Serializable|() public final data class PartiallyOverridden : R|kotlin/Any| {
@R|kotlinx/serialization/Serializable|(with = <getClass>(Q|com/example/PartiallyOverridden.Companion|)) public final data class PartiallyOverridden : R|kotlin/Any| {
public constructor(i: R|kotlin/Int|): R|com/example/PartiallyOverridden| {
super<R|kotlin/Any|>()
}
@@ -125,7 +124,7 @@ FILE: serializerViaCompanion.kt
public final fun copy(i: R|kotlin/Int| = this@R|com/example/PartiallyOverridden|.R|com/example/PartiallyOverridden.i|): R|com/example/PartiallyOverridden|
}
@R|kotlinx/serialization/Serializable|() public final data class PartiallyWithoutType : R|kotlin/Any| {
@R|kotlinx/serialization/Serializable|(with = <getClass>(Q|com/example/PartiallyWithoutType.Companion|)) public final data class PartiallyWithoutType : R|kotlin/Any| {
public constructor(i: R|kotlin/Int|): R|com/example/PartiallyWithoutType| {
super<R|kotlin/Any|>()
}
@@ -174,7 +173,7 @@ FILE: serializerViaCompanion.kt
public final fun copy(i: R|kotlin/Int| = this@R|com/example/PartiallyWithoutType|.R|com/example/PartiallyWithoutType.i|): R|com/example/PartiallyWithoutType|
}
@R|kotlinx/serialization/Serializable|() public final data class FullyOverridden : R|kotlin/Any| {
@R|kotlinx/serialization/Serializable|(with = <getClass>(Q|com/example/FullyOverridden.Companion|)) public final data class FullyOverridden : R|kotlin/Any| {
public constructor(i: R|kotlin/Int|): R|com/example/FullyOverridden| {
super<R|kotlin/Any|>()
}
@@ -1,7 +1,5 @@
// WITH_STDLIB
// !DIAGNOSTICS: -COMPANION_OBJECT_AS_CUSTOM_SERIALIZER_DEPRECATED
@file:Suppress("COMPANION_OBJECT_AS_CUSTOM_SERIALIZER_DEPRECATED")
package com.example
import kotlinx.serialization.*
@@ -10,25 +8,25 @@ import kotlinx.serialization.encoding.*
import kotlinx.serialization.descriptors.*
@Serializable
@Serializable(WithCompanion.Companion::class)
data class WithCompanion(val i: Int) {
@Serializer(forClass = WithCompanion::class)
companion object
}
@Serializable
@Serializable(WithNamedCompanion.Named::class)
data class WithNamedCompanion(val i: Int) {
@Serializer(forClass = WithNamedCompanion::class)
companion object Named
}
@Serializable
@Serializable(WithExplicitType.Companion::class)
data class WithExplicitType(val i: Int) {
@Serializer(forClass = WithExplicitType::class)
companion object : KSerializer<WithExplicitType>
}
@Serializable
@Serializable(PartiallyOverridden.Companion::class)
data class PartiallyOverridden(val i: Int) {
@Serializer(forClass = PartiallyOverridden::class)
companion object : KSerializer<PartiallyOverridden> {
@@ -44,7 +42,7 @@ data class PartiallyOverridden(val i: Int) {
}
}
@Serializable
@Serializable(PartiallyWithoutType.Companion::class)
data class PartiallyWithoutType(val i: Int) {
@Serializer(forClass = PartiallyWithoutType::class)
companion object {
@@ -66,7 +64,7 @@ data class PartiallyWithoutType(val i: Int) {
}
@Serializable
@Serializable(FullyOverridden.Companion::class)
data class FullyOverridden(val i: Int) {
@Serializer(forClass = FullyOverridden::class)
companion object : KSerializer<FullyOverridden> {