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 }