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[] functionsJSON;
19 	functionsJSON.length = node.functions.length;
20 	foreach (i, fNode; node.functions){
21 		functionsJSON[i] = fNode.toJSON;
22 	}
23 	JSONValue r;
24 	r["node"] = JSONValue("ScriptNode");
25 	r["functions"] = JSONValue(functionsJSON);
26 	return r;
27 }
28 
29 /// Creates JSONValue for FunctionNode
30 JSONValue toJSON(FunctionNode node){
31 	JSONValue[] argListJSON;
32 	argListJSON.length = node.arguments.length;
33 	foreach (i, arg; node.arguments){
34 		argListJSON[i]["name"] = JSONValue(arg.argName);
35 		argListJSON[i]["type"] = JSONValue(arg.argType.getStr);
36 	}
37 	JSONValue bodyJSON = node.bodyBlock.toJSON;
38 	JSONValue r;
39 	r["node"] = JSONValue("FunctionNode");
40 	r["type"] = node.returnType.getStr;
41 	r["name"] = node.name;
42 	r["arguments"] = JSONValue(argListJSON);
43 	r["body"] = JSONValue(bodyJSON);
44 	r["id"] = JSONValue(node.id);
45 	r["lineno"] = JSONValue(node.lineno);
46 	r["varCount"] = JSONValue(node.varCount);
47 	return r;
48 }
49 
50 /// Creates JSONValue for BlockNode
51 JSONValue toJSON(BlockNode node){
52 	JSONValue[] statementListJSON;
53 	statementListJSON.length = node.statements.length;
54 	foreach (i, statement; node.statements){
55 		statementListJSON[i] = statement.toJSON;
56 	}
57 	JSONValue r;
58 	r["node"] = JSONValue("BlockNode");
59 	r["statements"] = JSONValue(statementListJSON);
60 	r["lineno"] = JSONValue(node.lineno);
61 	return r;
62 }
63 
64 /// Creates JSONValue for StatementNode
65 JSONValue toJSON(StatementNode node){
66 	JSONValue r;
67 	r["node"] = JSONValue("StatementNode");
68 	if (node.type == StatementNode.Type.Assignment){
69 		r["statement"] = node.node!(StatementNode.Type.Assignment).toJSON;
70 	}else if (node.type == StatementNode.Type.Block){
71 		r["statement"] = node.node!(StatementNode.Type.Block).toJSON;
72 	}else if (node.type == StatementNode.Type.DoWhile){
73 		r["statement"] = node.node!(StatementNode.Type.DoWhile).toJSON;
74 	}else if (node.type == StatementNode.Type.For){
75 		r["statement"] = node.node!(StatementNode.Type.For).toJSON;
76 	}else if (node.type == StatementNode.Type.FunctionCall){
77 		r["statement"] = node.node!(StatementNode.Type.FunctionCall).toJSON;
78 	}else if (node.type == StatementNode.Type.If){
79 		r["statement"] = node.node!(StatementNode.Type.If).toJSON;
80 	}else if (node.type == StatementNode.Type.VarDeclare){
81 		r["statement"] = node.node!(StatementNode.Type.VarDeclare).toJSON;
82 	}else if (node.type == StatementNode.Type.While){
83 		r["statement"] = node.node!(StatementNode.Type.While).toJSON;
84 	}else if (node.type == StatementNode.Type.Return){
85 		r["statement"] = node.node!(StatementNode.Type.Return).toJSON;
86 	}
87 	r["lineno"] = JSONValue(node.lineno);
88 	return r;
89 }
90 
91 /// Creates JSONValue for AssignmentNode
92 JSONValue toJSON(AssignmentNode node){
93 	JSONValue r;
94 	r["node"] = JSONValue("AssignmentNode");
95 	r["lvalueIsRef"] = JSONValue(node.deref ? "true" : "false");
96 	r["var"] = node.var.toJSON;
97 	JSONValue[] indexes;
98 	indexes.length = node.indexes.length;
99 	foreach (i, index; node.indexes){
100 		indexes[i] = index.toJSON;
101 	}
102 	r["indexes"] = JSONValue(indexes);
103 	r["val"] = node.val.toJSON;
104 
105 	r["lineno"] = JSONValue(node.lineno);
106 	return r;
107 }
108 
109 /// Creates JSONValue for IfNode
110 JSONValue toJSON(IfNode node){
111 	JSONValue r;
112 	r["node"] = JSONValue("IfNode");
113 	r["condition"] = node.condition.toJSON;
114 	r["onTrue"] = node.statement.toJSON;
115 	if (node.hasElse)
116 		r["onFalse"] = node.elseStatement.toJSON;
117 	
118 	r["lineno"] = JSONValue(node.lineno);
119 	return r;
120 }
121 
122 /// Creates JSONValue for WhileNode
123 JSONValue toJSON(WhileNode node){
124 	JSONValue r;
125 	r["node"] = JSONValue("WhileNode");
126 	r["condtion"] = node.condition.toJSON;
127 	r["statement"] = node.statement.toJSON;
128 
129 	r["lineno"] = JSONValue(node.lineno);
130 	return r;
131 }
132 
133 /// Creates JSONValue for DoWhileNode
134 JSONValue toJSON(DoWhileNode node){
135 	JSONValue r;
136 	r["node"] = JSONValue("DoWhileNode");
137 	r["condition"] = node.condition.toJSON;
138 	r["statement"] = node.statement.toJSON;
139 
140 	r["lineno"] = JSONValue(node.lineno);
141 	return r;
142 }
143 
144 /// Creates JSONValue for ForNode
145 JSONValue toJSON(ForNode node){
146 	JSONValue r;
147 	r["node"] = JSONValue("ForNode");
148 	r["init"] = node.initStatement.toJSON;
149 	r["condition"] = node.condition.toJSON;
150 	r["inc"] = node.incStatement.toJSON;
151 	r["statement"] = node.statement.toJSON;
152 
153 	r["lineno"] = JSONValue(node.lineno);
154 	return r;
155 }
156 
157 /// Creates JSONValue for FunctionCallNode
158 JSONValue toJSON(FunctionCallNode node){
159 	JSONValue r;
160 	r["node"] = JSONValue("FunctionCallNode");
161 	r["name"] = JSONValue(node.fName);
162 	r["type"] = JSONValue(node.returnType.getStr);
163 	r["isInbuilt"] = node.isInBuilt;
164 	r["isScriptDefined"] = node.isScriptDefined;
165 	r["id"] = node.id;
166 	JSONValue[] argListJSON;
167 	argListJSON.length = node.arguments.length;
168 	foreach (i, arg; node.arguments){
169 		argListJSON[i] = arg.toJSON;
170 	}
171 	r["args"] = JSONValue(argListJSON);
172 
173 	r["lineno"] = JSONValue(node.lineno);
174 	return r;
175 }
176 
177 /// Creates JSONValue for VarDeclareNode
178 JSONValue toJSON(VarDeclareNode node){
179 	JSONValue r;
180 	r["node"] = JSONValue("varDeclareNode");
181 	r["type"] = JSONValue(node.type.getStr);
182 	JSONValue[] varTypeValueList;
183 	varTypeValueList.length = node.vars.length;
184 	foreach (i, varName; node.vars){
185 		JSONValue var;
186 		var["name"] = JSONValue(varName);
187 		var["id"] = JSONValue(node.varIDs[varName]);
188 		if (node.hasValue(varName))
189 			var["value"] = node.getValue(varName).toJSON;
190 		varTypeValueList[i] = var;
191 	}
192 	r["vars"] = JSONValue(varTypeValueList);
193 
194 	r["lineno"] = JSONValue(node.lineno);
195 	return r;
196 }
197 
198 /// Creates JSONValue for ReturnNode
199 JSONValue toJSON(ReturnNode node){
200 	JSONValue r;
201 	r["node"] = JSONValue("ReturnNode");
202 	r["value"] = node.value.toJSON;
203 	return r;
204 }
205 
206 /// Creates JSONValue for CodeNode
207 JSONValue toJSON(CodeNode node){
208 	JSONValue r;
209 	r["node"] = JSONValue("CodeNode");
210 	r["type"] = JSONValue(node.returnType.getStr);
211 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
212 	if (node.type == CodeNode.Type.Array){
213 		r["code"] = node.node!(CodeNode.Type.Array).toJSON;
214 	}else if (node.type == CodeNode.Type.FunctionCall){
215 		r["code"] = node.node!(CodeNode.Type.FunctionCall).toJSON;
216 	}else if (node.type == CodeNode.Type.Literal){
217 		r["code"] = node.node!(CodeNode.Type.Literal).toJSON;
218 	}else if (node.type == CodeNode.Type.Negative){
219 		r["code"] = node.node!(CodeNode.Type.Negative).toJSON;
220 	}else if (node.type == CodeNode.Type.Operator){
221 		r["code"] = node.node!(CodeNode.Type.Operator).toJSON;
222 	}else if (node.type == CodeNode.Type.ReadElement){
223 		r["code"] = node.node!(CodeNode.Type.ReadElement).toJSON;
224 	}else if (node.type == CodeNode.Type.SOperator){
225 		r["code"] = node.node!(CodeNode.Type.SOperator).toJSON;
226 	}else if (node.type == CodeNode.Type.Variable){
227 		r["code"] = node.node!(CodeNode.Type.Variable).toJSON;
228 	}
229 	r["lineno"] = JSONValue(node.lineno);
230 	return r;
231 }
232 
233 /// Creates JSONValue for VariableNode
234 JSONValue toJSON(VariableNode node){
235 	JSONValue r;
236 	r["node"] = JSONValue("VariableNode");
237 	r["type"] = JSONValue(node.returnType.getStr);
238 	r["name"] = JSONValue(node.varName);
239 	r["id"] = JSONValue(node.id);
240 
241 	r["lineno"] = JSONValue(node.lineno);
242 	return r;
243 }
244 
245 /// Creates JSONValue for ArrayNode
246 JSONValue toJSON(ArrayNode node){
247 	JSONValue r;
248 	r["node"] = JSONValue("ArrayNode");
249 	r["type"] = JSONValue(node.returnType.getStr);
250 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
251 	JSONValue[] elementList;
252 	elementList.length = node.elements.length;
253 	foreach (i, element; node.elements){
254 		elementList[i] = element.toJSON;
255 	}
256 	r["elements"] = JSONValue(elementList);
257 
258 	r["lineno"] = JSONValue(node.lineno);
259 	return r;
260 }
261 
262 /// Creates JSONValue for LiteralNode
263 JSONValue toJSON(LiteralNode node){
264 	JSONValue r;
265 	r["node"] = JSONValue("LiteralNode");
266 	r["type"] = JSONValue(node.returnType.getStr);
267 	r["value"] = JSONValue(node.literal);
268 
269 	r["lineno"] = JSONValue(node.lineno);
270 	return r;
271 }
272 
273 /// Creates JSONValue for NegativeValue
274 JSONValue toJSON(NegativeValueNode node){
275 	JSONValue r;
276 	r["node"] = JSONValue("NegativeValueNode");
277 	r["type"] = JSONValue(node.returnType.getStr);
278 	r["value"] = node.value.toJSON;
279 	r["lineno"] = JSONValue(node.lineno);
280 	return r;
281 }
282 
283 /// Creates JSONValue for OperatorNode
284 JSONValue toJSON(OperatorNode node){
285 	JSONValue r;
286 	r["node"] = JSONValue("OperatorNode");
287 	r["type"] = JSONValue(node.returnType.getStr);
288 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
289 	r["operator"] = JSONValue(node.operator);
290 	r["operandA"] = node.operands[0].toJSON;
291 	r["operandB"] = node.operands[1].toJSON;
292 
293 	r["lineno"] = JSONValue(node.lineno);
294 	return r;
295 }
296 
297 /// Creates JSONValue for SOperatorNode
298 JSONValue toJSON(SOperatorNode node){
299 	JSONValue r;
300 	r["node"] = JSONValue("SOperatorNode");
301 	r["type"] = JSONValue(node.returnType.getStr);
302 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
303 	r["operator"] = JSONValue(node.operator);
304 	r["operand"] = node.operand.toJSON;
305 
306 	r["lineno"] = JSONValue(node.lineno);
307 	return r;
308 }
309 
310 /// Creates JSONValue for ReadElement
311 JSONValue toJSON(ReadElement node){
312 	JSONValue r;
313 	r["node"] = JSONValue("ReadElement");
314 	r["type"] = JSONValue(node.returnType.getStr);
315 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
316 	r["array"] = node.readFromNode.toJSON;
317 	r["index"] = node.index.toJSON;
318 
319 	r["lineno"] = JSONValue(node.lineno);
320 	return r;
321 }