1
1
package org.utbot.python.framework.codegen.model.constructor.tree
2
2
3
3
import org.utbot.framework.codegen.domain.context.CgContext
4
+ import org.utbot.framework.codegen.domain.models.CgAssignment
4
5
import org.utbot.framework.codegen.domain.models.CgConstructorCall
6
+ import org.utbot.framework.codegen.domain.models.CgFieldAccess
5
7
import org.utbot.framework.codegen.domain.models.CgLiteral
8
+ import org.utbot.framework.codegen.domain.models.CgMethodCall
9
+ import org.utbot.framework.codegen.domain.models.CgStatement
6
10
import org.utbot.framework.codegen.domain.models.CgValue
7
11
import org.utbot.framework.codegen.domain.models.CgVariable
8
12
import org.utbot.framework.codegen.tree.CgTestClassConstructor
9
13
import org.utbot.framework.codegen.tree.CgVariableConstructor
10
14
import org.utbot.framework.plugin.api.ConstructorId
15
+ import org.utbot.framework.plugin.api.FieldId
11
16
import org.utbot.framework.plugin.api.UtModel
12
17
import org.utbot.python.framework.api.python.*
18
+ import org.utbot.python.framework.api.python.util.pythonNoneClassId
19
+ import org.utbot.python.framework.codegen.PythonCgLanguageAssistant
13
20
import org.utbot.python.framework.codegen.model.tree.*
14
21
15
22
class PythonCgVariableConstructor (context_ : CgContext ) : CgVariableConstructor(context_) {
@@ -21,7 +28,10 @@ class PythonCgVariableConstructor(context_: CgContext) : CgVariableConstructor(c
21
28
when (model) {
22
29
is PythonBoolModel -> CgLiteral (model.classId, model.value)
23
30
is PythonPrimitiveModel -> CgLiteral (model.classId, model.value)
24
- is PythonTreeModel -> CgPythonTree (model.classId, model.tree)
31
+ is PythonTreeModel -> {
32
+ val (value, children) = pythonBuildObject2(model.tree)
33
+ CgPythonTree (model.classId, model.tree, value, children)
34
+ }
25
35
is PythonInitObjectModel -> constructInitObjectModel(model, baseName)
26
36
is PythonDictModel -> CgPythonDict (model.stores.map {
27
37
getOrCreateVariable(it.key) to getOrCreateVariable(
@@ -47,4 +57,115 @@ class PythonCgVariableConstructor(context_: CgContext) : CgVariableConstructor(c
47
57
)
48
58
}
49
59
}
60
+
61
+ fun pythonBuildObject2 (objectNode : PythonTree .PythonTreeNode ): Pair <CgValue , List <CgStatement >> {
62
+ return when (objectNode) {
63
+ is PythonTree .PrimitiveNode -> {
64
+ Pair (CgLiteral (objectNode.type, objectNode.repr), emptyList())
65
+ }
66
+
67
+ is PythonTree .ListNode -> {
68
+ val items = objectNode.items.values.map { pythonBuildObject2(it) }
69
+ Pair (CgPythonList (items.map { it.first }), items.flatMap { it.second })
70
+ }
71
+
72
+ is PythonTree .TupleNode -> {
73
+ val items = objectNode.items.values.map { pythonBuildObject2(it) }
74
+ Pair (CgPythonTuple (items.map { it.first }), items.flatMap { it.second })
75
+ }
76
+
77
+ is PythonTree .SetNode -> {
78
+ val items = objectNode.items.map { pythonBuildObject2(it) }
79
+ Pair (CgPythonSet (items.map { it.first }.toSet()), items.flatMap { it.second })
80
+ }
81
+
82
+ is PythonTree .DictNode -> {
83
+ val keys = objectNode.items.keys.map { pythonBuildObject2(it) }
84
+ val values = objectNode.items.values.map { pythonBuildObject2(it) }
85
+ Pair (CgPythonDict (
86
+ keys.zip(values).map { (key, value) ->
87
+ key.first to value.first
88
+ }.toMap()
89
+ ), keys.flatMap { it.second } + values.flatMap { it.second })
90
+ }
91
+
92
+ is PythonTree .ReduceNode -> {
93
+ val id = objectNode.id
94
+ val children = emptyList<CgStatement >().toMutableList()
95
+ if ((context.cgLanguageAssistant as PythonCgLanguageAssistant ).memoryObjects.containsKey(id)) {
96
+ return Pair (
97
+ (context.cgLanguageAssistant as PythonCgLanguageAssistant ).memoryObjects[id]!! ,
98
+ children
99
+ )
100
+ }
101
+
102
+ val initArgs = objectNode.args.map {
103
+ val buildObj = pythonBuildObject2(it)
104
+ children + = buildObj.second
105
+ buildObj.first
106
+ }
107
+ val constructor = ConstructorId (
108
+ objectNode.constructor ,
109
+ initArgs.map { it.type }
110
+ )
111
+ val constructorCall = CgConstructorCall (constructor , initArgs)
112
+ val obj = newVar(objectNode.type) {
113
+ constructorCall
114
+ }
115
+ children.add(CgAssignment (obj, constructorCall))
116
+
117
+ (context.cgLanguageAssistant as PythonCgLanguageAssistant ).memoryObjects[id] = obj
118
+
119
+ val state = objectNode.state.map { (key, value) ->
120
+ val buildObj = pythonBuildObject2(value)
121
+ children.addAll(buildObj.second)
122
+ key to buildObj.first
123
+ }.toMap()
124
+ val listitems = objectNode.listitems.map {
125
+ val buildObj = pythonBuildObject2(it)
126
+ children.addAll(buildObj.second)
127
+ buildObj.first
128
+ }
129
+ val dictitems = objectNode.dictitems.map { (key, value) ->
130
+ val keyObj = pythonBuildObject2(key)
131
+ val valueObj = pythonBuildObject2(value)
132
+ children.addAll(keyObj.second)
133
+ children.addAll(valueObj.second)
134
+ keyObj.first to valueObj.first
135
+ }
136
+
137
+ state.forEach { (key, value) ->
138
+ val fieldAccess = CgFieldAccess (obj, FieldId (objectNode.type, key))
139
+ children.add(CgAssignment (fieldAccess, value))
140
+ }
141
+ listitems.forEach {
142
+ val methodCall = CgMethodCall (
143
+ obj,
144
+ PythonMethodId (
145
+ obj.type as PythonClassId ,
146
+ " append" ,
147
+ NormalizedPythonAnnotation (pythonNoneClassId.name),
148
+ listOf (RawPythonAnnotation (it.type.name))
149
+ ),
150
+ listOf (it)
151
+ )
152
+ children.add(methodCall)
153
+ }
154
+ dictitems.forEach { (key, value) ->
155
+ val index = CgPythonIndex (
156
+ value.type as PythonClassId ,
157
+ obj,
158
+ key
159
+ )
160
+ children.add(CgAssignment (index, value))
161
+ }
162
+
163
+ return Pair (obj, children)
164
+ }
165
+
166
+ else -> {
167
+ throw UnsupportedOperationException ()
168
+ }
169
+ }
170
+ }
50
171
}
0 commit comments