diff --git a/frontend/debug.c b/frontend/debug.c index 4bcab8f..5004c6a 100644 --- a/frontend/debug.c +++ b/frontend/debug.c @@ -1,3 +1,5 @@ +#include "debug.h" + #include #include #include @@ -132,10 +134,23 @@ extern void print_asm_lex_token(struct ivy_asm_token *tok) } extern enum ivy_status print_ast_node( - struct ivy_ast_node *node, struct ivy_ast_node_iterator *it) + struct ivy_ast_node *node, enum ivy_ast_iteration_type type, + struct ivy_ast_node_iterator *it, void *arg) { - for (unsigned int i = 0; i < node->n_it.it_depth; i++) { - b_puts(" "); + struct print_ast_node_args *args = arg; + + if (args && args->postorder && type != IVY_AST_ITERATION_POST) { + return IVY_OK; + } + + if ((!args || !args->postorder) && type != IVY_AST_ITERATION_PRE) { + return IVY_OK; + } + + if (!args || (args && args->indent)) { + for (unsigned int i = 0; i < node->n_it.it_depth; i++) { + b_puts(" "); + } } switch (node->n_type) { diff --git a/frontend/debug.h b/frontend/debug.h index 6884742..31c4df8 100644 --- a/frontend/debug.h +++ b/frontend/debug.h @@ -2,6 +2,7 @@ #define DEBUG_H_ #include +#include struct ivy_token; struct ivy_asm_token; @@ -9,10 +10,18 @@ struct ivy_asm_token; struct ivy_ast_node; struct ivy_ast_node_iterator; +enum ivy_ast_iteration_type; + +struct print_ast_node_args { + bool indent; + bool postorder; +}; + extern void print_lex_token(struct ivy_token *tok); extern void print_asm_lex_token(struct ivy_asm_token *tok); extern enum ivy_status print_ast_node( - struct ivy_ast_node *node, struct ivy_ast_node_iterator *it); + struct ivy_ast_node *node, enum ivy_ast_iteration_type type, + struct ivy_ast_node_iterator *it, void *arg); #endif