From 4046264349efe7b6360c091abd85716065efabfe Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 8 Mar 2020 21:03:01 +0900 Subject: [PATCH 01/14] =?UTF-8?q?=E3=83=9E=E3=83=83=E3=83=97=E3=82=82?= =?UTF-8?q?=E6=8C=81=E3=81=9F=E3=81=9B=E3=82=8B=E5=BD=A2=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/mapk/core/ArgumentBucket.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt index 6ad9eb8..1ec3353 100644 --- a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt +++ b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt @@ -1,7 +1,10 @@ package com.mapk.core +import kotlin.reflect.KParameter + class ArgumentBucket internal constructor( internal val bucket: Array, + internal val bucketMap: MutableMap, private var initializationStatus: Int, private val initializeMask: List, // clone時の再計算を避けるため1回で済むようにデフォルト値化 @@ -12,12 +15,14 @@ class ArgumentBucket internal constructor( initializationStatus and initializeMask[it] == 0 } - fun setArgument(argument: Any?, index: Int) { + fun setArgument(kParameter: KParameter, argument: Any?) { + val index = kParameter.index val temp = initializationStatus or initializeMask[index] // 先に入ったものを優先するため、初期化済みなら何もしない if (initializationStatus == temp) return + bucketMap[kParameter] = argument bucket[index] = argument initializationStatus = temp } @@ -25,6 +30,7 @@ class ArgumentBucket internal constructor( public override fun clone(): ArgumentBucket { return ArgumentBucket( bucket.copyOf(), + bucketMap.toMutableMap(), initializationStatus, initializeMask, completionValue From 3bbd9dc138b771544bcb8c1f4937d9a2a472c38f Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 8 Mar 2020 21:08:34 +0900 Subject: [PATCH 02/14] =?UTF-8?q?map=E8=BF=BD=E5=8A=A0=E3=81=AB=E5=90=88?= =?UTF-8?q?=E3=82=8F=E3=81=9B=E3=81=A6=E5=88=9D=E6=9C=9F=E5=8C=96=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ついでに単純化 --- .../kotlin/com/mapk/core/KFunctionForCall.kt | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/com/mapk/core/KFunctionForCall.kt b/src/main/kotlin/com/mapk/core/KFunctionForCall.kt index cfc8281..501afd0 100644 --- a/src/main/kotlin/com/mapk/core/KFunctionForCall.kt +++ b/src/main/kotlin/com/mapk/core/KFunctionForCall.kt @@ -14,22 +14,21 @@ class KFunctionForCall(private val function: KFunction, instance: Any? = n // この関数には確実にアクセスするためアクセシビリティ書き換え function.isAccessible = true + + // 初期化処理の共通化のため先に初期化 + val tempMap = HashMap(parameters.size, 1.0f) + val tempArray = Array(parameters.size) { null } + val maskList = generateSequence(1) { it.shl(1) }.take(parameters.size).toList() + originalArgumentBucket = if (instance != null) { - ArgumentBucket( - Array(parameters.size) { if (it == 0) instance else null }, - 1, - generateSequence(1) { it.shl(1) } - .take(parameters.size) - .toList() - ) + // インスタンス有りでは先にインスタンスを初期化する + parameters.find { it.kind == KParameter.Kind.INSTANCE }?.run { tempMap[this] = instance } + tempArray[0] = instance + + // 引数の1番目は初期化済みということでinitializationStatusは1スタート + ArgumentBucket(tempArray, tempMap, 1, maskList) } else { - ArgumentBucket( - Array(parameters.size) { null }, - 0, - generateSequence(1) { it.shl(1) } - .take(parameters.size) - .toList() - ) + ArgumentBucket(tempArray, tempMap, 0, maskList) } } From 2c5a5e6bd4dee24b39e39190f2ac284ea229c146 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 8 Mar 2020 21:09:15 +0900 Subject: [PATCH 03/14] =?UTF-8?q?=E5=88=9D=E6=9C=9F=E5=8C=96=E5=AE=8C?= =?UTF-8?q?=E4=BA=86=E3=81=97=E3=81=A6=E3=81=84=E3=82=8B=E5=A0=B4=E5=90=88?= =?UTF-8?q?=E3=81=AFcall=E3=82=92=E3=80=81=E3=81=9D=E3=82=8C=E4=BB=A5?= =?UTF-8?q?=E5=A4=96=E3=81=AE=E5=A0=B4=E5=90=88=E3=81=AFmap=E3=82=92?= =?UTF-8?q?=E7=94=A8=E3=81=84=E3=81=A6=E3=83=87=E3=83=95=E3=82=A9=E3=83=AB?= =?UTF-8?q?=E3=83=88=E5=BC=95=E6=95=B0=E6=9C=89=E3=82=8A=E3=81=AE=E5=91=BC?= =?UTF-8?q?=E3=81=B3=E5=87=BA=E3=81=97=E3=82=92=E8=A1=8C=E3=81=86=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/mapk/core/KFunctionForCall.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/mapk/core/KFunctionForCall.kt b/src/main/kotlin/com/mapk/core/KFunctionForCall.kt index 501afd0..f9c7293 100644 --- a/src/main/kotlin/com/mapk/core/KFunctionForCall.kt +++ b/src/main/kotlin/com/mapk/core/KFunctionForCall.kt @@ -34,7 +34,7 @@ class KFunctionForCall(private val function: KFunction, instance: Any? = n fun getArgumentBucket(): ArgumentBucket = originalArgumentBucket.clone() - fun call(argumentBucket: ArgumentBucket): T { - return function.call(*argumentBucket.bucket) - } + fun call(argumentBucket: ArgumentBucket): T = + if (argumentBucket.isInitialized) function.call(*argumentBucket.bucket) + else function.callBy(argumentBucket.bucketMap) } From efbf53ac42a637fa8de2da68f011b370ddbc9631 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 8 Mar 2020 21:13:19 +0900 Subject: [PATCH 04/14] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 元はcallで呼ぶ場合何が初期化されてないか分からなかったため持っていたが、callByによって何が足りないか出るようになったため --- src/main/kotlin/com/mapk/core/ArgumentBucket.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt index 1ec3353..dd0c76f 100644 --- a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt +++ b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt @@ -11,9 +11,6 @@ class ArgumentBucket internal constructor( private val completionValue: Int = initializeMask.reduce { l, r -> l or r } ) : Cloneable { val isInitialized: Boolean get() = initializationStatus == completionValue - val notInitializedParameterIndexes: List get() = initializeMask.indices.filter { - initializationStatus and initializeMask[it] == 0 - } fun setArgument(kParameter: KParameter, argument: Any?) { val index = kParameter.index From e31a2988b67974f6f0d170d3601e5738db35942b Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 8 Mar 2020 21:13:48 +0900 Subject: [PATCH 05/14] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt b/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt index 21561b4..b6a333d 100644 --- a/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt +++ b/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt @@ -36,9 +36,10 @@ class ArgumentBucketTest { @Test @DisplayName("初期化後") fun isInitialized() { - argumentBucket.setArgument(object {}, 0) - argumentBucket.setArgument(object {}, 1) - argumentBucket.setArgument(object {}, 2) + ::sampleFunction.parameters.forEach { + argumentBucket.setArgument(it, object {}) + } + assertTrue(argumentBucket.isInitialized) } } From 878fc568a41b2e00065cf887f7ad75dd979e59fc Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 8 Mar 2020 21:14:15 +0900 Subject: [PATCH 06/14] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mapk/core/ArgumentBucketTest.kt | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt b/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt index b6a333d..334eb27 100644 --- a/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt +++ b/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt @@ -2,7 +2,6 @@ package com.mapk.core import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertFalse -import org.junit.jupiter.api.Assertions.assertIterableEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName @@ -44,32 +43,6 @@ class ArgumentBucketTest { } } - @Nested - @DisplayName("初期化されていないインデックス取得のテスト") - inner class NotInitializedParameterIndexesTest { - @Test - @DisplayName("何もセットしていない場合") - fun noArguments() { - assertIterableEquals(listOf(0, 1, 2), argumentBucket.notInitializedParameterIndexes) - } - - @Test - @DisplayName("1つセットした場合") - fun singleArgument() { - argumentBucket.setArgument(object {}, 1) - assertIterableEquals(listOf(0, 2), argumentBucket.notInitializedParameterIndexes) - } - - @Test - @DisplayName("全てセットした場合") - fun fullArguments() { - argumentBucket.setArgument(object {}, 0) - argumentBucket.setArgument(object {}, 1) - argumentBucket.setArgument(object {}, 2) - assertIterableEquals(emptyList(), argumentBucket.notInitializedParameterIndexes) - } - } - @Nested @DisplayName("引数セットのテスト") inner class SetArgumentTest { From 68011fdcdea700007de3d1ecfddc4b090bd4de81 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 8 Mar 2020 21:16:35 +0900 Subject: [PATCH 07/14] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt b/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt index 334eb27..02561c2 100644 --- a/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt +++ b/src/test/kotlin/com/mapk/core/ArgumentBucketTest.kt @@ -49,15 +49,18 @@ class ArgumentBucketTest { @Test @DisplayName("正常に追加した場合") fun setNewArgument() { - argumentBucket.setArgument("argument", 0) + val parameter = ::sampleFunction.parameters.first { it.index == 0 } + argumentBucket.setArgument(parameter, "argument") assertEquals("argument", argumentBucket.bucket[0]) } @Test @DisplayName("同じインデックスに2回追加した場合") fun setArgumentTwice() { - argumentBucket.setArgument("first", 0) - argumentBucket.setArgument("second", 0) + val parameter = ::sampleFunction.parameters.first { it.index == 0 } + + argumentBucket.setArgument(parameter, "first") + argumentBucket.setArgument(parameter, "second") assertEquals("first", argumentBucket.bucket[0]) } } From 3abedb77bf5b76a2e01690182d7ae721aa8ba8ab Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 8 Mar 2020 22:08:39 +0900 Subject: [PATCH 08/14] =?UTF-8?q?=E3=82=AF=E3=83=AD=E3=83=BC=E3=83=B3?= =?UTF-8?q?=E3=81=A7=E3=81=AF=E3=81=AA=E3=81=8F=E3=82=B8=E3=82=A7=E3=83=8D?= =?UTF-8?q?=E3=83=AC=E3=83=BC=E3=83=88=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/mapk/core/ArgumentBucket.kt | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt index dd0c76f..a4b9569 100644 --- a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt +++ b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt @@ -2,13 +2,29 @@ package com.mapk.core import kotlin.reflect.KParameter +internal class BucketGenerator( + private val bucket: Array, + private val bucketMap: MutableMap, + private val initializationStatus: Int, + private val initializeMask: List +) { + private val completionValue: Int = initializeMask.reduce { l, r -> l or r } + + fun generate(): ArgumentBucket = ArgumentBucket( + bucket.copyOf(), + bucketMap.toMutableMap(), + initializationStatus, + initializeMask, + completionValue + ) +} + class ArgumentBucket internal constructor( internal val bucket: Array, internal val bucketMap: MutableMap, private var initializationStatus: Int, private val initializeMask: List, - // clone時の再計算を避けるため1回で済むようにデフォルト値化 - private val completionValue: Int = initializeMask.reduce { l, r -> l or r } + private val completionValue: Int ) : Cloneable { val isInitialized: Boolean get() = initializationStatus == completionValue From 891aa8b47856721cceed42d0b3aa5278a3b33e78 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 8 Mar 2020 22:09:03 +0900 Subject: [PATCH 09/14] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=81=9F=E3=82=81=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/mapk/core/ArgumentBucket.kt | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt index a4b9569..5f9e94e 100644 --- a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt +++ b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt @@ -25,7 +25,7 @@ class ArgumentBucket internal constructor( private var initializationStatus: Int, private val initializeMask: List, private val completionValue: Int -) : Cloneable { +) { val isInitialized: Boolean get() = initializationStatus == completionValue fun setArgument(kParameter: KParameter, argument: Any?) { @@ -39,14 +39,4 @@ class ArgumentBucket internal constructor( bucket[index] = argument initializationStatus = temp } - - public override fun clone(): ArgumentBucket { - return ArgumentBucket( - bucket.copyOf(), - bucketMap.toMutableMap(), - initializationStatus, - initializeMask, - completionValue - ) - } } From 6c775ee6ece3e963aaf65740f0e278c51c4db00e Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 8 Mar 2020 22:09:27 +0900 Subject: [PATCH 10/14] =?UTF-8?q?ArgumentBucket=E3=81=AE=E7=94=9F=E6=88=90?= =?UTF-8?q?=E3=82=92generator=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/mapk/core/KFunctionForCall.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/com/mapk/core/KFunctionForCall.kt b/src/main/kotlin/com/mapk/core/KFunctionForCall.kt index f9c7293..addd0c9 100644 --- a/src/main/kotlin/com/mapk/core/KFunctionForCall.kt +++ b/src/main/kotlin/com/mapk/core/KFunctionForCall.kt @@ -6,7 +6,7 @@ import kotlin.reflect.jvm.isAccessible class KFunctionForCall(private val function: KFunction, instance: Any? = null) { val parameters: List = function.parameters - private val originalArgumentBucket: ArgumentBucket + private val generator: BucketGenerator init { if (parameters.isEmpty() || (instance != null && parameters.size == 1)) @@ -20,19 +20,19 @@ class KFunctionForCall(private val function: KFunction, instance: Any? = n val tempArray = Array(parameters.size) { null } val maskList = generateSequence(1) { it.shl(1) }.take(parameters.size).toList() - originalArgumentBucket = if (instance != null) { + generator = if (instance != null) { // インスタンス有りでは先にインスタンスを初期化する parameters.find { it.kind == KParameter.Kind.INSTANCE }?.run { tempMap[this] = instance } tempArray[0] = instance // 引数の1番目は初期化済みということでinitializationStatusは1スタート - ArgumentBucket(tempArray, tempMap, 1, maskList) + BucketGenerator(tempArray, tempMap, 1, maskList) } else { - ArgumentBucket(tempArray, tempMap, 0, maskList) + BucketGenerator(tempArray, tempMap, 0, maskList) } } - fun getArgumentBucket(): ArgumentBucket = originalArgumentBucket.clone() + fun getArgumentBucket(): ArgumentBucket = generator.generate() fun call(argumentBucket: ArgumentBucket): T = if (argumentBucket.isInitialized) function.call(*argumentBucket.bucket) From 1963531c607eeb3797487a7e7b3127d1b443dc2f Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 8 Mar 2020 22:18:16 +0900 Subject: [PATCH 11/14] =?UTF-8?q?=E3=83=9E=E3=83=83=E3=83=97=E3=81=AE?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=96=B9=E6=B3=95=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/mapk/core/ArgumentBucket.kt | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt index 5f9e94e..a08c25a 100644 --- a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt +++ b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt @@ -4,19 +4,25 @@ import kotlin.reflect.KParameter internal class BucketGenerator( private val bucket: Array, - private val bucketMap: MutableMap, + private val instancePair: Pair?, private val initializationStatus: Int, private val initializeMask: List ) { private val completionValue: Int = initializeMask.reduce { l, r -> l or r } + private val bucketSize = bucket.size - fun generate(): ArgumentBucket = ArgumentBucket( - bucket.copyOf(), - bucketMap.toMutableMap(), - initializationStatus, - initializeMask, - completionValue - ) + fun generate(): ArgumentBucket { + val tempMap = HashMap(bucketSize, 1.0f) + instancePair?.run { tempMap[this.first] = this.second } + + return ArgumentBucket( + bucket.copyOf(), + tempMap, + initializationStatus, + initializeMask, + completionValue + ) + } } class ArgumentBucket internal constructor( From f197914fd9e7e6aae29ff97abf6fb052d3f7fa42 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Mon, 9 Mar 2020 00:31:22 +0900 Subject: [PATCH 12/14] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=81=AB=E5=90=88?= =?UTF-8?q?=E3=82=8F=E3=81=9B=E3=81=A6=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/mapk/core/KFunctionForCall.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/com/mapk/core/KFunctionForCall.kt b/src/main/kotlin/com/mapk/core/KFunctionForCall.kt index addd0c9..47cc3e4 100644 --- a/src/main/kotlin/com/mapk/core/KFunctionForCall.kt +++ b/src/main/kotlin/com/mapk/core/KFunctionForCall.kt @@ -16,19 +16,16 @@ class KFunctionForCall(private val function: KFunction, instance: Any? = n function.isAccessible = true // 初期化処理の共通化のため先に初期化 - val tempMap = HashMap(parameters.size, 1.0f) val tempArray = Array(parameters.size) { null } val maskList = generateSequence(1) { it.shl(1) }.take(parameters.size).toList() generator = if (instance != null) { - // インスタンス有りでは先にインスタンスを初期化する - parameters.find { it.kind == KParameter.Kind.INSTANCE }?.run { tempMap[this] = instance } tempArray[0] = instance // 引数の1番目は初期化済みということでinitializationStatusは1スタート - BucketGenerator(tempArray, tempMap, 1, maskList) + BucketGenerator(tempArray, parameters.first { it.kind == KParameter.Kind.INSTANCE } to instance, 1, maskList) } else { - BucketGenerator(tempArray, tempMap, 0, maskList) + BucketGenerator(tempArray, null, 0, maskList) } } From be5a2121f73b255a215e9d5a71d7016ad1f7e22b Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Mon, 9 Mar 2020 00:31:51 +0900 Subject: [PATCH 13/14] =?UTF-8?q?=E3=82=B3=E3=83=B3=E3=83=91=E3=83=8B?= =?UTF-8?q?=E3=82=AA=E3=83=B3=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7=E3=82=AF?= =?UTF-8?q?=E3=83=88=E3=82=92=E5=85=A5=E3=82=8C=E3=81=9F=E3=81=A8=E3=81=8D?= =?UTF-8?q?=E3=81=AE=E5=91=BC=E3=81=B3=E5=87=BA=E3=81=97=E9=96=A2=E9=80=A3?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mapk/core/KFunctionForCallTest.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/test/kotlin/com/mapk/core/KFunctionForCallTest.kt b/src/test/kotlin/com/mapk/core/KFunctionForCallTest.kt index 3247531..a3b9692 100644 --- a/src/test/kotlin/com/mapk/core/KFunctionForCallTest.kt +++ b/src/test/kotlin/com/mapk/core/KFunctionForCallTest.kt @@ -1,5 +1,7 @@ package com.mapk.core +import kotlin.reflect.full.functions +import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test @@ -33,4 +35,28 @@ class KFunctionForCallTest { assertDoesNotThrow { KFunctionForCall(this::dummy2) } } } + + @Nested + @DisplayName("呼び出し関連テスト") + inner class CallTest { + @Test + @DisplayName("コンパニオンオブジェクトから取得した場合") + fun fromCompanionObject() { + val function = + Companion::class.functions.find { it.name == (KFunctionForCallTest)::declaredOnCompanionObject.name }!! + + val kFunctionForCall = KFunctionForCall(function, Companion) + + val bucket = kFunctionForCall.getArgumentBucket() + kFunctionForCall.parameters.forEach { bucket.setArgument(it, it.index) } + val result = kFunctionForCall.call(bucket) + assertEquals("12", result) + } + } + + companion object { + fun declaredOnCompanionObject(arg1: Any, arg2: Any): String { + return arg1.toString() + arg2.toString() + } + } } From a74776ddd53692e32db3757c09d60aa5995ad40c Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Mon, 9 Mar 2020 00:37:25 +0900 Subject: [PATCH 14/14] =?UTF-8?q?=E3=83=87=E3=83=95=E3=82=A9=E3=83=AB?= =?UTF-8?q?=E3=83=88=E5=80=A4=E3=82=92=E7=94=A8=E3=81=84=E3=82=8B=E5=A0=B4?= =?UTF-8?q?=E5=90=88=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/mapk/core/KFunctionForCallTest.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/kotlin/com/mapk/core/KFunctionForCallTest.kt b/src/test/kotlin/com/mapk/core/KFunctionForCallTest.kt index a3b9692..99d2691 100644 --- a/src/test/kotlin/com/mapk/core/KFunctionForCallTest.kt +++ b/src/test/kotlin/com/mapk/core/KFunctionForCallTest.kt @@ -52,6 +52,20 @@ class KFunctionForCallTest { val result = kFunctionForCall.call(bucket) assertEquals("12", result) } + + private fun func(key: String, value: String = "default"): Pair = key to value + + @Test + @DisplayName("デフォルト値を用いる場合") + fun useDefaultValue() { + val kFunctionForCall = KFunctionForCall(::func) + val argumentBucket = kFunctionForCall.getArgumentBucket() + + ::func.parameters.forEach { if (!it.isOptional) argumentBucket.setArgument(it, it.name) } + + val result = kFunctionForCall.call(argumentBucket) + assertEquals("key" to "default", result) + } } companion object {