@@ -15,6 +15,7 @@ import kotlin.reflect.full.findAnnotation
1515import kotlin.reflect.full.functions
1616import kotlin.reflect.full.primaryConstructor
1717import kotlin.reflect.jvm.isAccessible
18+ import kotlin.reflect.jvm.jvmName
1819import org.jetbrains.annotations.TestOnly
1920
2021class KFunctionForCall <T > internal constructor(
@@ -49,28 +50,33 @@ class KFunctionForCall<T> internal constructor(
4950 .filter { it.kind == KParameter .Kind .VALUE && ! it.isUseDefaultArgument() }
5051 .map { it.toArgumentBinder(parameterNameConverter) }
5152
52- bucketGenerator = BucketGenerator (
53- parameters,
54- binders,
55- instance
56- )
53+ bucketGenerator = BucketGenerator (parameters, binders, instance)
5754
58- requiredParameters = binders.fold(ArrayList ()) { acc, elm ->
59- when (elm) {
60- is ArgumentBinder .Value <* > -> acc.add(elm)
61- is ArgumentBinder .Function -> acc.addAll(elm.requiredParameters)
55+ val tempList = ArrayList <ValueParameter <* >>(binders.size)
56+ val tempMap = HashMap <String , ValueParameter <* >>(binders.size)
57+
58+ binders.forEach { binder ->
59+ when (binder) {
60+ is ArgumentBinder .Value <* > -> addArgs(binder, tempList, tempMap)
61+ is ArgumentBinder .Function -> binder.requiredParameters.forEach {
62+ addArgs(it, tempList, tempMap)
63+ }
6264 }
63- acc
6465 }
6566
66- requiredParametersMap = HashMap <String , ValueParameter <* >>().apply {
67- requiredParameters.forEach {
68- if (containsKey(it.name))
69- throw IllegalArgumentException (" The argument name ${it.name} is duplicated." )
67+ requiredParameters = tempList
68+ requiredParametersMap = tempMap
69+ }
7070
71- this [it.name] = it
72- }
73- }
71+ private fun addArgs (
72+ parameter : ValueParameter <* >,
73+ tempList : ArrayList <ValueParameter <* >>,
74+ tempMap : MutableMap <String , ValueParameter <* >>
75+ ) {
76+ if (tempMap.containsKey(parameter.name))
77+ throw IllegalArgumentException (" The argument name ${parameter.name} is duplicated." )
78+ tempMap[parameter.name] = parameter
79+ tempList.add(parameter)
7480 }
7581
7682 fun getArgumentAdaptor (): ArgumentAdaptor = ArgumentAdaptor (requiredParametersMap)
@@ -83,22 +89,25 @@ class KFunctionForCall<T> internal constructor(
8389
8490@Suppress(" UNCHECKED_CAST" )
8591internal fun <T : Any > KClass<T>.toKConstructor (parameterNameConverter : ParameterNameConverter ): KFunctionForCall <T > {
86- val factoryConstructor: List <KFunctionForCall <T >> =
87- this .companionObjectInstance?.let { companionObject ->
88- companionObject::class .functions
89- .filter { it.annotations.any { annotation -> annotation is KConstructor } }
90- .map { KFunctionForCall (it, parameterNameConverter, companionObject) as KFunctionForCall <T > }
91- } ? : emptyList()
92-
93- val constructors: List <KFunctionForCall <T >> = factoryConstructor + this .constructors
92+ val constructors = ArrayList <KFunctionForCall <T >>()
93+
94+ this .companionObjectInstance?.let { companionObject ->
95+ companionObject::class .functions
96+ .filter { it.annotations.any { annotation -> annotation is KConstructor } }
97+ .forEach {
98+ constructors.add(KFunctionForCall (it, parameterNameConverter, companionObject) as KFunctionForCall <T >)
99+ }
100+ }
101+
102+ this .constructors
94103 .filter { it.annotations.any { annotation -> annotation is KConstructor } }
95- .map { KFunctionForCall (it, parameterNameConverter) }
104+ .forEach { constructors.add( KFunctionForCall (it, parameterNameConverter) ) }
96105
97106 if (constructors.size == 1 ) return constructors.single()
98107
99108 if (constructors.isEmpty()) return KFunctionForCall (this .primaryConstructor!! , parameterNameConverter)
100109
101- throw IllegalArgumentException (" Find multiple target ." )
110+ throw IllegalArgumentException (" ${ this .jvmName} has multiple ${ KConstructor :: class .jvmName} ." )
102111}
103112
104113@Suppress(" UNCHECKED_CAST" )
0 commit comments