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 }