summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ast_pretty_printer.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/src/ast_pretty_printer.c b/src/ast_pretty_printer.c
index df17763..ec8d2de 100644
--- a/src/ast_pretty_printer.c
+++ b/src/ast_pretty_printer.c
@@ -36,6 +36,9 @@ ast_pretty_printer_add_indentation(ast_pretty_printer_t *printer);
inline static void
ast_pretty_printer_rm_indentation(ast_pretty_printer_t *printer);
+inline static void
+ast_pretty_printer_set_lst_children(ast_pretty_printer_t *printer);
+
static void
ast_pretty_printer_print_indentation(ast_pretty_printer_t *printer);
@@ -48,8 +51,8 @@ ast_pretty_printer_init(ast_pretty_printer_t *printer, FILE *stream)
assert(printer);
assert(stream);
- printer->indentation_fmt = 0;
- printer->indentation_lst_children = 0;
+ printer->indentation_fmt = 0ULL;
+ printer->indentation_lst_children = 0ULL;
printer->indentation_level = 0;
printer->stream = stream;
}
@@ -70,18 +73,18 @@ ast_pretty_printer_print_ast(ast_pretty_printer_t *printer, ast_node_t *ast)
ast_pretty_printer_add_indentation(printer);
{
- printer->indentation_lst_children |= 1 << printer->indentation_level;
+ ast_pretty_printer_set_lst_children(printer);
ast_pretty_printer_print_ast(printer, binop.left);
ast_pretty_printer_rm_indentation(printer);
}
- printer->indentation_lst_children |= 1 << printer->indentation_level;
+ ast_pretty_printer_set_lst_children(printer);
ast_pretty_printer_printf(printer, "right:\n");
ast_pretty_printer_add_indentation(printer);
{
- printer->indentation_lst_children |= 1 << printer->indentation_level;
+ ast_pretty_printer_set_lst_children(printer);
ast_pretty_printer_print_ast(printer, binop.right);
ast_pretty_printer_rm_indentation(printer);
@@ -98,7 +101,7 @@ ast_pretty_printer_print_ast(ast_pretty_printer_t *printer, ast_node_t *ast)
ast_pretty_printer_add_indentation(printer);
for (size_t i = 0; i < function.body->size; ++i) {
if (i + 1 >= function.body->size) {
- printer->indentation_lst_children |= 1 << printer->indentation_level;
+ ast_pretty_printer_set_lst_children(printer);
}
ast_pretty_printer_print_ast(printer, vector_at(function.body, i));
}
@@ -110,7 +113,7 @@ ast_pretty_printer_print_ast(ast_pretty_printer_t *printer, ast_node_t *ast)
switch (literal.kind) {
case AST_LITERAL_INTEGER: {
- printer->indentation_lst_children |= 1 << printer->indentation_level;
+ ast_pretty_printer_set_lst_children(printer);
ast_pretty_printer_printf(printer, "Literal type=i32 value='%d'\n", literal.value.integer);
break;
}
@@ -123,7 +126,7 @@ ast_pretty_printer_print_ast(ast_pretty_printer_t *printer, ast_node_t *ast)
ast_pretty_printer_add_indentation(printer);
{
- printer->indentation_lst_children |= 1 << printer->indentation_level;
+ ast_pretty_printer_set_lst_children(printer);
ast_pretty_printer_print_ast(printer, return_stmt.argument);
ast_pretty_printer_rm_indentation(printer);
@@ -136,7 +139,7 @@ ast_pretty_printer_print_ast(ast_pretty_printer_t *printer, ast_node_t *ast)
ast_pretty_printer_add_indentation(printer);
{
- printer->indentation_lst_children |= 1 << printer->indentation_level;
+ ast_pretty_printer_set_lst_children(printer);
ast_pretty_printer_print_ast(printer, var_decl.value);
ast_pretty_printer_rm_indentation(printer);
@@ -149,12 +152,12 @@ ast_pretty_printer_print_ast(ast_pretty_printer_t *printer, ast_node_t *ast)
ast_pretty_printer_add_indentation(printer);
{
- printer->indentation_lst_children |= 1 << printer->indentation_level;
+ ast_pretty_printer_set_lst_children(printer);
ast_pretty_printer_printf(printer, "expression:\n");
ast_pretty_printer_add_indentation(printer);
{
- printer->indentation_lst_children |= 1 << printer->indentation_level;
+ ast_pretty_printer_set_lst_children(printer);
ast_pretty_printer_print_ast(printer, var_assign.expression);
ast_pretty_printer_rm_indentation(printer);
@@ -194,7 +197,7 @@ inline static void
ast_pretty_printer_add_indentation(ast_pretty_printer_t *printer)
{
printer->indentation_level++;
- printer->indentation_fmt |= 1 << printer->indentation_level;
+ printer->indentation_fmt |= 1ULL << printer->indentation_level;
}
inline static void
@@ -203,14 +206,20 @@ ast_pretty_printer_rm_indentation(ast_pretty_printer_t *printer)
printer->indentation_level--;
}
+inline static void
+ast_pretty_printer_set_lst_children(ast_pretty_printer_t *printer)
+{
+ printer->indentation_lst_children |= 1ULL << printer->indentation_level;
+}
+
static void
ast_pretty_printer_print_indentation(ast_pretty_printer_t *printer)
{
for (size_t i = 0; i <= printer->indentation_level; ++i) {
- if ((printer->indentation_fmt >> i) & 1) {
- if (i + 1 > printer->indentation_level && (printer->indentation_lst_children & (1 << i))) {
- printer->indentation_lst_children ^= (1 << i);
- printer->indentation_fmt ^= (1 << i);
+ if ((printer->indentation_fmt >> i) & 1ULL) {
+ if (i + 1 > printer->indentation_level && (printer->indentation_lst_children & (1ULL << i))) {
+ printer->indentation_lst_children ^= (1ULL << i);
+ printer->indentation_fmt ^= (1ULL << i);
fprintf(printer->stream, "└─ ");
} else if (i + 1 > printer->indentation_level) {
fprintf(printer->stream, "├─ ");