From 9586bf74e0c3c5ca5556f3319b8561b6f1ea29cc Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Wed, 16 Nov 2022 14:51:29 +0100 Subject: [PATCH] Use .fullyExpandedType to get serializable annotation from inside typealias to correctly handle 'global customization via typealias' feature in K2 serialization plugin. --- .../services/ContextualSerializersProvider.kt | 3 +- .../testData/boxIr/typealiasesTest.kt | 44 +++++++++++++++++++ ...SerializationFirBlackBoxTestGenerated.java | 6 +++ .../SerializationIrBoxTestGenerated.java | 6 +++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 plugins/kotlinx-serialization/testData/boxIr/typealiasesTest.kt diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/services/ContextualSerializersProvider.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/services/ContextualSerializersProvider.kt index a8f8d1c34e0..44eed55b020 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/services/ContextualSerializersProvider.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/services/ContextualSerializersProvider.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.hasAnnotation import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.extensions.FirExtensionSessionComponent +import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.types.* @@ -77,7 +78,7 @@ val FirSession.contextualSerializersProvider: ContextualSerializersProvider by F context(CheckerContext) fun findTypeSerializerOrContextUnchecked(type: ConeKotlinType): FirClassSymbol<*>? { if (type.isTypeParameter) return null - val annotations = type.customAnnotations + val annotations = type.fullyExpandedType(session).customAnnotations annotations.serializableWith?.let { return it.toRegularClassSymbol(session) } val classSymbol = type.toRegularClassSymbol(session) ?: return null val currentFile = currentFile diff --git a/plugins/kotlinx-serialization/testData/boxIr/typealiasesTest.kt b/plugins/kotlinx-serialization/testData/boxIr/typealiasesTest.kt new file mode 100644 index 00000000000..45cffac7002 --- /dev/null +++ b/plugins/kotlinx-serialization/testData/boxIr/typealiasesTest.kt @@ -0,0 +1,44 @@ +// TARGET_BACKEND: JVM_IR + +// WITH_STDLIB + +import kotlinx.serialization.* +import kotlinx.serialization.json.* +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.encoding.* +import java.util.Date + +class NotSerializable(val i: Int) + +object SerializerB : KSerializer { + override val descriptor: SerialDescriptor + get() = PrimitiveSerialDescriptor("SerializerB", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: NotSerializable) = TODO() + + override fun deserialize(decoder: Decoder): NotSerializable = TODO() +} + +object DateSer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("DateSer", PrimitiveKind.DOUBLE) + + override fun deserialize(decoder: Decoder): Date = TODO() + + override fun serialize(encoder: Encoder, value: Date) = TODO() +} + +typealias S = @Serializable(SerializerB::class) NotSerializable +typealias BS = @Serializable(DateSer::class) Date + +@Serializable +class Foo( + val s: S, + val bs: BS, + val list: List +) + +fun box(): String { + val list = Foo.serializer().descriptor.elementDescriptors.map { it.serialName }.toList() + if (list != listOf("SerializerB", "DateSer", "kotlin.collections.ArrayList")) return list.toString() + return "OK" +} \ No newline at end of file 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 7f7bc7e9d38..1e53da74f9d 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 @@ -128,6 +128,12 @@ public class SerializationFirBlackBoxTestGenerated extends AbstractSerialization public void testStarProjections() throws Exception { runTest("plugins/kotlinx-serialization/testData/boxIr/starProjections.kt"); } + + @Test + @TestMetadata("typealiasesTest.kt") + public void testTypealiasesTest() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/typealiasesTest.kt"); + } } @Nested 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 1dde0cf9edc..ccbd11d761f 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 @@ -126,4 +126,10 @@ public class SerializationIrBoxTestGenerated extends AbstractSerializationIrBoxT public void testStarProjections() throws Exception { runTest("plugins/kotlinx-serialization/testData/boxIr/starProjections.kt"); } + + @Test + @TestMetadata("typealiasesTest.kt") + public void testTypealiasesTest() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/typealiasesTest.kt"); + } }