diff options
Diffstat (limited to 'boot/visit.c')
| -rw-r--r-- | boot/visit.c | 95 |
1 files changed, 69 insertions, 26 deletions
diff --git a/boot/visit.c b/boot/visit.c index 68e95bf..fa49a7d 100644 --- a/boot/visit.c +++ b/boot/visit.c @@ -41,7 +41,8 @@ struct Visit_Table void (*visit_expression_unary_operation)(struct Visit* visitor, struct Expression* expr); void (*visit_expression_binary_operation)(struct Visit* visitor, struct Expression* expr); void (*visit_expression_group)(struct Visit* visitor, struct Expression* expr); - void (*visit_expression_call_or_construct)(struct Visit* visitor, struct Expression* expr); + void (*visit_expression_call)(struct Visit* visitor, struct Expression* expr); + void (*visit_expression_construct)(struct Visit* visitor, struct Expression* expr); void (*visit_expression_subscript)(struct Visit* visitor, struct Expression* expr); void (*visit_expression_member)(struct Visit* visitor, struct Expression* expr); void (*visit_expression_increment_decrement)(struct Visit* visitor, struct Expression* expr); @@ -64,6 +65,7 @@ struct Visit_Table void (*visit_block_node)(struct Visit* visitor, struct Block_Node* node); void (*visit_bare_declaration_node)(struct Visit* visitor, struct Bare_Declaration_Node* node); void (*visit_function_header_node)(struct Visit* visitor, struct Function_Header_Node* header); + void (*visit_argument_group_node)(struct Visit* visitor, struct Argument_Group_Node* node); void (*visit_pragma_node)(struct Visit* visitor, struct Pragma_Node* node); }; @@ -209,8 +211,11 @@ walk_expression(struct Visit* visit, struct Expression* expression) case EXPRESSION_GROUP: VISIT(visit_expression_group, expression); break; - case EXPRESSION_CALL_OR_CONSTRUCT: - VISIT(visit_expression_call_or_construct, expression); + case EXPRESSION_CALL: + VISIT(visit_expression_call, expression); + break; + case EXPRESSION_CONSTRUCT: + VISIT(visit_expression_construct, expression); break; case EXPRESSION_SUBSCRIPT: VISIT(visit_expression_subscript, expression); @@ -268,11 +273,19 @@ walk_expression_group(struct Visit* visit, struct Expression* expression) } void -walk_expression_call_or_construct(struct Visit* visit, struct Expression* expression) +walk_expression_call(struct Visit* visit, struct Expression* expression) +{ + struct Expression_Call* call = &expression->value.call; + VISIT(visit_expression, call->subject); + VISIT(visit_argument_group_node, &call->argument_group); +} + +void +walk_expression_construct(struct Visit* visit, struct Expression* expression) { - struct Expression_Call_Or_Construct* coc = &expression->value.call_or_construct; - VISIT(visit_expression, coc->subject); - FOR_EACH (struct Expression*, argument, coc->arguments) { VISIT(visit_expression, argument); } + struct Expression_Construct* construct = &expression->value.construct; + VISIT(visit_expression, construct->subject); + VISIT(visit_argument_group_node, &construct->argument_group); } void @@ -434,6 +447,12 @@ walk_function_header_node(struct Visit* visit, struct Function_Header_Node* head } void +walk_argument_group_node(struct Visit* visit, struct Argument_Group_Node* node) +{ + FOR_EACH (struct Expression*, argument, node->arguments) { VISIT(visit_expression, argument); } +} + +void walk_pragma_node(struct Visit* visit, struct Pragma_Node* node) { // visit each pragma node in the linked list. @@ -461,7 +480,8 @@ struct Visit_Table walk_functions = { .visit_expression_unary_operation = walk_expression_unary_operation, .visit_expression_binary_operation = walk_expression_binary_operation, .visit_expression_group = walk_expression_group, - .visit_expression_call_or_construct = walk_expression_call_or_construct, + .visit_expression_call = walk_expression_call, + .visit_expression_construct = walk_expression_construct, .visit_expression_subscript = walk_expression_subscript, .visit_expression_member = walk_expression_member, .visit_expression_increment_decrement = walk_expression_increment_decrement, @@ -482,6 +502,7 @@ struct Visit_Table walk_functions = { .visit_block_node = walk_block_node, .visit_bare_declaration_node = walk_bare_declaration_node, .visit_function_header_node = walk_function_header_node, + .visit_argument_group_node = walk_argument_group_node, .visit_pragma_node = walk_pragma_node, }; @@ -769,25 +790,28 @@ printer_visit_expression_group(struct Visit* visit, struct Expression* expr) } void -printer_visit_expression_call_or_construct(struct Visit* visit, struct Expression* expr) +printer_visit_expression_call(struct Visit* visit, struct Expression* expr) { TREE_PRINTER_PREAMBLE - struct Expression_Call_Or_Construct* coc = &expr->value.call_or_construct; - PRINT("(call/construct "); - VISIT(visit_expression, coc->subject); + struct Expression_Call* call = &expr->value.call; + PRINT("(call "); + VISIT(visit_expression, call->subject); + VISIT(visit_argument_group_node, &call->argument_group); + + PRINT(")"); +} + +void +printer_visit_expression_construct(struct Visit* visit, struct Expression* expr) +{ + TREE_PRINTER_PREAMBLE + + struct Expression_Construct* construct = &expr->value.construct; + PRINT("(construct "); + VISIT(visit_expression, construct->subject); + VISIT(visit_argument_group_node, &construct->argument_group); - uint i = 0; - FOR_EACH (struct Expression*, argument, coc->arguments) { - struct String name = string_array_at(&coc->argument_names, i++); - if (name.data && name.data[0] != '\0') { - PRINT(" (named arg '%s' ", name.data); - } else { - PRINT(" (arg "); - } - VISIT(visit_expression, argument); - PRINT(")"); - } PRINT(")"); } @@ -864,8 +888,7 @@ printer_visit_type_node(struct Visit* visit, struct Type_Node* node) { TREE_PRINTER_PREAMBLE PRINT("(type "); - if (node->variadic) - PRINT("variadic "); + if (node->variadic) PRINT("variadic "); walk_type_node(visit, node); PRINT(")"); } @@ -1077,6 +1100,24 @@ printer_visit_pragma_node(struct Visit* visit, struct Pragma_Node* node) } } +void +printer_visit_argument_group_node(struct Visit* visit, struct Argument_Group_Node* node) +{ + TREE_PRINTER_PREAMBLE + + uint i = 0; + FOR_EACH (struct Expression*, argument, node->arguments) { + struct String name = string_array_at(&node->argument_names, i++); + if (name.data && name.data[0] != '\0') { + PRINT(" (named arg '%s' ", name.data); + } else { + PRINT(" (arg "); + } + VISIT(visit_expression, argument); + PRINT(")"); + } +} + struct Visit_Table printer_visit_functions = { .visit_tree = printer_visit_tree, @@ -1098,7 +1139,8 @@ struct Visit_Table printer_visit_functions = { .visit_expression_unary_operation = printer_visit_expression_unary_operation, .visit_expression_binary_operation = printer_visit_expression_binary_operation, .visit_expression_group = printer_visit_expression_group, - .visit_expression_call_or_construct = printer_visit_expression_call_or_construct, + .visit_expression_call = printer_visit_expression_call, + .visit_expression_construct = printer_visit_expression_construct, .visit_expression_subscript = printer_visit_expression_subscript, .visit_expression_member = printer_visit_expression_member, .visit_expression_increment_decrement = printer_visit_expression_increment_decrement, @@ -1121,6 +1163,7 @@ struct Visit_Table printer_visit_functions = { .visit_block_node = printer_visit_block_node, .visit_bare_declaration_node = printer_visit_bare_declaration_node, .visit_function_header_node = printer_visit_function_header, + .visit_argument_group_node = printer_visit_argument_group_node, .visit_pragma_node = printer_visit_pragma_node, }; |
