@@ -4,11 +4,12 @@ import com.mapk.annotations.KConverter
44import com.mapk.conversion.KConvertBy
55import com.mapk.core.KFunctionWithInstance
66import com.mapk.core.ValueParameter
7+ import com.mapk.core.getAnnotatedFunctions
8+ import com.mapk.core.getAnnotatedFunctionsFromCompanionObject
9+ import com.mapk.core.getKClass
710import kotlin.reflect.KClass
811import kotlin.reflect.KFunction
9- import kotlin.reflect.full.companionObjectInstance
1012import kotlin.reflect.full.findAnnotation
11- import kotlin.reflect.full.functions
1213import kotlin.reflect.full.isSubclassOf
1314import kotlin.reflect.full.primaryConstructor
1415import kotlin.reflect.full.staticFunctions
@@ -18,11 +19,11 @@ internal fun <T : Any> KClass<T>.getConverters(): Set<Pair<KClass<*>, KFunction<
1819 convertersFromConstructors(this ) + convertersFromStaticMethods(this ) + convertersFromCompanionObject(this )
1920
2021private fun <T > Collection<KFunction<T>>.getConvertersFromFunctions (): Set <Pair <KClass <* >, KFunction<T>>> {
21- return filter { it.annotations.any { annotation -> annotation is KConverter } }
22+ return this .getAnnotatedFunctions< KConverter , T >()
2223 .map { func ->
2324 func.isAccessible = true
2425
25- ( func.parameters.single().type.classifier as KClass < * > ) to func
26+ func.parameters.single().getKClass( ) to func
2627 }.toSet()
2728}
2829
@@ -39,17 +40,12 @@ private fun <T : Any> convertersFromStaticMethods(clazz: KClass<T>): Set<Pair<KC
3940
4041@Suppress(" UNCHECKED_CAST" )
4142private fun <T : Any > convertersFromCompanionObject (clazz : KClass <T >): Set <Pair <KClass <* >, KFunction<T>>> {
42- return clazz.companionObjectInstance?.let { companionObject ->
43- companionObject::class .functions
44- .filter { it.annotations.any { annotation -> annotation is KConverter } }
45- .map { function ->
46- val func: KFunction <T > = KFunctionWithInstance (
47- function,
48- companionObject
49- ) as KFunction <T >
43+ return clazz.getAnnotatedFunctionsFromCompanionObject<KConverter >()?.let { (instance, functions) ->
44+ functions.map { function ->
45+ val func: KFunction <T > = KFunctionWithInstance (function, instance) as KFunction <T >
5046
51- ( func.parameters.single().type.classifier as KClass < * > ) to func
52- }.toSet()
47+ func.parameters.single().getKClass( ) to func
48+ }.toSet()
5349 } ? : emptySet()
5450}
5551
0 commit comments