• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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