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

Commit 58566c1

Browse files
authored
Merge pull request #34 from k163377/update_kotlin
Update Kotlin and refactors.
2 parents 4bb28fb + 5ce093c commit 58566c1

File tree

8 files changed

+97
-15
lines changed

8 files changed

+97
-15
lines changed

build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
plugins {
22
id("maven")
33
id("java")
4-
id("org.jetbrains.kotlin.jvm") version "1.4.0"
4+
id("org.jetbrains.kotlin.jvm") version "1.4.10"
55
id("org.jlleitschuh.gradle.ktlint") version "9.3.0"
66
id("jacoco")
77
}
88

99
group = "com.mapk"
10-
version = "0.17"
10+
version = "0.18"
1111

1212
java {
1313
sourceCompatibility = JavaVersion.VERSION_1_8

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.mapk.core
33
import com.mapk.annotations.KParameterFlatten
44
import com.mapk.core.internal.ArgumentBinder
55
import com.mapk.core.internal.BucketGenerator
6+
import com.mapk.core.internal.FullInitializedFunctionWrapper
67
import com.mapk.core.internal.ParameterNameConverter
78
import com.mapk.core.internal.getAliasOrName
89
import com.mapk.core.internal.getKConstructor
@@ -26,6 +27,9 @@ class KFunctionForCall<T> internal constructor(
2627
instance
2728
)
2829

30+
@TestOnly
31+
internal val fullInitializedWrapper: FullInitializedFunctionWrapper<T>
32+
2933
@TestOnly
3034
internal val parameters: List<KParameter> = function.parameters
3135

@@ -42,6 +46,8 @@ class KFunctionForCall<T> internal constructor(
4246
// この関数には確実にアクセスするためアクセシビリティ書き換え
4347
function.isAccessible = true
4448

49+
fullInitializedWrapper = FullInitializedFunctionWrapper(function, instance, parameters.size)
50+
4551
val tempBinders = ArrayList<ArgumentBinder>()
4652
val tempList = ArrayList<ValueParameter<*>>()
4753
val tempMap = HashMap<String, ValueParameter<*>>()
@@ -80,7 +86,7 @@ class KFunctionForCall<T> internal constructor(
8086

8187
fun call(adaptor: ArgumentAdaptor): T {
8288
val bucket = bucketGenerator.generate(adaptor)
83-
return if (bucket.isInitialized) function.call(*bucket.valueArray) else function.callBy(bucket)
89+
return if (bucket.isInitialized) fullInitializedWrapper.call(bucket.valueArray) else function.callBy(bucket)
8490
}
8591
}
8692

src/main/kotlin/com/mapk/core/internal/ArgumentBucket.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import kotlin.reflect.KParameter
77
internal class ArgumentBucket(
88
private val keyList: List<KParameter>,
99
val valueArray: Array<Any?>,
10-
initializationStatus: Array<Boolean>,
10+
initializationStatus: BooleanArray,
1111
argumentBinders: List<ArgumentBinder>,
1212
adaptor: ArgumentAdaptor
1313
) : Map<KParameter, Any?> {

src/main/kotlin/com/mapk/core/internal/BucketGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ internal class BucketGenerator(
99
instance: Any?
1010
) {
1111
private val originalValueArray: Array<Any?> = arrayOfNulls(parameters.size)
12-
private val originalInitializationStatus: Array<Boolean> = Array(parameters.size) { false }
12+
private val originalInitializationStatus: BooleanArray = BooleanArray(parameters.size)
1313

1414
init {
1515
if (instance != null) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.mapk.core.internal
2+
3+
import kotlin.reflect.KFunction
4+
import kotlin.reflect.jvm.javaConstructor
5+
import kotlin.reflect.jvm.javaMethod
6+
7+
internal class FullInitializedFunctionWrapper<T>(function: KFunction<T>, instance: Any?, paramSize: Int) {
8+
private val lambda: (Array<Any?>) -> T
9+
10+
init {
11+
val constructor = function.javaConstructor
12+
13+
lambda = when {
14+
constructor != null -> {
15+
{ constructor.newInstance(*it) }
16+
}
17+
instance != null -> {
18+
val method = function.javaMethod!!
19+
20+
@Suppress("UNCHECKED_CAST") { method.invoke(instance, *(it.copyOfRange(1, paramSize))) as T }
21+
}
22+
else -> {
23+
{ function.call(*it) }
24+
}
25+
}
26+
}
27+
28+
fun call(args: Array<Any?>): T = lambda(args)
29+
}

src/test/kotlin/com/mapk/core/KFunctionForCallTest.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ class KFunctionForCallTest {
5151
fun fromCompanionObject() {
5252
val function = Companion::class.functions
5353
.first { it.name == (KFunctionForCallTest)::declaredOnCompanionObject.name }
54-
.let { spyk(it) }
5554

5655
val kFunctionForCall = KFunctionForCall(function, { it }, Companion)
5756

@@ -60,7 +59,6 @@ class KFunctionForCallTest {
6059
adaptor.putIfAbsent("arg2", 2)
6160
val result = kFunctionForCall.call(adaptor)
6261
assertEquals("12", result)
63-
verify(exactly = 1) { function.call(*anyVararg()) }
6462
}
6563

6664
private fun func(key: String, value: String = "default"): Pair<String, String> = key to value
@@ -84,7 +82,6 @@ class KFunctionForCallTest {
8482
fun multipleCall() {
8583
val function = Companion::class.functions
8684
.first { it.name == (KFunctionForCallTest)::declaredOnCompanionObject.name }
87-
.let { spyk(it) }
8885

8986
val kFunctionForCall = KFunctionForCall(function, { it }, Companion)
9087

@@ -101,8 +98,6 @@ class KFunctionForCallTest {
10198
.forEach { adaptor2.putIfAbsent(it.name!!, it.index + 1) }
10299
val result2 = kFunctionForCall.call(adaptor2)
103100
assertEquals("23", result2)
104-
105-
verify(exactly = 2) { function.call(*anyVararg()) }
106101
}
107102
}
108103

src/test/kotlin/com/mapk/core/KParameterFlattenTest.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package com.mapk.core
22

33
import com.mapk.annotations.KConstructor
44
import com.mapk.annotations.KParameterFlatten
5-
import io.mockk.spyk
6-
import io.mockk.verify
75
import org.junit.jupiter.api.Assertions.assertEquals
86
import org.junit.jupiter.api.Assertions.assertTrue
97
import org.junit.jupiter.api.DisplayName
@@ -44,8 +42,7 @@ class KParameterFlattenTest {
4442

4543
@Test
4644
fun test() {
47-
val spiedFunction = spyk(::Dst)
48-
val function = KFunctionForCall(spiedFunction, { it })
45+
val function = KFunctionForCall(::Dst, { it })
4946

5047
function.requiredParameters.forEach {
5148
assertTrue(expectedParams.contains(it.name))
@@ -59,6 +56,5 @@ class KParameterFlattenTest {
5956

6057
val actual = function.call(adaptor)
6158
assertEquals(expected, actual)
62-
verify(exactly = 1) { spiedFunction.call(*anyVararg()) }
6359
}
6460
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.mapk.core.internal
2+
3+
import org.junit.jupiter.api.Assertions.assertEquals
4+
import org.junit.jupiter.api.DisplayName
5+
import org.junit.jupiter.api.Nested
6+
import org.junit.jupiter.api.Test
7+
import kotlin.reflect.full.companionObject
8+
import kotlin.reflect.full.companionObjectInstance
9+
import kotlin.reflect.full.functions
10+
11+
@DisplayName("完全初期化時呼び出しのテスト")
12+
class FullInitializedFunctionWrapperTest {
13+
data class Dst(val foo: Int, val bar: String) {
14+
companion object {
15+
fun of(foo: Int, bar: String) = Dst(foo, bar)
16+
}
17+
}
18+
fun instanceMethod(foo: Int, bar: String) = Dst(foo, bar)
19+
private val expected = Dst(1, "2")
20+
21+
@Test
22+
@DisplayName("コンストラクタの場合")
23+
fun constructorTest() {
24+
val fullInitializedFunctionWrapper = FullInitializedFunctionWrapper(::Dst, null, 2)
25+
assertEquals(expected, fullInitializedFunctionWrapper.call(arrayOf(1, "2")))
26+
}
27+
28+
@Test
29+
@DisplayName("コンパニオンオブジェクトに定義した関数の場合")
30+
fun companionObjectFunTest() {
31+
val func = Dst::class.companionObject!!.functions.first { it.name == "of" }
32+
val instance = Dst::class.companionObjectInstance!!
33+
val fullInitializedFunctionWrapper = FullInitializedFunctionWrapper(
34+
func, instance, 3
35+
)
36+
assertEquals(expected, fullInitializedFunctionWrapper.call(arrayOf(instance, 1, "2")))
37+
}
38+
39+
@Nested
40+
@DisplayName("その他の場合")
41+
inner class OthersTest {
42+
@Test
43+
@DisplayName("コンパニオンオブジェクトに定義した関数をメソッドリファレンスで取得した場合")
44+
fun companionObjectFunByMethodReferenceTest() {
45+
val fullInitializedFunctionWrapper = FullInitializedFunctionWrapper((Dst)::of, null, 2)
46+
assertEquals(expected, fullInitializedFunctionWrapper.call(arrayOf(1, "2")))
47+
}
48+
49+
@Test
50+
@DisplayName("インスタンスメソッドの場合")
51+
fun instanceMethodTest() {
52+
val fullInitializedFunctionWrapper = FullInitializedFunctionWrapper(::instanceMethod, null, 2)
53+
assertEquals(expected, fullInitializedFunctionWrapper.call(arrayOf(1, "2")))
54+
}
55+
}
56+
}

0 commit comments

Comments
 (0)