From d4cfb002d0609b2bb330273743d5b7f5a305db92 Mon Sep 17 00:00:00 2001 From: "Sergey.Shanshin" Date: Thu, 27 Oct 2022 12:48:29 +0000 Subject: [PATCH] Added support of named companion in serializable class to the FIR Merge-request: KT-MR-7472 --- .../fir/SerializationFirResolveExtension.kt | 14 +- .../compiler/fir/SerializationFirUtils.kt | 31 ---- .../FirSerializationPluginClassChecker.kt | 2 +- .../checkers/SerializationFirCheckerUtils.kt | 4 +- .../serializableWithCompanion.fir.txt | 146 ++++++++++++++++++ .../firMembers/serializableWithCompanion.kt | 56 +++++++ .../firMembers/serializerViaCompanion.fir.txt | 13 +- .../firMembers/serializerViaCompanion.kt | 14 +- ...SerializationFirBlackBoxTestGenerated.java | 6 + ...rializationFirDiagnosticTestGenerated.java | 6 + 10 files changed, 237 insertions(+), 55 deletions(-) create mode 100644 plugins/kotlinx-serialization/testData/firMembers/serializableWithCompanion.fir.txt create mode 100644 plugins/kotlinx-serialization/testData/firMembers/serializableWithCompanion.kt diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirResolveExtension.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirResolveExtension.kt index 51eb3323dd7..7fe81d4bef5 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirResolveExtension.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirResolveExtension.kt @@ -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() - 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() .none { it.name == SerialEntityNames.SERIAL_DESC_FIELD_NAME } ) { diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirUtils.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirUtils.kt index 0e43c0bfe31..2a515c136b9 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirUtils.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirUtils.kt @@ -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 diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt index 4e9248d9307..0550df6d443 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt @@ -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) diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/SerializationFirCheckerUtils.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/SerializationFirCheckerUtils.kt index c8c16e4f5bf..71ec1f4e850 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/SerializationFirCheckerUtils.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/SerializationFirCheckerUtils.kt @@ -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 ---------------------- diff --git a/plugins/kotlinx-serialization/testData/firMembers/serializableWithCompanion.fir.txt b/plugins/kotlinx-serialization/testData/firMembers/serializableWithCompanion.fir.txt new file mode 100644 index 00000000000..75ba0e2a5fb --- /dev/null +++ b/plugins/kotlinx-serialization/testData/firMembers/serializableWithCompanion.fir.txt @@ -0,0 +1,146 @@ +FILE: serializableWithCompanion.kt + package com.example + + public final class NonSerializable : R|kotlin/Any| { + public constructor(): R|com/example/NonSerializable| { + super() + } + + public final companion object Companion : R|kotlin/Any| { + private constructor(): R|com/example/NonSerializable.Companion| { + super() + } + + 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() + } + + public final val i: R|kotlin/Int| = R|/i| + public get(): R|kotlin/Int| + + public final companion object Companion : R|kotlin/Any| { + private constructor(): R|com/example/WithCompanion.Companion| { + super() + } + + public final fun foo(): R|kotlin/String| { + ^foo String(OK) + } + + public final fun serializer(): R|kotlinx/serialization/KSerializer| + + } + + 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| { + 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>| + + 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() + } + + public final val i: R|kotlin/Int| = R|/i| + public get(): R|kotlin/Int| + + public final companion object Named : R|kotlin/Any| { + private constructor(): R|com/example/WithNamedCompanion.Named| { + super() + } + + public final fun foo(): R|kotlin/String| { + ^foo String(OK) + } + + public final fun serializer(): R|kotlinx/serialization/KSerializer| + + } + + 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| { + 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>| + + private constructor(): R|com/example/WithNamedCompanion.$serializer| + + } + + } + public final fun box(): R|kotlin/String| { + R|com/example/encodeAndDecode|(Q|com/example/WithCompanion|.R|com/example/WithCompanion.Companion.serializer|(), R|com/example/WithCompanion.WithCompanion|(Int(1)), String({"i":1}))?.{ $subj$.R|kotlin/let|( = let@fun (it: R|kotlin/String|): R|kotlin/Nothing| { + ^box R|/it| + } + ) } + R|com/example/encodeAndDecode|(Q|com/example/WithNamedCompanion|.R|com/example/WithNamedCompanion.Named.serializer|(), R|com/example/WithNamedCompanion.WithNamedCompanion|(Int(2)), String({"i":2}))?.{ $subj$.R|kotlin/let|( = let@fun (it: R|kotlin/String|): R|kotlin/Nothing| { + ^box R|/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 encodeAndDecode(serializer: R|kotlinx/serialization/KSerializer|, 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|/serializer|, R|/value|) + when () { + !=(R|/encoded|, R|/expectedEncoded|) -> { + ^encodeAndDecode R|/encoded| + } + } + + lval decoded: R|T| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.decodeFromString|(R|/serializer|, R|/encoded|) + when () { + !=(R|/decoded|, R|/expectedDecoded| ?: R|/value|) -> { + ^encodeAndDecode (String(DECODED=), R|/decoded|.R|kotlin/toString|()) + } + } + + ^encodeAndDecode Null(null) + } diff --git a/plugins/kotlinx-serialization/testData/firMembers/serializableWithCompanion.kt b/plugins/kotlinx-serialization/testData/firMembers/serializableWithCompanion.kt new file mode 100644 index 00000000000..33ce6f70c2a --- /dev/null +++ b/plugins/kotlinx-serialization/testData/firMembers/serializableWithCompanion.kt @@ -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 encodeAndDecode(serializer: KSerializer, 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 +} diff --git a/plugins/kotlinx-serialization/testData/firMembers/serializerViaCompanion.fir.txt b/plugins/kotlinx-serialization/testData/firMembers/serializerViaCompanion.fir.txt index 624487488ac..7e890c712c5 100644 --- a/plugins/kotlinx-serialization/testData/firMembers/serializerViaCompanion.fir.txt +++ b/plugins/kotlinx-serialization/testData/firMembers/serializerViaCompanion.fir.txt @@ -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 = (Q|com/example/WithCompanion.Companion|)) public final data class WithCompanion : R|kotlin/Any| { public constructor(i: R|kotlin/Int|): R|com/example/WithCompanion| { super() } @@ -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 = (Q|com/example/WithNamedCompanion.Named|)) public final data class WithNamedCompanion : R|kotlin/Any| { public constructor(i: R|kotlin/Int|): R|com/example/WithNamedCompanion| { super() } @@ -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 = (Q|com/example/WithExplicitType.Companion|)) public final data class WithExplicitType : R|kotlin/Any| { public constructor(i: R|kotlin/Int|): R|com/example/WithExplicitType| { super() } @@ -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 = (Q|com/example/PartiallyOverridden.Companion|)) public final data class PartiallyOverridden : R|kotlin/Any| { public constructor(i: R|kotlin/Int|): R|com/example/PartiallyOverridden| { super() } @@ -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 = (Q|com/example/PartiallyWithoutType.Companion|)) public final data class PartiallyWithoutType : R|kotlin/Any| { public constructor(i: R|kotlin/Int|): R|com/example/PartiallyWithoutType| { super() } @@ -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 = (Q|com/example/FullyOverridden.Companion|)) public final data class FullyOverridden : R|kotlin/Any| { public constructor(i: R|kotlin/Int|): R|com/example/FullyOverridden| { super() } diff --git a/plugins/kotlinx-serialization/testData/firMembers/serializerViaCompanion.kt b/plugins/kotlinx-serialization/testData/firMembers/serializerViaCompanion.kt index 05015156959..ee568f86b0c 100644 --- a/plugins/kotlinx-serialization/testData/firMembers/serializerViaCompanion.kt +++ b/plugins/kotlinx-serialization/testData/firMembers/serializerViaCompanion.kt @@ -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 } -@Serializable +@Serializable(PartiallyOverridden.Companion::class) data class PartiallyOverridden(val i: Int) { @Serializer(forClass = PartiallyOverridden::class) companion object : KSerializer { @@ -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 { diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java index 578143a1033..f7d56efe080 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java @@ -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 { diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java index c7957025fa6..9b04b20e661 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java @@ -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 {