1 /** 2 Copyright: Copyright (c) 2017-2019 Andrey Penechko. 3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 4 Authors: Andrey Penechko. 5 */ 6 module vox.fe.passes.dump; 7 8 import std.stdio; 9 10 import vox.all; 11 12 struct AstPrintState 13 { 14 CompilationContext* context; 15 16 int indentSize = 1; 17 private int indent; 18 19 void print(Args...)(Args args) { 20 import std.range : repeat; 21 write(' '.repeat(indent)); // indent 22 writeln(args); 23 } 24 } 25 26 void print_ast(AstIndex nodeIndex, CompilationContext* context, int indentSize = 1) 27 { 28 auto state = AstPrintState(context, indentSize); 29 state.indent = -state.indentSize; 30 print_ast(nodeIndex, state); 31 } 32 33 void print_ast(AstNodes nodes, ref AstPrintState state) 34 { 35 foreach(AstIndex item; nodes) print_ast(item, state); 36 } 37 38 void print_ast(AstIndex nodeIndex, ref AstPrintState state) 39 { 40 if (nodeIndex.isUndefined) return; 41 42 AstNode* node = state.context.getAstNode(nodeIndex); 43 if (node.hasAttributes) { 44 print_attributes(node.attributeInfo, state); 45 } 46 47 state.indent += state.indentSize; 48 scope(exit) state.indent -= state.indentSize; 49 50 final switch(node.astType) with(AstType) 51 { 52 case error: state.context.internal_error(node.loc, "Visiting error node"); 53 case abstract_node: state.context.internal_error(node.loc, "Visiting abstract node"); 54 55 case decl_alias: print_alias(cast(AliasDeclNode*)node, state); break; 56 case decl_alias_array: print_alias_array(cast(AliasArrayDeclNode*)node, state); break; 57 case decl_builtin: break; // skip 58 case decl_builtin_attribute: print_builtin_attribute(cast(BuiltinAttribNode*)node, state); break; 59 case decl_enum: print_enum(cast(EnumDeclaration*)node, state); break; 60 case decl_enum_member: print_enum_member(cast(EnumMemberDecl*)node, state); break; 61 case decl_function: print_func(cast(FunctionDeclNode*)node, state); break; 62 case decl_import: print_import(cast(ImportDeclNode*)node, state); break; 63 case decl_module: print_module(cast(ModuleDeclNode*)node, state); break; 64 case decl_package: print_package(cast(PackageDeclNode*)node, state); break; 65 case decl_static_assert: print_static_assert(cast(StaticAssertDeclNode*)node, state); break; 66 case decl_static_foreach: print_static_foreach(cast(StaticForeachDeclNode*)node, state); break; 67 case decl_static_if: print_static_if(cast(StaticIfDeclNode*)node, state); break; 68 case decl_static_version: print_static_version(cast(StaticVersionDeclNode*)node, state); break; 69 case decl_struct: print_struct(cast(StructDeclNode*)node, state); break; 70 case decl_template: print_template(cast(TemplateDeclNode*)node, state); break; 71 case decl_template_param: print_template_param(cast(TemplateParamDeclNode*)node, state); break; 72 case decl_var: print_var(cast(VariableDeclNode*)node, state); break; 73 74 case stmt_block: print_block(cast(BlockStmtNode*)node, state); break; 75 case stmt_if: print_if(cast(IfStmtNode*)node, state); break; 76 case stmt_while: print_while(cast(WhileStmtNode*)node, state); break; 77 case stmt_do_while: print_do(cast(DoWhileStmtNode*)node, state); break; 78 case stmt_for: print_for(cast(ForStmtNode*)node, state); break; 79 case stmt_switch: print_switch(cast(SwitchStmtNode*)node, state); break; 80 case stmt_return: print_return(cast(ReturnStmtNode*)node, state); break; 81 case stmt_break: print_break(cast(BreakStmtNode*)node, state); break; 82 case stmt_continue: print_continue(cast(ContinueStmtNode*)node, state); break; 83 84 case expr_name_use: print_name_use(cast(NameUseExprNode*)node, state); break; 85 case expr_member: print_member(cast(MemberExprNode*)node, state); break; 86 case expr_bin_op: print_binary_op(cast(BinaryExprNode*)node, state); break; 87 case expr_un_op: print_unary_op(cast(UnaryExprNode*)node, state); break; 88 case expr_call: print_call(cast(CallExprNode*)node, state); break; 89 case expr_named_argument: print_named_argument(cast(NamedArgumenExprNode*)node, state); break; 90 case expr_index: print_index(cast(IndexExprNode*)node, state); break; 91 case expr_slice: print_expr_slice(cast(SliceExprNode*)node, state); break; 92 case expr_type_conv: print_type_conv(cast(TypeConvExprNode*)node, state); break; 93 94 case literal_int: print_literal_int(cast(IntLiteralExprNode*)node, state); break; 95 case literal_float: print_literal_float(cast(FloatLiteralExprNode*)node, state); break; 96 case literal_string: print_literal_string(cast(StringLiteralExprNode*)node, state); break; 97 case literal_null: print_literal_null(cast(NullLiteralExprNode*)node, state); break; 98 case literal_bool: print_literal_bool(cast(BoolLiteralExprNode*)node, state); break; 99 case literal_array: print_literal_array(cast(ArrayLiteralExprNode*)node, state); break; 100 case literal_special: print_literal_special(cast(SpecialLiteralExprNode*)node, state); break; 101 102 case type_basic: print_type_basic(cast(BasicTypeNode*)node, state); break; 103 case type_func_sig: print_func_sig(cast(FunctionSignatureNode*)node, state); break; 104 case type_ptr: print_ptr(cast(PtrTypeNode*)node, state); break; 105 case type_static_array: print_static_array(cast(StaticArrayTypeNode*)node, state); break; 106 case type_slice: print_slice(cast(SliceTypeNode*)node, state); break; 107 } 108 }