Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.

Commit 998e1d7

Browse files
authored
Merge pull request #23 from k163377/refactors
Refactors.
2 parents 0985a5b + f7c98ff commit 998e1d7

File tree

3 files changed

+41
-27
lines changed

3 files changed

+41
-27
lines changed

.idea/Shared.iml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/kotlin/com/mapk/core/KFunctionForCall.kt

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import kotlin.reflect.full.findAnnotation
1515
import kotlin.reflect.full.functions
1616
import kotlin.reflect.full.primaryConstructor
1717
import kotlin.reflect.jvm.isAccessible
18+
import kotlin.reflect.jvm.jvmName
1819
import org.jetbrains.annotations.TestOnly
1920

2021
class 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")
8591
internal 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

Comments
 (0)