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 }