@@ -3,14 +3,13 @@ package com.mapk.krowmapper
33import com.mapk.annotations.KColumnDeserializer
44import com.mapk.core.EnumMapper
55import com.mapk.core.KFunctionWithInstance
6- import com.mapk.core.getAliasOrName
6+ import com.mapk.core.ValueParameter
77import com.mapk.deserialization.AbstractKColumnDeserializer
88import com.mapk.deserialization.KColumnDeserializeBy
99import java.lang.IllegalArgumentException
1010import java.sql.ResultSet
1111import kotlin.reflect.KClass
1212import kotlin.reflect.KFunction
13- import kotlin.reflect.KParameter
1413import kotlin.reflect.full.companionObjectInstance
1514import kotlin.reflect.full.findAnnotation
1615import kotlin.reflect.full.functions
@@ -20,78 +19,70 @@ import kotlin.reflect.jvm.isAccessible
2019import kotlin.reflect.jvm.jvmName
2120
2221internal sealed class ParameterForMap {
23- abstract val param: KParameter
2422 abstract val name: String
2523 abstract val clazz: Class <* >
2624 abstract fun getObject (rs : ResultSet ): Any?
2725
2826 private class Plain (
29- override val param : KParameter ,
3027 override val name : String ,
3128 override val clazz : Class <* >
3229 ) : ParameterForMap() {
3330 override fun getObject (rs : ResultSet ): Any? = rs.getObject(name, clazz)
3431 }
3532
3633 private class Enum (
37- override val param : KParameter ,
3834 override val name : String ,
3935 override val clazz : Class <* >
4036 ) : ParameterForMap() {
4137 override fun getObject (rs : ResultSet ): Any? = EnumMapper .getEnum(clazz, rs.getString(name))
4238 }
4339
4440 private class Deserializer (
45- override val param : KParameter ,
4641 override val name : String ,
4742 override val clazz : Class <* >,
4843 private val deserializer : KFunction <* >
4944 ) : ParameterForMap() {
5045 constructor (
51- param: KParameter ,
5246 name: String ,
5347 deserializer: AbstractKColumnDeserializer <* , * , * >
54- ) : this (param, name, deserializer.srcClass, deserializer::deserialize)
48+ ) : this (name, deserializer.srcClass, deserializer::deserialize)
5549
5650 override fun getObject (rs : ResultSet ): Any? = deserializer.call(rs.getObject(name, clazz))
5751 }
5852
5953 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 {
6355 param.getDeserializer()?.let {
64- return Deserializer (param, name, it)
56+ return Deserializer (param. name, it)
6557 }
6658
67- val parameterKClazz = param.type.classifier as KClass <* >
68-
69- parameterKClazz.getDeserializer()?.let {
59+ param.requiredClazz.getDeserializer()?.let {
7060 val targetClass = (it.parameters.single().type.classifier as KClass <* >).javaObjectType
71- return Deserializer (param, name, targetClass, it)
61+ return Deserializer (param. name, targetClass, it)
7262 }
7363
74- return parameterKClazz .javaObjectType.let {
64+ return param.requiredClazz .javaObjectType.let {
7565 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)
7868 }
7969 }
8070 }
8171 }
8272}
8373
84- private fun KParameter.getDeserializer (): AbstractKColumnDeserializer <* , * , * >? {
74+ @Suppress(" UNCHECKED_CAST" )
75+ private fun <T : Any > ValueParameter<T>.getDeserializer (): AbstractKColumnDeserializer <* , * , T >? {
8576 val deserializers = this .annotations.mapNotNull { paramAnnotation ->
8677 paramAnnotation.annotationClass
8778 .findAnnotation<KColumnDeserializeBy >()
8879 ?.let { it.deserializer.primaryConstructor!! .call(paramAnnotation) }
8980 }
9081
9182 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} " )
9384
94- return deserializers.singleOrNull()
85+ return deserializers.singleOrNull() as AbstractKColumnDeserializer < * , * , T > ?
9586}
9687
9788private fun <T : Any > KClass<T>.getDeserializer (): KFunction <T >? {
0 commit comments