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

Commit 7e6aacb

Browse files
committed
生成処理の効率化
1 parent d4b5f8b commit 7e6aacb

File tree

1 file changed

+18
-20
lines changed

1 file changed

+18
-20
lines changed

src/main/kotlin/com/mapk/fastkfunction/FastKFunction.kt

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,45 +28,43 @@ class FastKFunction<T>(private val function: KFunction<T>, instance: Any?) {
2828

2929
// この関数には確実にアクセスするためアクセシビリティ書き換え
3030
function.isAccessible = true
31-
// TODO: valueParametersの生成関連の効率化
32-
valueParameters = parameters.filter { it.kind == KParameter.Kind.VALUE }
3331

3432
val constructor = function.javaConstructor
3533

3634
if (constructor != null) {
35+
valueParameters = parameters
3736
bucketGenerator = BucketGenerator(parameters, null)
3837
fullInitializedFunction = { constructor.newInstance(*it) }
3938
} else {
4039
val method = function.javaMethod!!
4140

42-
// TODO: 必要な場面でインスタンスがnullならthrow
4341
@Suppress("UNCHECKED_CAST") // methodはTを返せないため強制キャスト
4442
when (parameters[0].kind) {
4543
KParameter.Kind.EXTENSION_RECEIVER -> {
46-
// 対象が拡張関数なら、instanceはreceiver
44+
// 対象が拡張関数ならinstanceはreceiver、指定が無ければエラー
45+
instance ?: throw IllegalArgumentException(
46+
"Function requires EXTENSION_RECEIVER instance, but is not present."
47+
)
48+
49+
valueParameters = parameters.subList(1, parameters.size)
4750
bucketGenerator = BucketGenerator(parameters, instance)
4851
fullInitializedFunction = { method.invoke(null, instance, *it) as T }
4952
}
5053
KParameter.Kind.INSTANCE -> {
51-
if (instance != null) {
52-
// 対象がインスタンスを要求する関数なら、instanceはobject
53-
bucketGenerator = BucketGenerator(parameters, instance)
54-
fullInitializedFunction = { method.invoke(instance, *it) as T }
55-
} else {
56-
// パラメータ上でインスタンスが要求されているが、入力のinstanceがnullだった場合、methodから取得を試みる
57-
try {
58-
val instanceFromClass = method.declaringObject!!
59-
60-
bucketGenerator = BucketGenerator(parameters, instanceFromClass)
61-
fullInitializedFunction = { method.invoke(instanceFromClass, *it) as T }
62-
} catch (e: Exception) {
63-
throw IllegalArgumentException(
64-
"Function requires INSTANCE parameter, but is not present.", e
65-
)
66-
}
54+
valueParameters = parameters.subList(1, parameters.size)
55+
56+
// 対象がインスタンスを要求する関数ならinstanceはobject、与えられたインスタンスがnullでもobjectからの取得を試みる
57+
val nonNullInstance = instance ?: try {
58+
method.declaringObject!!
59+
} catch (e: Exception) {
60+
throw IllegalArgumentException("Function requires INSTANCE parameter, but is not present.", e)
6761
}
62+
63+
bucketGenerator = BucketGenerator(parameters, nonNullInstance)
64+
fullInitializedFunction = { method.invoke(nonNullInstance, *it) as T }
6865
}
6966
KParameter.Kind.VALUE -> {
67+
valueParameters = parameters
7068
bucketGenerator = BucketGenerator(parameters, null)
7169

7270
fullInitializedFunction = if (instance != null) {

0 commit comments

Comments
 (0)