@@ -28,24 +28,34 @@ internal actual fun <T : Any, E : T?> ArrayList<E>.toNativeArrayImpl(eClass: KCl
28
28
29
29
internal actual fun KClass <* >.platformSpecificSerializerNotRegistered (): Nothing = serializerNotRegistered()
30
30
31
- @Suppress(" UNCHECKED_CAST" )
31
+ internal fun Class <* >.serializerNotRegistered (): Nothing {
32
+ throw SerializationException (
33
+ " Serializer for class '${simpleName} ' is not found.\n " +
34
+ " Mark the class as @Serializable or provide the serializer explicitly."
35
+ )
36
+ }
37
+
32
38
internal actual fun <T : Any > KClass<T>.constructSerializerForGivenTypeArgs (vararg args : KSerializer <Any ?>): KSerializer <T >? {
33
- val jClass = this .java
34
- if (jClass.isEnum && jClass.isNotAnnotated()) {
35
- return jClass.createEnumSerializer()
39
+ return java.constructSerializerForGivenTypeArgs(* args)
40
+ }
41
+
42
+ @Suppress(" UNCHECKED_CAST" )
43
+ internal fun <T : Any > Class<T>.constructSerializerForGivenTypeArgs (vararg args : KSerializer <Any ?>): KSerializer <T >? {
44
+ if (isEnum && isNotAnnotated()) {
45
+ return createEnumSerializer()
36
46
}
37
- if (jClass. isInterface) {
47
+ if (isInterface) {
38
48
return interfaceSerializer()
39
49
}
40
50
// Search for serializer defined on companion object.
41
- val serializer = invokeSerializerOnCompanion<T >(jClass , * args)
51
+ val serializer = invokeSerializerOnCompanion<T >(this , * args)
42
52
if (serializer != null ) return serializer
43
53
// Check whether it's serializable object
44
- findObjectSerializer(jClass )?.let { return it }
54
+ findObjectSerializer()?.let { return it }
45
55
// Search for default serializer if no serializer is defined in companion object.
46
56
// It is required for named companions
47
57
val fromNamedCompanion = try {
48
- jClass. declaredClasses.singleOrNull { it.simpleName == (" \$ serializer" ) }
58
+ declaredClasses.singleOrNull { it.simpleName == (" \$ serializer" ) }
49
59
?.getField(" INSTANCE" )?.get(null ) as ? KSerializer <T >
50
60
} catch (e: NoSuchFieldException ) {
51
61
null
@@ -63,31 +73,30 @@ private fun <T: Any> Class<T>.isNotAnnotated(): Boolean {
63
73
getAnnotation(Polymorphic ::class .java) == null
64
74
}
65
75
66
- private fun <T : Any > KClass <T>.polymorphicSerializer (): KSerializer <T >? {
76
+ private fun <T : Any > Class <T>.polymorphicSerializer (): KSerializer <T >? {
67
77
/*
68
78
* Last resort: check for @Polymorphic or Serializable(with = PolymorphicSerializer::class)
69
79
* annotations.
70
80
*/
71
- val jClass = java
72
- if (jClass.getAnnotation(Polymorphic ::class .java) != null ) {
73
- return PolymorphicSerializer (this )
81
+ if (getAnnotation(Polymorphic ::class .java) != null ) {
82
+ return PolymorphicSerializer (this .kotlin)
74
83
}
75
- val serializable = jClass. getAnnotation(Serializable ::class .java)
84
+ val serializable = getAnnotation(Serializable ::class .java)
76
85
if (serializable != null && serializable.with == PolymorphicSerializer ::class ) {
77
- return PolymorphicSerializer (this )
86
+ return PolymorphicSerializer (this .kotlin )
78
87
}
79
88
return null
80
89
}
81
90
82
- private fun <T : Any > KClass <T>.interfaceSerializer (): KSerializer <T >? {
91
+ private fun <T : Any > Class <T>.interfaceSerializer (): KSerializer <T >? {
83
92
/*
84
93
* Interfaces are @Polymorphic by default.
85
94
* Check if it has no annotations or `@Serializable(with = PolymorphicSerializer::class)`,
86
95
* otherwise bailout.
87
96
*/
88
- val serializable = java. getAnnotation(Serializable ::class .java)
97
+ val serializable = getAnnotation(Serializable ::class .java)
89
98
if (serializable == null || serializable.with == PolymorphicSerializer ::class ) {
90
- return PolymorphicSerializer (this )
99
+ return PolymorphicSerializer (this .kotlin )
91
100
}
92
101
return null
93
102
}
@@ -122,15 +131,15 @@ private fun <T : Any> Class<T>.createEnumSerializer(): KSerializer<T>? {
122
131
return EnumSerializer (canonicalName, constants as Array <out Enum <* >>) as ? KSerializer <T >
123
132
}
124
133
125
- private fun <T : Any > findObjectSerializer ( jClass : Class <T >): KSerializer <T >? {
134
+ private fun <T : Any > Class<T>. findObjectSerializer ( ): KSerializer <T >? {
126
135
// Check it is an object without using kotlin-reflect
127
136
val field =
128
- jClass. declaredFields.singleOrNull { it.name == " INSTANCE" && it.type == jClass && Modifier .isStatic(it.modifiers) }
137
+ declaredFields.singleOrNull { it.name == " INSTANCE" && it.type == this && Modifier .isStatic(it.modifiers) }
129
138
? : return null
130
139
// Retrieve its instance and call serializer()
131
140
val instance = field.get(null )
132
141
val method =
133
- jClass. methods.singleOrNull { it.name == " serializer" && it.parameterTypes.isEmpty() && it.returnType == KSerializer ::class .java }
142
+ methods.singleOrNull { it.name == " serializer" && it.parameterTypes.isEmpty() && it.returnType == KSerializer ::class .java }
134
143
? : return null
135
144
val result = method.invoke(instance)
136
145
@Suppress(" UNCHECKED_CAST" )
0 commit comments