11package com.mapk.kmapper
22
3- import com.mapk.annotations.KConstructor
43import com.mapk.annotations.KGetterAlias
54import com.mapk.annotations.KGetterIgnore
6- import com.mapk.annotations.KParameterAlias
75import com.mapk.core.ArgumentBucket
86import com.mapk.core.EnumMapper
97import com.mapk.core.KFunctionForCall
8+ import com.mapk.core.getAliasOrName
9+ import com.mapk.core.toKConstructor
1010import java.lang.reflect.Method
1111import kotlin.reflect.KClass
1212import kotlin.reflect.KFunction
1313import kotlin.reflect.KParameter
1414import kotlin.reflect.KVisibility
15- import kotlin.reflect.full.companionObjectInstance
16- import kotlin.reflect.full.findAnnotation
17- import kotlin.reflect.full.functions
1815import kotlin.reflect.full.isSuperclassOf
1916import kotlin.reflect.full.memberProperties
20- import kotlin.reflect.full.primaryConstructor
2117import kotlin.reflect.jvm.javaGetter
2218
2319class KMapper <T : Any > private constructor(
@@ -29,15 +25,12 @@ class KMapper<T : Any> private constructor(
2925 )
3026
3127 constructor (clazz: KClass <T >, propertyNameConverter: (String ) -> String = { it }) : this (
32- getTarget( clazz), propertyNameConverter
28+ clazz.toKConstructor( ), propertyNameConverter
3329 )
3430
3531 private val parameterMap: Map <String , ParameterForMap <* >> = function.parameters
3632 .filter { it.kind != KParameter .Kind .INSTANCE }
37- .associate {
38- (it.findAnnotation<KParameterAlias >()?.value ? : propertyNameConverter(it.name!! )) to
39- ParameterForMap .newInstance(it)
40- }
33+ .associate { (propertyNameConverter(it.getAliasOrName()!! )) to ParameterForMap .newInstance(it) }
4134
4235 private fun bindArguments (argumentBucket : ArgumentBucket , src : Any ) {
4336 src::class .memberProperties.forEach outer@{ property ->
@@ -117,29 +110,6 @@ class KMapper<T : Any> private constructor(
117110 }
118111}
119112
120- @Suppress(" UNCHECKED_CAST" )
121- internal fun <T : Any > getTarget (clazz : KClass <T >): KFunctionForCall <T > {
122- val factoryConstructor: List <KFunctionForCall <T >> =
123- clazz.companionObjectInstance?.let { companionObject ->
124- companionObject::class .functions
125- .filter { it.annotations.any { annotation -> annotation is KConstructor } }
126- .map { KFunctionForCall (
127- it,
128- companionObject
129- ) as KFunctionForCall <T > }
130- } ? : emptyList()
131-
132- val constructors: List <KFunctionForCall <T >> = factoryConstructor + clazz.constructors
133- .filter { it.annotations.any { annotation -> annotation is KConstructor } }
134- .map { KFunctionForCall (it) }
135-
136- if (constructors.size == 1 ) return constructors.single()
137-
138- if (constructors.isEmpty()) return KFunctionForCall (clazz.primaryConstructor!! )
139-
140- throw IllegalArgumentException (" Find multiple target." )
141- }
142-
143113private fun <T : Any , R : Any > mapObject (param : ParameterForMap <R >, value : T ): Any? {
144114 val valueClazz: KClass <* > = value::class
145115
0 commit comments