@@ -3,7 +3,6 @@ package com.mapk.kmapper
33import com.mapk.annotations.KGetterAlias
44import com.mapk.annotations.KGetterIgnore
55import com.mapk.core.ArgumentBucket
6- import com.mapk.core.EnumMapper
76import com.mapk.core.KFunctionForCall
87import com.mapk.core.getAliasOrName
98import com.mapk.core.isUseDefaultArgument
@@ -13,11 +12,10 @@ import kotlin.reflect.KClass
1312import kotlin.reflect.KFunction
1413import kotlin.reflect.KParameter
1514import kotlin.reflect.KVisibility
16- import kotlin.reflect.full.isSuperclassOf
1715import kotlin.reflect.full.memberProperties
1816import kotlin.reflect.jvm.javaGetter
1917
20- class KMapper <T : Any > private constructor(
18+ class PlainKMapper <T : Any > private constructor(
2119 private val function : KFunctionForCall <T >,
2220 parameterNameConverter : (String ) -> String
2321) {
@@ -29,9 +27,9 @@ class KMapper<T : Any> private constructor(
2927 clazz.toKConstructor(), parameterNameConverter
3028 )
3129
32- private val parameterMap: Map <String , ParameterForMap <* >> = function.parameters
30+ private val parameterMap: Map <String , PlainParameterForMap <* >> = function.parameters
3331 .filter { it.kind != KParameter .Kind .INSTANCE && ! it.isUseDefaultArgument() }
34- .associate { (parameterNameConverter(it.getAliasOrName()!! )) to ParameterForMap .newInstance(it) }
32+ .associate { (parameterNameConverter(it.getAliasOrName()!! )) to PlainParameterForMap .newInstance(it) }
3533
3634 private fun bindArguments (argumentBucket : ArgumentBucket , src : Any ) {
3735 src::class .memberProperties.forEach outer@{ property ->
@@ -51,7 +49,7 @@ class KMapper<T : Any> private constructor(
5149 parameterMap[alias ? : property.name]?.let {
5250 // javaGetterを呼び出す方が高速
5351 javaGetter.isAccessible = true
54- argumentBucket.putIfAbsent(it.param, javaGetter.invoke(src)?.let { value -> mapObject(it, value) })
52+ argumentBucket.putIfAbsent(it.param, javaGetter.invoke(src)?.let { value -> it. mapObject(value) })
5553 // 終了判定
5654 if (argumentBucket.isInitialized) return
5755 }
@@ -62,7 +60,7 @@ class KMapper<T : Any> private constructor(
6260 src.forEach { (key, value) ->
6361 parameterMap[key]?.let { param ->
6462 // 取得した内容がnullでなければ適切にmapする
65- argumentBucket.putIfAbsent(param.param, value?.let { mapObject(param, it ) })
63+ argumentBucket.putIfAbsent(param.param, value?.let { param. mapObject(value ) })
6664 // 終了判定
6765 if (argumentBucket.isInitialized) return
6866 }
@@ -71,7 +69,7 @@ class KMapper<T : Any> private constructor(
7169
7270 private fun bindArguments (argumentBucket : ArgumentBucket , srcPair : Pair <* , * >) {
7371 parameterMap[srcPair.first.toString()]?.let {
74- argumentBucket.putIfAbsent(it.param, srcPair.second?.let { value -> mapObject(it, value) })
72+ argumentBucket.putIfAbsent(it.param, srcPair.second?.let { value -> it. mapObject(value) })
7573 }
7674 }
7775
@@ -110,22 +108,3 @@ class KMapper<T : Any> private constructor(
110108 return function.call(bucket)
111109 }
112110}
113-
114- private fun <T : Any , R : Any > mapObject (param : ParameterForMap <R >, value : T ): Any? {
115- val valueClazz: KClass <* > = value::class
116-
117- // パラメータに対してvalueが代入可能(同じもしくは親クラス)であればそのまま用いる
118- if (param.clazz.isSuperclassOf(valueClazz)) return value
119-
120- val converter: KFunction <* >? = param.getConverter(valueClazz)
121-
122- return when {
123- // converterに一致する組み合わせが有れば設定されていればそれを使う
124- converter != null -> converter.call(value)
125- // 要求された値がenumかつ元が文字列ならenum mapperでマップ
126- param.javaClazz.isEnum && value is String -> EnumMapper .getEnum(param.clazz.java, value)
127- // 要求されているパラメータがStringならtoStringする
128- param.clazz == String ::class -> value.toString()
129- else -> throw IllegalArgumentException (" Can not convert $valueClazz to ${param.clazz} " )
130- }
131- }
0 commit comments