1 /++
2 Used for debugging the astgen.
3 Contains functions to generate a readable string respresentation of AST nodes
4 +/
5 module qscript.compiler.astreadable;
6 
7 import qscript.compiler.ast;
8 
9 import utils.misc;
10 
11 import std.conv : to;
12 import std.json;
13 
14 // below comes a long list of functions to createJSONValue for each ASTNode
15 
16 /// Creates JSONValue for ScriptNode
17 JSONValue toJSON(ScriptNode node){
18 	JSONValue[] arrayJSON;
19 	arrayJSON.length = node.functions.length;
20 	foreach (i, fNode; node.functions){
21 		arrayJSON[i] = fNode.toJSON;
22 	}
23 	JSONValue r;
24 	r["node"] = JSONValue("ScriptNode");
25 	r["functions"] = JSONValue(arrayJSON.dup);
26 	arrayJSON.length = node.enums.length;
27 	foreach (i, enumNode; node.enums){
28 		arrayJSON[i] = enumNode.toJSON;
29 	}
30 	r["enums"] = JSONValue(arrayJSON.dup);
31 	arrayJSON.length = node.structs.length;
32 	foreach (i, structNode; node.structs){
33 		arrayJSON[i] = structNode.toJSON;
34 	}
35 	r["structs"] = JSONValue(arrayJSON.dup);
36 	arrayJSON.length = node.variables.length;
37 	foreach (i, var; node.variables){
38 		arrayJSON[i] = var.toJSON;
39 	}
40 	r["variables"] = JSONValue(arrayJSON.dup);
41 	arrayJSON.length = node.imports.length;
42 	foreach (i, importName; node.imports){
43 		arrayJSON[i] = JSONValue(importName);
44 	}
45 	r["imports"] = JSONValue(arrayJSON.dup);
46 	return r;
47 }
48 
49 /// Creates JSONValue for FunctionNode
50 JSONValue toJSON(FunctionNode node){
51 	JSONValue[] argListJSON;
52 	argListJSON.length = node.arguments.length;
53 	foreach (i, arg; node.arguments){
54 		argListJSON[i]["name"] = JSONValue(arg.argName);
55 		argListJSON[i]["type"] = JSONValue(arg.argType.name);
56 	}
57 	JSONValue bodyJSON = node.bodyBlock.toJSON;
58 	JSONValue r;
59 	r["node"] = JSONValue("FunctionNode");
60 	r["type"] = node.returnType.name;
61 	r["name"] = node.name;
62 	r["arguments"] = JSONValue(argListJSON);
63 	r["body"] = JSONValue(bodyJSON);
64 	r["id"] = JSONValue(node.id);
65 	r["lineno"] = JSONValue(node.lineno);
66 	r["visibility"] = JSONValue(node.visibility.to!string);
67 	r["varStackCount"] = JSONValue(node.varStackCount);
68 	return r;
69 }
70 
71 /// Creates JSONValue for StructNode
72 JSONValue toJSON(StructNode node){
73 	JSONValue r;
74 	r["node"] = JSONValue("ScriptNode");
75 	r["lineno"] = JSONValue(node.lineno);
76 	r["visibility"] = JSONValue(node.visibility.to!string);
77 	r["name"] = JSONValue(node.name);
78 	JSONValue[] members;
79 	members.length = node.membersName.length;
80 	foreach (i; 0 .. node.membersName.length){
81 		members[i]["name"] = JSONValue(node.membersName[i]);
82 		members[i]["type"] = JSONValue(node.membersDataType[i].name);
83 	}
84 	r["members"] = JSONValue(members);
85 	r["containsRef"] = JSONValue(node.containsRef.to!string);
86 	return r;
87 }
88 
89 /// Creates JSONValue for EnumNode
90 JSONValue toJSON(EnumNode node){
91 	JSONValue r;
92 	r["node"] = JSONValue("EnumNode");
93 	r["lineno"] = JSONValue(node.lineno);
94 	r["visibility"] = JSONValue(node.visibility.to!string);
95 	r["name"] = JSONValue(node.name);
96 	JSONValue[] members;
97 	members.length = node.members.length;
98 	foreach (i, name; node.members){
99 		members[i] = JSONValue(name);
100 	}
101 	r["members"] = JSONValue(members);
102 	return r;
103 }
104 
105 /// Creates JSONValue for BlockNode
106 JSONValue toJSON(BlockNode node){
107 	JSONValue[] statementListJSON;
108 	statementListJSON.length = node.statements.length;
109 	foreach (i, statement; node.statements){
110 		statementListJSON[i] = statement.toJSON;
111 	}
112 	JSONValue r;
113 	r["node"] = JSONValue("BlockNode");
114 	r["statements"] = JSONValue(statementListJSON);
115 	r["lineno"] = JSONValue(node.lineno);
116 	return r;
117 }
118 
119 /// Creates JSONValue for StatementNode
120 JSONValue toJSON(StatementNode node){
121 	JSONValue r;
122 	r["node"] = JSONValue("StatementNode");
123 	if (node.type == StatementNode.Type.Assignment){
124 		r["statement"] = node.node!(StatementNode.Type.Assignment).toJSON;
125 	}else if (node.type == StatementNode.Type.Block){
126 		r["statement"] = node.node!(StatementNode.Type.Block).toJSON;
127 	}else if (node.type == StatementNode.Type.DoWhile){
128 		r["statement"] = node.node!(StatementNode.Type.DoWhile).toJSON;
129 	}else if (node.type == StatementNode.Type.For){
130 		r["statement"] = node.node!(StatementNode.Type.For).toJSON;
131 	}else if (node.type == StatementNode.Type.FunctionCall){
132 		r["statement"] = node.node!(StatementNode.Type.FunctionCall).toJSON;
133 	}else if (node.type == StatementNode.Type.If){
134 		r["statement"] = node.node!(StatementNode.Type.If).toJSON;
135 	}else if (node.type == StatementNode.Type.VarDeclare){
136 		r["statement"] = node.node!(StatementNode.Type.VarDeclare).toJSON;
137 	}else if (node.type == StatementNode.Type.While){
138 		r["statement"] = node.node!(StatementNode.Type.While).toJSON;
139 	}else if (node.type == StatementNode.Type.Return){
140 		r["statement"] = node.node!(StatementNode.Type.Return).toJSON;
141 	}
142 	r["lineno"] = JSONValue(node.lineno);
143 	return r;
144 }
145 
146 /// Creates JSONValue for AssignmentNode
147 JSONValue toJSON(AssignmentNode node){
148 	JSONValue r;
149 	r["node"] = JSONValue("AssignmentNode");
150 	r["lineno"] = JSONValue(node.lineno);
151 	r["deref"] = JSONValue(node.deref.to!string);
152 	r["lvalue"] = node.lvalue.toJSON;
153 	r["rvalue"] = node.rvalue.toJSON;
154 	return r;
155 }
156 
157 /// Creates JSONValue for IfNode
158 JSONValue toJSON(IfNode node){
159 	JSONValue r;
160 	r["node"] = JSONValue("IfNode");
161 	r["condition"] = node.condition.toJSON;
162 	r["onTrue"] = node.statement.toJSON;
163 	if (node.hasElse)
164 		r["onFalse"] = node.elseStatement.toJSON;
165 	
166 	r["lineno"] = JSONValue(node.lineno);
167 	return r;
168 }
169 
170 /// Creates JSONValue for WhileNode
171 JSONValue toJSON(WhileNode node){
172 	JSONValue r;
173 	r["node"] = JSONValue("WhileNode");
174 	r["condtion"] = node.condition.toJSON;
175 	r["statement"] = node.statement.toJSON;
176 
177 	r["lineno"] = JSONValue(node.lineno);
178 	return r;
179 }
180 
181 /// Creates JSONValue for DoWhileNode
182 JSONValue toJSON(DoWhileNode node){
183 	JSONValue r;
184 	r["node"] = JSONValue("DoWhileNode");
185 	r["condition"] = node.condition.toJSON;
186 	r["statement"] = node.statement.toJSON;
187 
188 	r["lineno"] = JSONValue(node.lineno);
189 	return r;
190 }
191 
192 /// Creates JSONValue for ForNode
193 JSONValue toJSON(ForNode node){
194 	JSONValue r;
195 	r["node"] = JSONValue("ForNode");
196 	r["init"] = node.initStatement.toJSON;
197 	r["condition"] = node.condition.toJSON;
198 	r["inc"] = node.incStatement.toJSON;
199 	r["statement"] = node.statement.toJSON;
200 
201 	r["lineno"] = JSONValue(node.lineno);
202 	return r;
203 }
204 
205 /// Creates JSONValue for FunctionCallNode
206 JSONValue toJSON(FunctionCallNode node){
207 	JSONValue r;
208 	r["node"] = JSONValue("FunctionCallNode");
209 	r["name"] = JSONValue(node.fName);
210 	r["type"] = JSONValue(node.returnType.name);
211 	r["libraryId"] = JSONValue(node.libraryId);
212 	r["id"] = node.id;
213 	JSONValue[] argListJSON;
214 	argListJSON.length = node.arguments.length;
215 	foreach (i, arg; node.arguments){
216 		argListJSON[i] = arg.toJSON;
217 	}
218 	r["args"] = JSONValue(argListJSON);
219 
220 	r["lineno"] = JSONValue(node.lineno);
221 	return r;
222 }
223 
224 /// Creates JSONValue for VarDeclareNode
225 JSONValue toJSON(VarDeclareNode node){
226 	JSONValue r;
227 	r["node"] = JSONValue("varDeclareNode");
228 	r["visibility"] = JSONValue(node.visibility.to!string);
229 	r["type"] = JSONValue(node.type.name);
230 	JSONValue[] varTypeValueList;
231 	varTypeValueList.length = node.vars.length;
232 	foreach (i, varName; node.vars){
233 		JSONValue var;
234 		var["name"] = JSONValue(varName);
235 		if (varName in node.varIDs)
236 			var["id"] = JSONValue(node.varIDs[varName]);
237 		if (node.hasValue(varName))
238 			var["value"] = node.getValue(varName).toJSON;
239 		varTypeValueList[i] = var;
240 	}
241 	r["vars"] = JSONValue(varTypeValueList);
242 
243 	r["lineno"] = JSONValue(node.lineno);
244 	return r;
245 }
246 
247 /// Creates JSONValue for ReturnNode
248 JSONValue toJSON(ReturnNode node){
249 	JSONValue r;
250 	r["node"] = JSONValue("ReturnNode");
251 	r["value"] = node.value.toJSON;
252 	return r;
253 }
254 
255 /// Creates JSONValue for CodeNode
256 JSONValue toJSON(CodeNode node){
257 	JSONValue r;
258 	r["node"] = JSONValue("CodeNode");
259 	r["type"] = JSONValue(node.returnType.name);
260 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
261 	if (node.type == CodeNode.Type.Array){
262 		r["code"] = node.node!(CodeNode.Type.Array).toJSON;
263 	}else if (node.type == CodeNode.Type.FunctionCall){
264 		r["code"] = node.node!(CodeNode.Type.FunctionCall).toJSON;
265 	}else if (node.type == CodeNode.Type.Literal){
266 		r["code"] = node.node!(CodeNode.Type.Literal).toJSON;
267 	}else if (node.type == CodeNode.Type.Negative){
268 		r["code"] = node.node!(CodeNode.Type.Negative).toJSON;
269 	}else if (node.type == CodeNode.Type.Operator){
270 		r["code"] = node.node!(CodeNode.Type.Operator).toJSON;
271 	}else if (node.type == CodeNode.Type.ReadElement){
272 		r["code"] = node.node!(CodeNode.Type.ReadElement).toJSON;
273 	}else if (node.type == CodeNode.Type.SOperator){
274 		r["code"] = node.node!(CodeNode.Type.SOperator).toJSON;
275 	}else if (node.type == CodeNode.Type.Variable){
276 		r["code"] = node.node!(CodeNode.Type.Variable).toJSON;
277 	}else if (node.type == CodeNode.Type.MemberSelector){
278 		r["code"] = node.node!(CodeNode.Type.MemberSelector).toJSON;
279 	}
280 	r["lineno"] = JSONValue(node.lineno);
281 	return r;
282 }
283 
284 /// Creates JSONValue for VariableNode
285 JSONValue toJSON(VariableNode node){
286 	JSONValue r;
287 	r["node"] = JSONValue("VariableNode");
288 	r["type"] = JSONValue(node.returnType.name);
289 	r["name"] = JSONValue(node.varName);
290 	r["id"] = JSONValue(node.id);
291 	r["libraryId"] = JSONValue(node.libraryId);
292 	r["isGlobal"] = JSONValue(node.isGlobal);
293 	r["lineno"] = JSONValue(node.lineno);
294 	return r;
295 }
296 
297 /// Creates JSONValue for ArrayNode
298 JSONValue toJSON(ArrayNode node){
299 	JSONValue r;
300 	r["node"] = JSONValue("ArrayNode");
301 	r["type"] = JSONValue(node.returnType.name);
302 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
303 	JSONValue[] elementList;
304 	elementList.length = node.elements.length;
305 	foreach (i, element; node.elements){
306 		elementList[i] = element.toJSON;
307 	}
308 	r["elements"] = JSONValue(elementList);
309 
310 	r["lineno"] = JSONValue(node.lineno);
311 	return r;
312 }
313 
314 /// Creates JSONValue for LiteralNode
315 JSONValue toJSON(LiteralNode node){
316 	JSONValue r;
317 	r["node"] = JSONValue("LiteralNode");
318 	r["type"] = JSONValue(node.returnType.name);
319 	r["value"] = JSONValue(node.literal);
320 
321 	r["lineno"] = JSONValue(node.lineno);
322 	return r;
323 }
324 
325 /// Creates JSONValue for NegativeValue
326 JSONValue toJSON(NegativeValueNode node){
327 	JSONValue r;
328 	r["node"] = JSONValue("NegativeValueNode");
329 	r["type"] = JSONValue(node.returnType.name);
330 	r["value"] = node.value.toJSON;
331 	r["lineno"] = JSONValue(node.lineno);
332 	return r;
333 }
334 
335 /// Creates JSONValue for MemberSelectorNode
336 JSONValue toJSON(MemberSelectorNode node){
337 	JSONValue r;
338 	r["node"] = JSONValue("MemberSelectorNode");
339 	r["nodeType"] = JSONValue(node.type.to!string);
340 	r["memberNameIndex"] = JSONValue(node.memberNameIndex);
341 	r["type"] = JSONValue(node.returnType.name);
342 	r["lineno"] = JSONValue(node.lineno);
343 	r["parent"] = node.parent.toJSON;
344 	r["member"] = JSONValue(node.memberName);
345 	return r;
346 }
347 
348 /// Creates JSONValue for OperatorNode
349 JSONValue toJSON(OperatorNode node){
350 	JSONValue r;
351 	r["node"] = JSONValue("OperatorNode");
352 	r["type"] = JSONValue(node.returnType.name);
353 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
354 	r["operator"] = JSONValue(node.operator);
355 	r["operandA"] = node.operands[0].toJSON;
356 	r["operandB"] = node.operands[1].toJSON;
357 
358 	r["lineno"] = JSONValue(node.lineno);
359 	return r;
360 }
361 
362 /// Creates JSONValue for SOperatorNode
363 JSONValue toJSON(SOperatorNode node){
364 	JSONValue r;
365 	r["node"] = JSONValue("SOperatorNode");
366 	r["type"] = JSONValue(node.returnType.name);
367 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
368 	r["operator"] = JSONValue(node.operator);
369 	r["operand"] = node.operand.toJSON;
370 
371 	r["lineno"] = JSONValue(node.lineno);
372 	return r;
373 }
374 
375 /// Creates JSONValue for ReadElement
376 JSONValue toJSON(ReadElement node){
377 	JSONValue r;
378 	r["node"] = JSONValue("ReadElement");
379 	r["type"] = JSONValue(node.returnType.name);
380 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
381 	r["array"] = node.readFromNode.toJSON;
382 	r["index"] = node.index.toJSON;
383 
384 	r["lineno"] = JSONValue(node.lineno);
385 	return r;
386 }