1 /*
2 * Copyright 2017-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3 */
4
5 @file:Suppress("FunctionName")
6 @file:OptIn(ExperimentalSerializationApi::class)
7
8 package kotlinx.serialization.internal
9
10 import kotlinx.serialization.*
11 import kotlinx.serialization.builtins.*
12 import kotlinx.serialization.descriptors.*
13 import kotlinx.serialization.encoding.*
14 import kotlin.reflect.*
15 import kotlin.time.Duration
16 import kotlin.uuid.*
17
18 private val BUILTIN_SERIALIZERS = initBuiltins()
19
initBuiltinsnull20 internal expect fun initBuiltins(): Map<KClass<*>, KSerializer<*>>
21
22 internal class PrimitiveSerialDescriptor(
23 override val serialName: String,
24 override val kind: PrimitiveKind
25 ) : SerialDescriptor {
26 override val elementsCount: Int get() = 0
27 override fun getElementName(index: Int): String = error()
28 override fun getElementIndex(name: String): Int = error()
29 override fun isElementOptional(index: Int): Boolean = error()
30 override fun getElementDescriptor(index: Int): SerialDescriptor = error()
31 override fun getElementAnnotations(index: Int): List<Annotation> = error()
32 override fun toString(): String = "PrimitiveDescriptor($serialName)"
33 override fun equals(other: Any?): Boolean {
34 if (this === other) return true
35 if (other !is PrimitiveSerialDescriptor) return false
36 if (serialName == other.serialName && kind == other.kind) return true
37 return false
38 }
39 override fun hashCode() = serialName.hashCode() + 31 * kind.hashCode()
40 private fun error(): Nothing = throw IllegalStateException("Primitive descriptor does not have elements")
41 }
42
PrimitiveDescriptorSafenull43 internal fun PrimitiveDescriptorSafe(serialName: String, kind: PrimitiveKind): SerialDescriptor {
44 checkName(serialName)
45 return PrimitiveSerialDescriptor(serialName, kind)
46 }
47
checkNamenull48 private fun checkName(serialName: String) {
49 val values = BUILTIN_SERIALIZERS.values
50 for (primitive in values) {
51 val primitiveName = primitive.descriptor.serialName
52 if (serialName == primitiveName) {
53 throw IllegalArgumentException("""
54 The name of serial descriptor should uniquely identify associated serializer.
55 For serial name $serialName there already exists ${primitive::class.simpleName}.
56 Please refer to SerialDescriptor documentation for additional information.
57 """.trimIndent())
58 }
59 }
60 }
61
<lambda>null62 private fun String.capitalize() = replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
63
64 @Suppress("UNCHECKED_CAST")
builtinSerializerOrNullnull65 internal fun <T : Any> KClass<T>.builtinSerializerOrNull(): KSerializer<T>? =
66 BUILTIN_SERIALIZERS[this] as KSerializer<T>?
67
68 @PublishedApi
69 internal object UnitSerializer : KSerializer<Unit> by ObjectSerializer("kotlin.Unit", Unit)
70
71 @PublishedApi
72 internal object BooleanSerializer : KSerializer<Boolean> {
73 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("kotlin.Boolean", PrimitiveKind.BOOLEAN)
74 override fun serialize(encoder: Encoder, value: Boolean): Unit = encoder.encodeBoolean(value)
75 override fun deserialize(decoder: Decoder): Boolean = decoder.decodeBoolean()
76 }
77
78 @PublishedApi
79 internal object ByteSerializer : KSerializer<Byte> {
80 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("kotlin.Byte", PrimitiveKind.BYTE)
serializenull81 override fun serialize(encoder: Encoder, value: Byte): Unit = encoder.encodeByte(value)
82 override fun deserialize(decoder: Decoder): Byte = decoder.decodeByte()
83 }
84
85 @PublishedApi
86 internal object ShortSerializer : KSerializer<Short> {
87 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("kotlin.Short", PrimitiveKind.SHORT)
88 override fun serialize(encoder: Encoder, value: Short): Unit = encoder.encodeShort(value)
89 override fun deserialize(decoder: Decoder): Short = decoder.decodeShort()
90 }
91
92 @PublishedApi
93 internal object IntSerializer : KSerializer<Int> {
94 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("kotlin.Int", PrimitiveKind.INT)
serializenull95 override fun serialize(encoder: Encoder, value: Int): Unit = encoder.encodeInt(value)
96 override fun deserialize(decoder: Decoder): Int = decoder.decodeInt()
97 }
98
99 @PublishedApi
100 internal object LongSerializer : KSerializer<Long> {
101 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("kotlin.Long", PrimitiveKind.LONG)
102 override fun serialize(encoder: Encoder, value: Long): Unit = encoder.encodeLong(value)
103 override fun deserialize(decoder: Decoder): Long = decoder.decodeLong()
104 }
105
106 @PublishedApi
107 internal object FloatSerializer : KSerializer<Float> {
108 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("kotlin.Float", PrimitiveKind.FLOAT)
serializenull109 override fun serialize(encoder: Encoder, value: Float): Unit = encoder.encodeFloat(value)
110 override fun deserialize(decoder: Decoder): Float = decoder.decodeFloat()
111 }
112
113 @PublishedApi
114 internal object DoubleSerializer : KSerializer<Double> {
115 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("kotlin.Double", PrimitiveKind.DOUBLE)
116 override fun serialize(encoder: Encoder, value: Double): Unit = encoder.encodeDouble(value)
117 override fun deserialize(decoder: Decoder): Double = decoder.decodeDouble()
118 }
119
120 @PublishedApi
121 internal object CharSerializer : KSerializer<Char> {
122 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("kotlin.Char", PrimitiveKind.CHAR)
serializenull123 override fun serialize(encoder: Encoder, value: Char): Unit = encoder.encodeChar(value)
124 override fun deserialize(decoder: Decoder): Char = decoder.decodeChar()
125 }
126
127 @PublishedApi
128 internal object StringSerializer : KSerializer<String> {
129 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("kotlin.String", PrimitiveKind.STRING)
130 override fun serialize(encoder: Encoder, value: String): Unit = encoder.encodeString(value)
131 override fun deserialize(decoder: Decoder): String = decoder.decodeString()
132 }
133