@@ -4,11 +4,12 @@ import com.mapk.annotations.KConverter
4
4
import com.mapk.conversion.KConvertBy
5
5
import com.mapk.core.KFunctionWithInstance
6
6
import com.mapk.core.ValueParameter
7
+ import com.mapk.core.getAnnotatedFunctions
8
+ import com.mapk.core.getAnnotatedFunctionsFromCompanionObject
9
+ import com.mapk.core.getKClass
7
10
import kotlin.reflect.KClass
8
11
import kotlin.reflect.KFunction
9
- import kotlin.reflect.full.companionObjectInstance
10
12
import kotlin.reflect.full.findAnnotation
11
- import kotlin.reflect.full.functions
12
13
import kotlin.reflect.full.isSubclassOf
13
14
import kotlin.reflect.full.primaryConstructor
14
15
import kotlin.reflect.full.staticFunctions
@@ -18,11 +19,11 @@ internal fun <T : Any> KClass<T>.getConverters(): Set<Pair<KClass<*>, KFunction<
18
19
convertersFromConstructors(this ) + convertersFromStaticMethods(this ) + convertersFromCompanionObject(this )
19
20
20
21
private 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 >()
22
23
.map { func ->
23
24
func.isAccessible = true
24
25
25
- ( func.parameters.single().type.classifier as KClass < * > ) to func
26
+ func.parameters.single().getKClass( ) to func
26
27
}.toSet()
27
28
}
28
29
@@ -39,17 +40,12 @@ private fun <T : Any> convertersFromStaticMethods(clazz: KClass<T>): Set<Pair<KC
39
40
40
41
@Suppress(" UNCHECKED_CAST" )
41
42
private 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 >
50
46
51
- ( func.parameters.single().type.classifier as KClass < * > ) to func
52
- }.toSet()
47
+ func.parameters.single().getKClass( ) to func
48
+ }.toSet()
53
49
} ? : emptySet()
54
50
}
55
51
0 commit comments