7
7
* https://github.com/mamoe/mirai/blob/dev/LICENSE
8
8
*/
9
9
10
- package net.mamoe.mirai.internal.utils.codegen
11
-
12
- import net.mamoe.mirai.utils.cast
13
- import kotlin.reflect.KClass
10
+ package net.mamoe.mirai.internal.testFramework.codegen
11
+
12
+ import net.mamoe.mirai.internal.testFramework.codegen.descriptors.ClassValueDesc
13
+ import net.mamoe.mirai.internal.testFramework.codegen.descriptors.ValueDesc
14
+ import net.mamoe.mirai.internal.testFramework.codegen.descriptors.accept
15
+ import net.mamoe.mirai.internal.testFramework.codegen.visitor.ValueDescVisitorUnit
16
+ import net.mamoe.mirai.internal.testFramework.codegen.visitors.AnalyzeDefaultValuesMappingVisitor
17
+ import net.mamoe.mirai.internal.testFramework.codegen.visitors.DefaultValuesMapping
14
18
import kotlin.reflect.KParameter
15
- import kotlin.reflect.KProperty
16
- import kotlin.reflect.KProperty1
17
- import kotlin.reflect.full.memberProperties
18
- import kotlin.reflect.full.primaryConstructor
19
-
20
- interface ValueDescVisitor {
21
- fun visitValue (desc : ValueDesc ) {}
22
-
23
- fun visitPlain (desc : PlainValueDesc ) {
24
- visitValue(desc)
25
- }
26
-
27
- fun visitArray (desc : ArrayValueDesc ) {
28
- visitValue(desc)
29
- for (element in desc.elements) {
30
- element.accept(this )
31
- }
32
- }
33
-
34
- fun visitObjectArray (desc : ObjectArrayValueDesc ) {
35
- visitArray(desc)
36
- }
37
19
38
- fun visitCollection (desc : CollectionValueDesc ) {
39
- visitArray(desc)
40
- }
41
20
42
- fun visitMap (desc : MapValueDesc ) {
43
- visitValue(desc)
44
- for ((key, value) in desc.elements.entries) {
45
- key.accept(this )
46
- value.accept(this )
47
- }
48
- }
49
-
50
- fun visitPrimitiveArray (desc : PrimitiveArrayValueDesc ) {
51
- visitArray(desc)
52
- }
53
-
54
- fun <T : Any > visitClass (desc : ClassValueDesc <T >) {
55
- visitValue(desc)
56
- desc.properties.forEach { (_, u) ->
57
- u.accept(this )
58
- }
59
- }
60
- }
61
-
62
-
63
- class DefaultValuesMapping (
64
- val forClass : KClass <* >,
65
- val mapping : MutableMap <String , Any ?> = mutableMapOf()
66
- ) {
67
- operator fun get (property : KProperty <* >): Any? = mapping[property.name]
68
- }
69
-
70
- class AnalyzeDefaultValuesMappingVisitor : ValueDescVisitor {
71
- val mappings: MutableList <DefaultValuesMapping > = mutableListOf ()
72
-
73
- override fun <T : Any > visitClass (desc : ClassValueDesc <T >) {
74
- super .visitClass(desc)
75
-
76
- if (mappings.any { it.forClass == desc.type }) return
77
-
78
- val defaultInstance =
79
- createInstanceWithMostDefaultValues(desc.type, desc.properties.mapValues { it.value.origin })
80
-
81
- val optionalParameters = desc.type.primaryConstructor!! .parameters.filter { it.isOptional }
82
-
83
- mappings.add(
84
- DefaultValuesMapping (
85
- desc.type,
86
- optionalParameters.associateTo(mutableMapOf ()) { param ->
87
- val value = findCorrespondingProperty(desc, param).get(defaultInstance)
88
- param.name!! to value
89
- }
90
- )
91
- )
92
- }
93
-
94
-
95
- private fun <T : Any > findCorrespondingProperty (
96
- desc : ClassValueDesc <T >,
97
- param : KParameter
98
- ) = desc.type.memberProperties.single { it.name == param.name }.cast<KProperty1 <Any , Any >>()
99
-
100
- private fun <T : Any > createInstanceWithMostDefaultValues (clazz : KClass <T >, arguments : Map <KParameter , Any ?>): T {
101
- val primaryConstructor = clazz.primaryConstructor ? : error(" Type $clazz does not have primary constructor." )
102
- return primaryConstructor.callBy(arguments.filter { ! it.key.isOptional })
103
- }
21
+ fun ValueDesc.removeDefaultValues (): ValueDesc {
22
+ val def = AnalyzeDefaultValuesMappingVisitor ()
23
+ this .accept(def)
24
+ this .accept(RemoveDefaultValuesVisitor (def.mappings))
25
+ return this
104
26
}
105
27
106
28
class RemoveDefaultValuesVisitor (
107
29
private val mappings : MutableList <DefaultValuesMapping >,
108
- ) : ValueDescVisitor {
109
- override fun <T : Any > visitClass (desc : ClassValueDesc <T >) {
110
- super .visitClass(desc)
30
+ ) : ValueDescVisitorUnit {
31
+ override fun visitValue (desc : ValueDesc , data : Nothing? ) {
32
+ desc.acceptChildren(this , data)
33
+ }
34
+
35
+ override fun <T : Any > visitClass (desc : ClassValueDesc <T >, data : Nothing? ) {
36
+ super .visitClass(desc, data)
111
37
val mapping = mappings.find { it.forClass == desc.type }?.mapping ? : return
112
38
113
39
// remove properties who have the same values as their default values, this would significantly reduce code size.
@@ -175,4 +101,4 @@ class RemoveDefaultValuesVisitor(
175
101
else -> false
176
102
}
177
103
}
178
- }
104
+ }
0 commit comments