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

Commit 7b2b812

Browse files
authored
Merge pull request #30 from k163377/refactors
Refactor.
2 parents 61a398e + d4c4c54 commit 7b2b812

File tree

2 files changed

+34
-27
lines changed

2 files changed

+34
-27
lines changed

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

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
package com.mapk.core
22

3-
import com.mapk.annotations.KConstructor
43
import com.mapk.annotations.KParameterFlatten
54
import com.mapk.core.internal.ArgumentBinder
65
import com.mapk.core.internal.BucketGenerator
76
import com.mapk.core.internal.ParameterNameConverter
87
import com.mapk.core.internal.getAliasOrName
8+
import com.mapk.core.internal.getKConstructor
99
import com.mapk.core.internal.isUseDefaultArgument
1010
import kotlin.reflect.KClass
1111
import kotlin.reflect.KFunction
1212
import kotlin.reflect.KParameter
1313
import kotlin.reflect.full.findAnnotation
14-
import kotlin.reflect.full.primaryConstructor
1514
import kotlin.reflect.jvm.isAccessible
16-
import kotlin.reflect.jvm.jvmName
1715
import org.jetbrains.annotations.TestOnly
1816

1917
class KFunctionForCall<T> internal constructor(
@@ -86,30 +84,10 @@ class KFunctionForCall<T> internal constructor(
8684
}
8785
}
8886

89-
@Suppress("UNCHECKED_CAST")
90-
internal fun <T : Any> KClass<T>.toKConstructor(parameterNameConverter: ParameterNameConverter): KFunctionForCall<T> {
91-
val constructors = ArrayList<KFunctionForCall<T>>()
92-
93-
this.getAnnotatedFunctionsFromCompanionObject<KConstructor>()?.let { (instance, functions) ->
94-
functions.forEach {
95-
constructors.add(KFunctionForCall(it as KFunction<T>, parameterNameConverter, instance))
96-
}
97-
}
98-
99-
this.constructors.getAnnotatedFunctions<KConstructor, T>().forEach {
100-
constructors.add(KFunctionForCall(it, parameterNameConverter))
101-
}
102-
103-
if (constructors.size == 1) return constructors.single()
104-
105-
if (constructors.isEmpty()) return KFunctionForCall(this.primaryConstructor!!, parameterNameConverter)
106-
107-
throw IllegalArgumentException("${this.jvmName} has multiple ${KConstructor::class.jvmName}.")
108-
}
109-
110-
@Suppress("UNCHECKED_CAST")
11187
fun <T : Any> KClass<T>.toKConstructor(parameterNameConverter: ((String) -> String)?): KFunctionForCall<T> =
112-
this.toKConstructor(ParameterNameConverter.Simple(parameterNameConverter))
88+
this.getKConstructor().let { (instance, function) ->
89+
KFunctionForCall(function, ParameterNameConverter.Simple(parameterNameConverter), instance)
90+
}
11391

11492
private fun KParameter.toArgumentBinder(parameterNameConverter: ParameterNameConverter): ArgumentBinder {
11593
val name = getAliasOrName()!!
@@ -124,7 +102,9 @@ private fun KParameter.toArgumentBinder(parameterNameConverter: ParameterNameCon
124102
parameterNameConverter.toSimple()
125103
}
126104

127-
ArgumentBinder.Function(getKClass().toKConstructor(converter), index, annotations)
105+
getKClass().getKConstructor().let { (instance, function) ->
106+
ArgumentBinder.Function(KFunctionForCall(function, converter, instance), index, annotations)
107+
}
128108
} ?: ArgumentBinder.Value(
129109
index,
130110
annotations,

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package com.mapk.core.internal
22

3+
import com.mapk.annotations.KConstructor
34
import com.mapk.annotations.KParameterAlias
45
import com.mapk.annotations.KUseDefaultArgument
6+
import com.mapk.core.getAnnotatedFunctions
7+
import com.mapk.core.getAnnotatedFunctionsFromCompanionObject
58
import java.lang.IllegalArgumentException
9+
import kotlin.reflect.KClass
10+
import kotlin.reflect.KFunction
611
import kotlin.reflect.KParameter
712
import kotlin.reflect.full.findAnnotation
13+
import kotlin.reflect.full.primaryConstructor
814
import kotlin.reflect.jvm.jvmName
915

1016
/**
@@ -24,3 +30,24 @@ internal fun KParameter.isUseDefaultArgument(): Boolean {
2430
}
2531
return false
2632
}
33+
34+
@Suppress("UNCHECKED_CAST")
35+
internal fun <T : Any> KClass<T>.getKConstructor(): Pair<Any?, KFunction<T>> {
36+
val constructors = ArrayList<Pair<Any?, KFunction<T>>>()
37+
38+
this.getAnnotatedFunctionsFromCompanionObject<KConstructor>()?.let { (instance, functions) ->
39+
functions.forEach {
40+
constructors.add(instance to it as KFunction<T>)
41+
}
42+
}
43+
44+
this.constructors.getAnnotatedFunctions<KConstructor, T>().forEach {
45+
constructors.add(null to it)
46+
}
47+
48+
if (constructors.size == 1) return constructors.single()
49+
50+
if (constructors.isEmpty()) return null to this.primaryConstructor!!
51+
52+
throw IllegalArgumentException("${this.jvmName} has multiple ${KConstructor::class.jvmName}.")
53+
}

0 commit comments

Comments
 (0)