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

Commit 61a398e

Browse files
authored
Merge pull request #29 from k163377/feature
Fine-grained optimization.
2 parents 561258a + 8bb4199 commit 61a398e

File tree

4 files changed

+27
-25
lines changed

4 files changed

+27
-25
lines changed

build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66
}
77

88
group = "com.mapk"
9-
version = "0.15"
9+
version = "0.16"
1010

1111
java {
1212
sourceCompatibility = JavaVersion.VERSION_1_8
@@ -37,7 +37,7 @@ dependencies {
3737
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
3838
}
3939
// https://mvnrepository.com/artifact/io.mockk/mockk
40-
testImplementation("io.mockk:mockk:1.9.3")
40+
testImplementation("io.mockk:mockk:1.10.0")
4141
}
4242

4343
tasks {

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

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class KFunctionForCall<T> internal constructor(
2222
parameterNameConverter: ParameterNameConverter,
2323
instance: Any? = null
2424
) {
25-
constructor(function: KFunction<T>, parameterNameConverter: (String) -> String, instance: Any? = null) : this(
25+
constructor(function: KFunction<T>, parameterNameConverter: ((String) -> String)?, instance: Any? = null) : this(
2626
function,
2727
ParameterNameConverter.Simple(parameterNameConverter),
2828
instance
@@ -44,24 +44,25 @@ class KFunctionForCall<T> internal constructor(
4444
// この関数には確実にアクセスするためアクセシビリティ書き換え
4545
function.isAccessible = true
4646

47-
val binders: List<ArgumentBinder> = parameters
48-
.filter { it.kind == KParameter.Kind.VALUE && !it.isUseDefaultArgument() }
49-
.map { it.toArgumentBinder(parameterNameConverter) }
47+
val tempBinders = ArrayList<ArgumentBinder>()
48+
val tempList = ArrayList<ValueParameter<*>>()
49+
val tempMap = HashMap<String, ValueParameter<*>>()
5050

51-
bucketGenerator = BucketGenerator(parameters, binders, instance)
51+
parameters.forEach { param ->
52+
if (param.kind == KParameter.Kind.VALUE && !param.isUseDefaultArgument()) {
53+
val binder = param.toArgumentBinder(parameterNameConverter)
54+
tempBinders.add(binder)
5255

53-
val tempList = ArrayList<ValueParameter<*>>(binders.size)
54-
val tempMap = HashMap<String, ValueParameter<*>>(binders.size)
55-
56-
binders.forEach { binder ->
57-
when (binder) {
58-
is ArgumentBinder.Value<*> -> addArgs(binder, tempList, tempMap)
59-
is ArgumentBinder.Function -> binder.requiredParameters.forEach {
60-
addArgs(it, tempList, tempMap)
56+
when (binder) {
57+
is ArgumentBinder.Value<*> -> addArgs(binder, tempList, tempMap)
58+
is ArgumentBinder.Function -> binder.requiredParameters.forEach {
59+
addArgs(it, tempList, tempMap)
60+
}
6161
}
6262
}
6363
}
6464

65+
bucketGenerator = BucketGenerator(parameters, tempBinders, instance)
6566
requiredParameters = tempList
6667
requiredParametersMap = tempMap
6768
}
@@ -107,7 +108,7 @@ internal fun <T : Any> KClass<T>.toKConstructor(parameterNameConverter: Paramete
107108
}
108109

109110
@Suppress("UNCHECKED_CAST")
110-
fun <T : Any> KClass<T>.toKConstructor(parameterNameConverter: (String) -> String): KFunctionForCall<T> =
111+
fun <T : Any> KClass<T>.toKConstructor(parameterNameConverter: ((String) -> String)?): KFunctionForCall<T> =
111112
this.toKConstructor(ParameterNameConverter.Simple(parameterNameConverter))
112113

113114
private fun KParameter.toArgumentBinder(parameterNameConverter: ParameterNameConverter): ArgumentBinder {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ internal class ArgumentBucket(
3131
}
3232
}
3333

34-
initializationStatuses = initializationStatus.toList()
34+
initializationStatuses = initializationStatus.asList()
3535
isInitialized = count == initializationStatus.size
3636
size = count
3737
}

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,28 @@ package com.mapk.core.internal
22

33
import com.mapk.core.NameJoiner
44

5-
internal sealed class ParameterNameConverter {
6-
protected abstract val converter: (String) -> String
5+
internal sealed class ParameterNameConverter(protected val converter: ((String) -> String)?) {
76
abstract fun convert(name: String): String
87
abstract fun nest(infix: String, nameJoiner: NameJoiner): WithPrefix
98
abstract fun toSimple(): Simple
109

11-
class Simple(override val converter: (String) -> String) : ParameterNameConverter() {
12-
override fun convert(name: String) = converter(name)
10+
protected fun convertedOrName(name: String): String = converter?.invoke(name) ?: name
11+
12+
class Simple(converter: ((String) -> String)?) : ParameterNameConverter(converter) {
13+
override fun convert(name: String) = convertedOrName(name)
1314
override fun nest(infix: String, nameJoiner: NameJoiner) = WithPrefix(infix, nameJoiner, converter)
1415
override fun toSimple(): Simple = this
1516
}
1617

1718
class WithPrefix(
1819
prefix: String,
1920
private val nameJoiner: NameJoiner,
20-
override val converter: (String) -> String
21-
) : ParameterNameConverter() {
22-
private val prefix = converter(prefix)
21+
converter: ((String) -> String)?
22+
) : ParameterNameConverter(converter) {
23+
private val prefix = convertedOrName(prefix)
2324

2425
// 結合を伴う変換では、「双方変換 -> 結合」の順で処理を行う
25-
override fun convert(name: String) = converter(name).let { nameJoiner.join(prefix, it) }
26+
override fun convert(name: String) = convertedOrName(name).let { nameJoiner.join(prefix, it) }
2627
override fun nest(infix: String, nameJoiner: NameJoiner) = WithPrefix(convert(infix), nameJoiner, converter)
2728
override fun toSimple(): Simple = Simple(converter)
2829
}

0 commit comments

Comments
 (0)