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 }