about summary refs log tree commit diff
path: root/boot/visit.c
diff options
context:
space:
mode:
Diffstat (limited to 'boot/visit.c')
-rw-r--r--boot/visit.c95
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,
 };