@@ -3,14 +3,13 @@ package com.mapk.krowmapper
3
3
import com.mapk.annotations.KColumnDeserializer
4
4
import com.mapk.core.EnumMapper
5
5
import com.mapk.core.KFunctionWithInstance
6
- import com.mapk.core.getAliasOrName
6
+ import com.mapk.core.ValueParameter
7
7
import com.mapk.deserialization.AbstractKColumnDeserializer
8
8
import com.mapk.deserialization.KColumnDeserializeBy
9
9
import java.lang.IllegalArgumentException
10
10
import java.sql.ResultSet
11
11
import kotlin.reflect.KClass
12
12
import kotlin.reflect.KFunction
13
- import kotlin.reflect.KParameter
14
13
import kotlin.reflect.full.companionObjectInstance
15
14
import kotlin.reflect.full.findAnnotation
16
15
import kotlin.reflect.full.functions
@@ -20,78 +19,70 @@ import kotlin.reflect.jvm.isAccessible
20
19
import kotlin.reflect.jvm.jvmName
21
20
22
21
internal sealed class ParameterForMap {
23
- abstract val param: KParameter
24
22
abstract val name: String
25
23
abstract val clazz: Class <* >
26
24
abstract fun getObject (rs : ResultSet ): Any?
27
25
28
26
private class Plain (
29
- override val param : KParameter ,
30
27
override val name : String ,
31
28
override val clazz : Class <* >
32
29
) : ParameterForMap() {
33
30
override fun getObject (rs : ResultSet ): Any? = rs.getObject(name, clazz)
34
31
}
35
32
36
33
private class Enum (
37
- override val param : KParameter ,
38
34
override val name : String ,
39
35
override val clazz : Class <* >
40
36
) : ParameterForMap() {
41
37
override fun getObject (rs : ResultSet ): Any? = EnumMapper .getEnum(clazz, rs.getString(name))
42
38
}
43
39
44
40
private class Deserializer (
45
- override val param : KParameter ,
46
41
override val name : String ,
47
42
override val clazz : Class <* >,
48
43
private val deserializer : KFunction <* >
49
44
) : ParameterForMap() {
50
45
constructor (
51
- param: KParameter ,
52
46
name: String ,
53
47
deserializer: AbstractKColumnDeserializer <* , * , * >
54
- ) : this (param, name, deserializer.srcClass, deserializer::deserialize)
48
+ ) : this (name, deserializer.srcClass, deserializer::deserialize)
55
49
56
50
override fun getObject (rs : ResultSet ): Any? = deserializer.call(rs.getObject(name, clazz))
57
51
}
58
52
59
53
companion object {
60
- fun newInstance (param : KParameter , parameterNameConverter : (String ) -> String ): ParameterForMap {
61
- val name = parameterNameConverter(param.getAliasOrName()!! )
62
-
54
+ fun <T : Any > newInstance (param : ValueParameter <T >): ParameterForMap {
63
55
param.getDeserializer()?.let {
64
- return Deserializer (param, name, it)
56
+ return Deserializer (param. name, it)
65
57
}
66
58
67
- val parameterKClazz = param.type.classifier as KClass <* >
68
-
69
- parameterKClazz.getDeserializer()?.let {
59
+ param.requiredClazz.getDeserializer()?.let {
70
60
val targetClass = (it.parameters.single().type.classifier as KClass <* >).javaObjectType
71
- return Deserializer (param, name, targetClass, it)
61
+ return Deserializer (param. name, targetClass, it)
72
62
}
73
63
74
- return parameterKClazz .javaObjectType.let {
64
+ return param.requiredClazz .javaObjectType.let {
75
65
when (it.isEnum) {
76
- true -> Enum (param, name, it)
77
- false -> Plain (param, name, it)
66
+ true -> Enum (param. name, it)
67
+ false -> Plain (param. name, it)
78
68
}
79
69
}
80
70
}
81
71
}
82
72
}
83
73
84
- private fun KParameter.getDeserializer (): AbstractKColumnDeserializer <* , * , * >? {
74
+ @Suppress(" UNCHECKED_CAST" )
75
+ private fun <T : Any > ValueParameter<T>.getDeserializer (): AbstractKColumnDeserializer <* , * , T >? {
85
76
val deserializers = this .annotations.mapNotNull { paramAnnotation ->
86
77
paramAnnotation.annotationClass
87
78
.findAnnotation<KColumnDeserializeBy >()
88
79
?.let { it.deserializer.primaryConstructor!! .call(paramAnnotation) }
89
80
}
90
81
91
82
if (1 < deserializers.size)
92
- throw IllegalArgumentException (" Find multiple deserializer from ${(this .type.classifier as KClass < * > ).jvmName} " )
83
+ throw IllegalArgumentException (" Find multiple deserializer from ${(this .requiredClazz ).jvmName} " )
93
84
94
- return deserializers.singleOrNull()
85
+ return deserializers.singleOrNull() as AbstractKColumnDeserializer < * , * , T > ?
95
86
}
96
87
97
88
private fun <T : Any > KClass<T>.getDeserializer (): KFunction <T >? {
0 commit comments