@@ -40,64 +40,90 @@ class KMapper<T : Any> private constructor(
4040 if (parameterMap.isEmpty()) throw IllegalArgumentException (" This function is not require arguments." )
4141 }
4242
43- private fun bindParameters (targetArray : Array <Any ?>, src : Any ) {
43+ private fun throwExceptionOnNotInitialized (argumentBucket : ArgumentBucket ): Nothing {
44+ val notInitializedIndexes = argumentBucket.notInitializedParameterIndexes
45+ function.parameters
46+ .filter { it.index in notInitializedIndexes }
47+ .map { it.name }
48+ .joinToString(" , " )
49+ .let {
50+ throw IllegalArgumentException (" Not passed arguments: $it " )
51+ }
52+ }
53+
54+ private fun bindArguments (argumentBucket : ArgumentBucket , src : Any ) {
4455 src::class .memberProperties.forEach { property ->
4556 val javaGetter: Method ? = property.javaGetter
4657 if (javaGetter != null && property.visibility == KVisibility .PUBLIC && property.annotations.none { annotation -> annotation is KPropertyIgnore }) {
4758 parameterMap[property.findAnnotation<KGetterAlias >()?.value ? : property.name]?.let {
4859 // javaGetterを呼び出す方が高速
4960 javaGetter.isAccessible = true
50- targetArray[it.index] = javaGetter.invoke(src)?.let { value -> mapObject(it, value) }
61+ argumentBucket.setArgument(javaGetter.invoke(src)?.let { value -> mapObject(it, value) }, it.index)
62+ // 終了判定
63+ if (argumentBucket.isInitialized) return
5164 }
5265 }
5366 }
5467 }
5568
56- private fun bindParameters ( targetArray : Array < Any ?> , src : Map <* , * >) {
69+ private fun bindArguments ( argumentBucket : ArgumentBucket , src : Map <* , * >) {
5770 src.forEach { (key, value) ->
5871 parameterMap[key]?.let { param ->
5972 // 取得した内容がnullでなければ適切にmapする
60- targetArray[param.index] = value?.let { mapObject(param, it) }
73+ argumentBucket.setArgument(value?.let { mapObject(param, it) }, param.index)
74+ // 終了判定
75+ if (argumentBucket.isInitialized) return
6176 }
6277 }
6378 }
6479
65- private fun bindParameters ( targetArray : Array < Any ?> , srcPair : Pair <* , * >) {
66- parameterMap.getValue( srcPair.first.toString()) .let {
67- targetArray[it.index] = srcPair.second?.let { value -> mapObject(it, value) }
80+ private fun bindArguments ( argumentBucket : ArgumentBucket , srcPair : Pair <* , * >) {
81+ parameterMap[ srcPair.first.toString()]? .let {
82+ argumentBucket.setArgument( srcPair.second?.let { value -> mapObject(it, value) }, it.index)
6883 }
6984 }
7085
7186 fun map (srcMap : Map <String , Any ?>): T {
72- val array: Array <Any ?> = function.argumentArray
73- bindParameters(array, srcMap)
74- return function.call(array)
87+ val bucket: ArgumentBucket = function.getArgumentBucket()
88+ bindArguments(bucket, srcMap)
89+
90+ if (! bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
91+
92+ return function.call(bucket)
7593 }
7694
7795 fun map (srcPair : Pair <String , Any ?>): T {
78- val array: Array <Any ?> = function.argumentArray
79- bindParameters(array, srcPair)
80- return function.call(array)
96+ val bucket: ArgumentBucket = function.getArgumentBucket()
97+ bindArguments(bucket, srcPair)
98+
99+ if (! bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
100+
101+ return function.call(bucket)
81102 }
82103
83104 fun map (src : Any ): T {
84- val array: Array <Any ?> = function.argumentArray
85- bindParameters(array, src)
86- return function.call(array)
105+ val bucket: ArgumentBucket = function.getArgumentBucket()
106+ bindArguments(bucket, src)
107+
108+ if (! bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
109+
110+ return function.call(bucket)
87111 }
88112
89113 fun map (vararg args : Any ): T {
90- val array : Array < Any ?> = function.argumentArray
114+ val bucket : ArgumentBucket = function.getArgumentBucket()
91115
92116 listOf (* args).forEach { arg ->
93117 when (arg) {
94- is Map <* , * > -> bindParameters(array , arg)
95- is Pair <* , * > -> bindParameters(array , arg)
96- else -> bindParameters(array , arg)
118+ is Map <* , * > -> bindArguments(bucket , arg)
119+ is Pair <* , * > -> bindArguments(bucket , arg)
120+ else -> bindArguments(bucket , arg)
97121 }
98122 }
99123
100- return function.call(array)
124+ if (! bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
125+
126+ return function.call(bucket)
101127 }
102128}
103129
@@ -123,15 +149,15 @@ internal fun <T : Any> getTarget(clazz: KClass<T>): KFunctionForCall<T> {
123149
124150private fun <T : Any , R : Any > mapObject (param : ParameterForMap <R >, value : T ): Any? {
125151 val valueClazz: KClass <* > = value::class
126- val creator: KFunction <* >? by lazy {
127- param.getCreator(valueClazz)
128- }
152+
153+ // パラメータに対してvalueが代入可能(同じもしくは親クラス)であればそのまま用いる
154+ if (param.clazz.isSuperclassOf(valueClazz)) return value
155+
156+ val creator: KFunction <* >? = param.getCreator(valueClazz)
129157
130158 return when {
131- // パラメータに対してvalueが代入可能(同じもしくは親クラス)であればそのまま用いる
132- param.clazz.isSuperclassOf(valueClazz) -> value
133159 // creatorに一致する組み合わせが有れば設定されていればそれを使う
134- creator != null -> creator!! .call(value)
160+ creator != null -> creator.call(value)
135161 // 要求された値がenumかつ元が文字列ならenum mapperでマップ
136162 param.javaClazz.isEnum && value is String -> EnumMapper .getEnum(param.clazz.java, value)
137163 // 要求されているパラメータがStringならtoStringする
0 commit comments