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.toString);
36 	}
37 	JSONValue bodyJSON = node.bodyBlock.toJSON;
38 	JSONValue r;
39 	r["node"] = JSONValue("FunctionNode");
40 	r["type"] = node.returnType.toString;
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.toString);
163 	JSONValue[] argListJSON;
164 	argListJSON.length = node.arguments.length;
165 	foreach (i, arg; node.arguments){
166 		argListJSON[i] = arg.toJSON;
167 	}
168 	r["args"] = JSONValue(argListJSON);
169 
170 	r["lineno"] = JSONValue(node.lineno);
171 	return r;
172 }
173 
174 /// Creates JSONValue for VarDeclareNode
175 JSONValue toJSON(VarDeclareNode node){
176 	JSONValue r;
177 	r["node"] = JSONValue("varDeclareNode");
178 	r["type"] = JSONValue(node.type.toString);
179 	JSONValue[] varTypeValueList;
180 	varTypeValueList.length = node.vars.length;
181 	foreach (i, varName; node.vars){
182 		JSONValue var;
183 		var["name"] = JSONValue(varName);
184 		var["id"] = JSONValue(node.varIDs[varName]);
185 		if (node.hasValue(varName))
186 			var["value"] = node.getValue(varName).toJSON;
187 		varTypeValueList[i] = var;
188 	}
189 	r["vars"] = JSONValue(varTypeValueList);
190 
191 	r["lineno"] = JSONValue(node.lineno);
192 	return r;
193 }
194 
195 /// Creates JSONValue for ReturnNode
196 JSONValue toJSON(ReturnNode node){
197 	JSONValue r;
198 	r["node"] = JSONValue("ReturnNode");
199 	r["value"] = node.value.toJSON;
200 	return r;
201 }
202 
203 /// Creates JSONValue for CodeNode
204 JSONValue toJSON(CodeNode node){
205 	JSONValue r;
206 	r["node"] = JSONValue("CodeNode");
207 	r["type"] = JSONValue(node.returnType.toString);
208 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
209 	if (node.type == CodeNode.Type.Array){
210 		r["code"] = node.node!(CodeNode.Type.Array).toJSON;
211 	}else if (node.type == CodeNode.Type.FunctionCall){
212 		r["code"] = node.node!(CodeNode.Type.FunctionCall).toJSON;
213 	}else if (node.type == CodeNode.Type.Literal){
214 		r["code"] = node.node!(CodeNode.Type.Literal).toJSON;
215 	}else if (node.type == CodeNode.Type.Operator){
216 		r["code"] = node.node!(CodeNode.Type.Operator).toJSON;
217 	}else if (node.type == CodeNode.Type.ReadElement){
218 		r["code"] = node.node!(CodeNode.Type.ReadElement).toJSON;
219 	}else if (node.type == CodeNode.Type.SOperator){
220 		r["code"] = node.node!(CodeNode.Type.SOperator).toJSON;
221 	}else if (node.type == CodeNode.Type.Variable){
222 		r["code"] = node.node!(CodeNode.Type.Variable).toJSON;
223 	}
224 	r["lineno"] = JSONValue(node.lineno);
225 	return r;
226 }
227 
228 /// Creates JSONValue for VariableNode
229 JSONValue toJSON(VariableNode node){
230 	JSONValue r;
231 	r["node"] = JSONValue("VariableNode");
232 	r["type"] = JSONValue(node.returnType.toString);
233 	r["name"] = JSONValue(node.varName);
234 	r["id"] = JSONValue(node.id);
235 
236 	r["lineno"] = JSONValue(node.lineno);
237 	return r;
238 }
239 
240 /// Creates JSONValue for ArrayNode
241 JSONValue toJSON(ArrayNode node){
242 	JSONValue r;
243 	r["node"] = JSONValue("ArrayNode");
244 	r["type"] = JSONValue(node.returnType.toString);
245 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
246 	JSONValue[] elementList;
247 	elementList.length = node.elements.length;
248 	foreach (i, element; node.elements){
249 		elementList[i] = element.toJSON;
250 	}
251 	r["elements"] = JSONValue(elementList);
252 
253 	r["lineno"] = JSONValue(node.lineno);
254 	return r;
255 }
256 
257 /// Creates JSONValue for LiteralNode
258 JSONValue toJSON(LiteralNode node){
259 	JSONValue r;
260 	r["node"] = JSONValue("LiteralNode");
261 	r["type"] = JSONValue(node.returnType.toString);
262 	r["value"] = JSONValue(node.literal);
263 
264 	r["lineno"] = JSONValue(node.lineno);
265 	return r;
266 }
267 
268 /// Creates JSONValue for OperatorNode
269 JSONValue toJSON(OperatorNode node){
270 	JSONValue r;
271 	r["node"] = JSONValue("OperatorNode");
272 	r["type"] = JSONValue(node.returnType.toString);
273 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
274 	r["operator"] = JSONValue(node.operator);
275 	r["operandA"] = node.operands[0].toJSON;
276 	r["operandB"] = node.operands[1].toJSON;
277 
278 	r["lineno"] = JSONValue(node.lineno);
279 	return r;
280 }
281 
282 /// Creates JSONValue for SOperatorNode
283 JSONValue toJSON(SOperatorNode node){
284 	JSONValue r;
285 	r["node"] = JSONValue("SOperatorNode");
286 	r["type"] = JSONValue(node.returnType.toString);
287 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
288 	r["operator"] = JSONValue(node.operator);
289 	r["operand"] = node.operand.toJSON;
290 
291 	r["lineno"] = JSONValue(node.lineno);
292 	return r;
293 }
294 
295 /// Creates JSONValue for ReadElement
296 JSONValue toJSON(ReadElement node){
297 	JSONValue r;
298 	r["node"] = JSONValue("ReadElement");
299 	r["type"] = JSONValue(node.returnType.toString);
300 	r["isLiteral"] = JSONValue(node.isLiteral ? "true" : "false");
301 	r["array"] = node.readFromNode.toJSON;
302 	r["index"] = node.index.toJSON;
303 
304 	r["lineno"] = JSONValue(node.lineno);
305 	return r;
306 }