@@ -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 (targetBucket : 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- targetBucket[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 ( targetBucket : 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- targetBucket[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 ( targetBucket : Array < Any ?> , srcPair : Pair <* , * >) {
66- parameterMap.getValue( srcPair.first.toString()) .let {
67- targetBucket[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 bucket: Array <Any ?> = function.argumentBucket
73- bindParameters(bucket, srcMap)
87+ val bucket: ArgumentBucket = function.getArgumentBucket()
88+ bindArguments(bucket, srcMap)
89+
90+ if (! bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
91+
7492 return function.call(bucket)
7593 }
7694
7795 fun map (srcPair : Pair <String , Any ?>): T {
78- val bucket: Array <Any ?> = function.argumentBucket
79- bindParameters(bucket, srcPair)
96+ val bucket: ArgumentBucket = function.getArgumentBucket()
97+ bindArguments(bucket, srcPair)
98+
99+ if (! bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
100+
80101 return function.call(bucket)
81102 }
82103
83104 fun map (src : Any ): T {
84- val bucket: Array <Any ?> = function.argumentBucket
85- bindParameters(bucket, src)
105+ val bucket: ArgumentBucket = function.getArgumentBucket()
106+ bindArguments(bucket, src)
107+
108+ if (! bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
109+
86110 return function.call(bucket)
87111 }
88112
89113 fun map (vararg args : Any ): T {
90- val array : Array < Any ?> = function.argumentBucket
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
0 commit comments