From 662bff73519d5bd8e46ad353b665e897a1f382e1 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Thu, 23 Nov 2023 15:40:17 +0100 Subject: [PATCH] Make $serializer generic constructor public If a serializable class has generic type parameters, its serializer is not an object and has a specialized constructor. This constructor was public in K1 and should be public in K2 so it can be called from other serializable classes (in case class is e.g., part of sealed hierarchy). #KT-63402 Fixed --- .../fir/SerializationFirResolveExtension.kt | 2 +- .../testData/boxIr/sealedClassMultifile.kt | 28 +++++++++++++++++++ .../testData/codegen/Intrinsics.asm.fir.txt | 4 +-- .../classWithGenericParameters.fir.txt | 2 +- ...tionFirLightTreeBlackBoxTestGenerated.java | 6 ++++ .../SerializationIrBoxTestGenerated.java | 6 ++++ 6 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 plugins/kotlinx-serialization/testData/boxIr/sealedClassMultifile.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 800c50eb4cf..bc809809f83 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 @@ -260,7 +260,7 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene if (owner.name == SerialEntityNames.SERIALIZER_CLASS_NAME && owner.typeParameterSymbols.isNotEmpty()) { result += createConstructor(owner, SerializationPluginKey) { - visibility = Visibilities.Private + visibility = Visibilities.Public owner.typeParameterSymbols.forEachIndexed { i, typeParam -> valueParameter( name = Name.identifier("${SerialEntityNames.typeArgPrefix}$i"), diff --git a/plugins/kotlinx-serialization/testData/boxIr/sealedClassMultifile.kt b/plugins/kotlinx-serialization/testData/boxIr/sealedClassMultifile.kt new file mode 100644 index 00000000000..d554f766caf --- /dev/null +++ b/plugins/kotlinx-serialization/testData/boxIr/sealedClassMultifile.kt @@ -0,0 +1,28 @@ +// TARGET_BACKEND: JVM_IR + +// WITH_STDLIB + +// FILE: a.kt + +import kotlinx.serialization.* + +@Serializable +sealed class Base { + abstract val id: Long +} + +// FILE: b.kt + +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.* + +@Serializable +class DerivedOtherFile( + override val id: Long, + val value: Value +) : Base() + +fun box(): String { + val desc = Base.serializer().descriptor.kind + return if (desc == PolymorphicKind.SEALED) "OK" else desc.toString() +} diff --git a/plugins/kotlinx-serialization/testData/codegen/Intrinsics.asm.fir.txt b/plugins/kotlinx-serialization/testData/codegen/Intrinsics.asm.fir.txt index 4d9aa952e46..119dac4cc1b 100644 --- a/plugins/kotlinx-serialization/testData/codegen/Intrinsics.asm.fir.txt +++ b/plugins/kotlinx-serialization/testData/codegen/Intrinsics.asm.fir.txt @@ -5,9 +5,7 @@ public final class Box$$serializer : java/lang/Object, kotlinx/serialization/int private void () - private void (kotlinx.serialization.KSerializer typeSerial0) - - public void (kotlinx.serialization.KSerializer typeSerial0, kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker) + public void (kotlinx.serialization.KSerializer typeSerial0) public final kotlinx.serialization.KSerializer[] childSerializers() diff --git a/plugins/kotlinx-serialization/testData/firMembers/classWithGenericParameters.fir.txt b/plugins/kotlinx-serialization/testData/firMembers/classWithGenericParameters.fir.txt index 8bff876c723..3b166ea3cf4 100644 --- a/plugins/kotlinx-serialization/testData/firMembers/classWithGenericParameters.fir.txt +++ b/plugins/kotlinx-serialization/testData/firMembers/classWithGenericParameters.fir.txt @@ -38,7 +38,7 @@ FILE: classWithGenericParameters.kt super() } - private constructor(typeSerial0: R|kotlinx/serialization/KSerializer|, typeSerial1: R|kotlinx/serialization/KSerializer|): R|GenericBox.$serializer| + public constructor(typeSerial0: R|kotlinx/serialization/KSerializer|, typeSerial1: R|kotlinx/serialization/KSerializer|): R|GenericBox.$serializer| } diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java index f50cad2efa8..41297a542be 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java @@ -213,6 +213,12 @@ public class SerializationFirLightTreeBlackBoxTestGenerated extends AbstractSeri runTest("plugins/kotlinx-serialization/testData/boxIr/repeatableSerialInfo.kt"); } + @Test + @TestMetadata("sealedClassMultifile.kt") + public void testSealedClassMultifile() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/sealedClassMultifile.kt"); + } + @Test @TestMetadata("sealedInterfaces.kt") public void testSealedInterfaces() throws Exception { diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java index 509b3d6af41..1bdd3359aef 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java @@ -211,6 +211,12 @@ public class SerializationIrBoxTestGenerated extends AbstractSerializationIrBoxT runTest("plugins/kotlinx-serialization/testData/boxIr/repeatableSerialInfo.kt"); } + @Test + @TestMetadata("sealedClassMultifile.kt") + public void testSealedClassMultifile() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/sealedClassMultifile.kt"); + } + @Test @TestMetadata("sealedInterfaces.kt") public void testSealedInterfaces() throws Exception {