1 /*
2  * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3  */
4 
5 package kotlinx.serialization.internal
6 
7 import kotlinx.serialization.*
8 import kotlin.reflect.*
9 
10 @Suppress("NOTHING_TO_INLINE")
getCheckednull11 internal actual inline fun <T> Array<T>.getChecked(index: Int): T {
12     return get(index)
13 }
14 
15 @Suppress("NOTHING_TO_INLINE")
getCheckednull16 internal actual inline fun BooleanArray.getChecked(index: Int): Boolean {
17     return get(index)
18 }
19 
platformSpecificSerializerNotRegisterednull20 internal actual fun KClass<*>.platformSpecificSerializerNotRegistered(): Nothing {
21     throw SerializationException(
22         notRegisteredMessage() +
23             "To get enum serializer on Kotlin/Native, it should be annotated with @Serializable annotation.\n" +
24             "To get interface serializer on Kotlin/Native, use PolymorphicSerializer() constructor function.\n"
25     )
26 }
27 
28 @Suppress(
29     "UNCHECKED_CAST",
30     "DEPRECATION_ERROR"
31 )
32 @OptIn(ExperimentalAssociatedObjects::class)
constructSerializerForGivenTypeArgsnull33 internal actual fun <T : Any> KClass<T>.constructSerializerForGivenTypeArgs(vararg args: KSerializer<Any?>): KSerializer<T>? =
34     when (val assocObject = findAssociatedObject<SerializableWith>()) {
35         is KSerializer<*> -> assocObject as KSerializer<T>
36         is kotlinx.serialization.internal.SerializerFactory -> assocObject.serializer(*args) as KSerializer<T>
37         else -> null
38     }
39 
40 @Suppress("DEPRECATION_ERROR")
compiledSerializerImplnull41 internal actual fun <T : Any> KClass<T>.compiledSerializerImpl(): KSerializer<T>? =
42     this.constructSerializerForGivenTypeArgs()
43 
44 
45 internal actual fun <T> createCache(factory: (KClass<*>) -> KSerializer<T>?): SerializerCache<T> {
46     return object: SerializerCache<T> {
47         override fun get(key: KClass<Any>): KSerializer<T>? {
48             return factory(key)
49         }
50     }
51 }
52 
createParametrizedCachenull53 internal actual fun <T> createParametrizedCache(factory: (KClass<Any>, List<KType>) -> KSerializer<T>?): ParametrizedSerializerCache<T> {
54     return object: ParametrizedSerializerCache<T> {
55         override fun get(key: KClass<Any>, types: List<KType>): Result<KSerializer<T>?> {
56             return kotlin.runCatching { factory(key, types) }
57         }
58     }
59 }
60 
toNativeArrayImplnull61 internal actual fun <T : Any, E : T?> ArrayList<E>.toNativeArrayImpl(eClass: KClass<T>): Array<E> {
62     val result = arrayOfAnyNulls<E>(size)
63     var index = 0
64     for (element in this) result[index++] = element
65     @Suppress("USELESS_CAST")
66     return result as Array<E>
67 }
68 
69 @Suppress("UNCHECKED_CAST")
arrayOfAnyNullsnull70 private fun <T> arrayOfAnyNulls(size: Int): Array<T> = arrayOfNulls<Any>(size) as Array<T>
71 
72 internal actual fun isReferenceArray(rootClass: KClass<Any>): Boolean = rootClass == Array::class
73