Added support of named companion in serializable class to the FIR
Merge-request: KT-MR-7472
This commit is contained in:
committed by
Space Team
parent
8d8d0d9922
commit
d4cfb002d0
+8
-6
@@ -61,7 +61,7 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
|
||||
with(session) {
|
||||
if (classSymbol.shouldHaveGeneratedMethodsInCompanion && !classSymbol.isSerializableObject)
|
||||
result += SpecialNames.DEFAULT_NAME_FOR_COMPANION_OBJECT
|
||||
if (classSymbol.shouldHaveGeneratedSerializer && !classSymbol.hasCompanionObjectAsSerializer)
|
||||
if (classSymbol.shouldHaveGeneratedSerializer && !classSymbol.isInternallySerializableObject)
|
||||
result += SerialEntityNames.SERIALIZER_CLASS_NAME
|
||||
}
|
||||
|
||||
@@ -85,12 +85,14 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
|
||||
val classId = classSymbol.classId
|
||||
val result = mutableSetOf<Name>()
|
||||
|
||||
val origin = classSymbol.origin as? FirDeclarationOrigin.Plugin
|
||||
|
||||
val isExternalSerializer = classSymbol.isExternalSerializer
|
||||
when {
|
||||
classSymbol.isCompanion && origin?.key == SerializationPluginKey -> {
|
||||
result += SpecialNames.INIT
|
||||
classSymbol.isCompanion && !isExternalSerializer -> {
|
||||
result += SerialEntityNames.SERIALIZER_PROVIDER_NAME
|
||||
val origin = classSymbol.origin as? FirDeclarationOrigin.Plugin
|
||||
if (origin?.key == SerializationPluginKey) {
|
||||
result += SpecialNames.INIT
|
||||
}
|
||||
}
|
||||
|
||||
classId.shortClassName == SerialEntityNames.SERIALIZER_CLASS_NAME -> {
|
||||
@@ -110,7 +112,7 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
|
||||
}
|
||||
}
|
||||
|
||||
classSymbol.isExternalSerializer -> {
|
||||
isExternalSerializer -> {
|
||||
if (classSymbol.declarationSymbols.filterIsInstance<FirPropertySymbol>()
|
||||
.none { it.name == SerialEntityNames.SERIAL_DESC_FIELD_NAME }
|
||||
) {
|
||||
|
||||
-31
@@ -17,7 +17,6 @@ import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlinx.serialization.compiler.fir.services.dependencySerializationInfoProvider
|
||||
@@ -99,11 +98,6 @@ internal val FirClassSymbol<*>.serializerForClass: ConeKotlinType?
|
||||
.getAnnotationByClassId(SerializationAnnotations.serializerAnnotationClassId)
|
||||
?.getKClassArgument(AnnotationParameterNames.FOR_CLASS)
|
||||
|
||||
internal val FirClassSymbol<*>.serializerFor: FirGetClassCall?
|
||||
get() = resolvedAnnotationsWithArguments
|
||||
.getAnnotationByClassId(SerializationAnnotations.serializerAnnotationClassId)
|
||||
?.getGetKClassArgument(AnnotationParameterNames.FOR_CLASS)
|
||||
|
||||
internal val FirClassLikeDeclaration.serializerFor: FirGetClassCall?
|
||||
get() = getAnnotationByClassId(SerializationAnnotations.serializerAnnotationClassId)
|
||||
?.getGetKClassArgument(AnnotationParameterNames.FOR_CLASS)
|
||||
@@ -164,31 +158,12 @@ context(FirSession)
|
||||
internal val FirClassSymbol<*>.isSerializableEnum: Boolean
|
||||
get() = classKind.isEnumClass && hasSerializableOrMetaAnnotation
|
||||
|
||||
/**
|
||||
* Check that class is enum and marked by `Serializable` annotation without serializer argument or meta-serializable annotation.
|
||||
*/
|
||||
context(FirSession)
|
||||
@Suppress("IncorrectFormatting") // KTIJ-22227
|
||||
internal val FirClassSymbol<*>.isSerializableEnumWithoutArgs: Boolean
|
||||
get() = classKind.isEnumClass && hasSerializableOrMetaAnnotationWithoutArgs
|
||||
|
||||
internal fun FirClassSymbol<*>.isFinalOrOpen(): Boolean {
|
||||
val modality = rawStatus.modality
|
||||
// null means default modality, final
|
||||
return (modality == null || modality == Modality.FINAL || modality == Modality.OPEN)
|
||||
}
|
||||
|
||||
context(FirSession)
|
||||
@Suppress("IncorrectFormatting") // KTIJ-22227
|
||||
val FirClassSymbol<*>.hasCompanionObjectAsSerializer: Boolean
|
||||
get() = isInternallySerializableObject || hasCustomSerializerOnCompanion
|
||||
|
||||
context(FirSession)
|
||||
@Suppress("IncorrectFormatting") // KTIJ-22227
|
||||
val FirClassSymbol<*>.hasCustomSerializerOnCompanion: Boolean
|
||||
// TODO It was accepted that the annotation on the companion can take only the current class as an argument. Before the release of FIR, we need to add a new annotation and check gere for its presence
|
||||
get() = (this as? FirRegularClassSymbol)?.companionObjectSymbol?.serializerFor != null
|
||||
|
||||
context(FirSession)
|
||||
val FirClassSymbol<*>.isEnumWithLegacyGeneratedSerializer: Boolean
|
||||
get() = classKind.isEnumClass && dependencySerializationInfoProvider.useGeneratedEnumSerializer && hasSerializableOrMetaAnnotationWithoutArgs
|
||||
@@ -197,12 +172,6 @@ context(FirSession)
|
||||
val FirClassSymbol<*>.shouldHaveGeneratedSerializer: Boolean
|
||||
get() = (isInternalSerializable && isFinalOrOpen()) || isEnumWithLegacyGeneratedSerializer
|
||||
|
||||
context(FirSession)
|
||||
@Suppress("IncorrectFormatting") // KTIJ-22227
|
||||
internal fun FirClassSymbol<*>.shouldHaveGeneratedSerializer(useGeneratedEnumSerializer: Boolean): Boolean {
|
||||
return (isInternalSerializable && isFinalOrOpen()) || (useGeneratedEnumSerializer && isSerializableEnumWithoutArgs)
|
||||
}
|
||||
|
||||
// ---------------------- type utils ----------------------
|
||||
|
||||
val ConeKotlinType.isKSerializer: Boolean
|
||||
|
||||
+1
-1
@@ -352,7 +352,7 @@ object FirSerializationPluginClassChecker : FirClassChecker() {
|
||||
with(session) {
|
||||
if (!classSymbol.hasSerializableOrMetaAnnotation) return null
|
||||
if (!classSymbol.isInternalSerializable) return null
|
||||
if (classSymbol.hasCompanionObjectAsSerializer) return null
|
||||
if (classSymbol.isInternallySerializableObject) return null
|
||||
}
|
||||
|
||||
val properties = session.serializablePropertiesProvider.getSerializablePropertiesForClass(classSymbol)
|
||||
|
||||
+2
-2
@@ -48,7 +48,7 @@ internal val FirClassSymbol<*>?.classSerializer: FirClassSymbol<*>?
|
||||
// serializer annotation on class?
|
||||
serializableWith?.let { return it.toRegularClassSymbol(session) }
|
||||
// companion object serializer?
|
||||
if (this is FirRegularClassSymbol && with(session) { hasCompanionObjectAsSerializer }) return companionObjectSymbol
|
||||
if (this is FirRegularClassSymbol && with(session) { isInternallySerializableObject }) return companionObjectSymbol
|
||||
// can infer @Poly?
|
||||
polymorphicSerializerIfApplicableAutomatically?.let { return it }
|
||||
// default serializable?
|
||||
@@ -147,7 +147,7 @@ internal val FirClassSymbol<*>.serializableAnnotationIsUseless: Boolean
|
||||
get() = !classKind.isEnumClass &&
|
||||
hasSerializableOrMetaAnnotationWithoutArgs &&
|
||||
!isInternalSerializable &&
|
||||
!hasCompanionObjectAsSerializer &&
|
||||
!isInternallySerializableObject &&
|
||||
!isSealedSerializableInterface
|
||||
|
||||
// ---------------------- type utils ----------------------
|
||||
|
||||
+146
@@ -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)
|
||||
}
|
||||
+56
@@ -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
|
||||
}
|
||||
+6
-7
@@ -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|>()
|
||||
}
|
||||
|
||||
+6
-8
@@ -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> {
|
||||
|
||||
+6
@@ -205,6 +205,12 @@ public class SerializationFirBlackBoxTestGenerated extends AbstractSerialization
|
||||
runTest("plugins/kotlinx-serialization/testData/firMembers/serializableWith.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("serializableWithCompanion.kt")
|
||||
public void testSerializableWithCompanion() throws Exception {
|
||||
runTest("plugins/kotlinx-serialization/testData/firMembers/serializableWithCompanion.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("serializerViaCompanion.kt")
|
||||
public void testSerializerViaCompanion() throws Exception {
|
||||
|
||||
+6
@@ -222,6 +222,12 @@ public class SerializationFirDiagnosticTestGenerated extends AbstractSerializati
|
||||
runTest("plugins/kotlinx-serialization/testData/firMembers/serializableWith.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("serializableWithCompanion.kt")
|
||||
public void testSerializableWithCompanion() throws Exception {
|
||||
runTest("plugins/kotlinx-serialization/testData/firMembers/serializableWithCompanion.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("serializerViaCompanion.kt")
|
||||
public void testSerializerViaCompanion() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user