about summary refs log tree commit diff
path: root/boot/visit
diff options
context:
space:
mode:
Diffstat (limited to 'boot/visit')
-rw-r--r--boot/visit/ir.c135
1 files changed, 56 insertions, 79 deletions
diff --git a/boot/visit/ir.c b/boot/visit/ir.c
index b2239d5..3880b36 100644
--- a/boot/visit/ir.c
+++ b/boot/visit/ir.c
@@ -82,12 +82,10 @@ walk_unit(struct Visit* visit, struct Unit* unit)
     FOR_EACH_ARRAY(struct Function*, function, &unit->functions.entries, {
         VISIT(visit_function, function);
     })
-    for (uint i = 0; i < array_length(&unit->imports); ++i) {
-        VISIT(visit_import, array_at(struct Import, &unit->imports, i));
-    }
-    for (uint i = 0; i < array_length(&unit->diagnostics); ++i) {
-        VISIT(visit_diagnostic, array_at(struct Diagnostic, &unit->diagnostics, i));
-    }
+    FOR_EACH_ARRAY(struct Import, import, &unit->imports, { VISIT(visit_import, &import); })
+    FOR_EACH_ARRAY(struct Diagnostic, diagnostic, &unit->diagnostics, {
+        VISIT(visit_diagnostic, &diagnostic);
+    })
 }
 
 void
@@ -122,40 +120,33 @@ WALK_LEAF_FUNCTION(walk_type_alias, struct Type*);
 void
 walk_type_structure(struct Visit* visit, struct Type* type)
 {
-    for (uint i = 0; i < array_length(&type->value.structure.fields); ++i) {
-        struct Field* field = array_at(struct Field, &type->value.structure.fields, i);
-        VISIT(visit_type_ref, &field->type);
-    }
+    FOR_EACH_ARRAY(struct Field, field, &type->value.structure.fields, {
+        VISIT(visit_type_ref, &field.type);
+    })
 }
 
 void
 walk_type_variant(struct Visit* visit, struct Type* type)
 {
-    for (uint i = 0; i < array_length(&type->value.variant.cases); ++i) {
-        struct Variant_Case* one_case =
-            array_at(struct Variant_Case, &type->value.variant.cases, i);
-        if (one_case->has_payload) VISIT(visit_type_ref, &one_case->payload);
-    }
+    FOR_EACH_ARRAY(struct Variant_Case, one_case, &type->value.variant.cases, {
+        if (one_case.has_payload) VISIT(visit_type_ref, &one_case.payload);
+    })
 }
 
 void
 walk_type_function(struct Visit* visit, struct Type* type)
 {
     VISIT(visit_type_ref, &type->value.function.return_type);
-    for (uint i = 0; i < array_length(&type->value.function.params); ++i) {
-        struct Type_Ref* param = array_at(struct Type_Ref, &type->value.function.params, i);
-        VISIT(visit_type_ref, param);
-    }
+    FOR_EACH_ARRAY(struct Type_Ref, param, &type->value.function.params, {
+        VISIT(visit_type_ref, &param);
+    })
 }
 
 void
 walk_function(struct Visit* visit, struct Function* function)
 {
     VISIT(visit_type_ref, &function->return_type);
-    for (uint i = 0; i < array_length(&function->params); ++i) {
-        struct Param* param = array_at(struct Param, &function->params, i);
-        VISIT(visit_type_ref, &param->type);
-    }
+    FOR_EACH_ARRAY(struct Param, param, &function->params, { VISIT(visit_type_ref, &param.type); })
     VISIT_MAYBE(visit_block, function->body);
 }
 
@@ -226,11 +217,10 @@ walk_statement_expression(struct Visit* visit, struct Statement* stmt)
 void
 walk_statement_conditional(struct Visit* visit, struct Statement* stmt)
 {
-    for (uint i = 0; i < array_length(&stmt->value.conditional.branches); ++i) {
-        struct If_Branch* branch = array_at(struct If_Branch, &stmt->value.conditional.branches, i);
-        VISIT_MAYBE(visit_expression, branch->condition);
-        VISIT(visit_block, branch->body);
-    }
+    FOR_EACH_ARRAY(struct If_Branch, branch, &stmt->value.conditional.branches, {
+        VISIT_MAYBE(visit_expression, branch.condition);
+        VISIT(visit_block, branch.body);
+    })
 }
 
 void
@@ -364,11 +354,9 @@ walk_expression_cast(struct Visit* visit, struct Expression* expr)
 void
 walk_expression_construct(struct Visit* visit, struct Expression* expr)
 {
-    for (uint i = 0; i < array_length(&expr->value.construct.fields); ++i) {
-        struct Construct_Field* field =
-            array_at(struct Construct_Field, &expr->value.construct.fields, i);
-        VISIT(visit_expression, field->value);
-    }
+    FOR_EACH_ARRAY(struct Construct_Field, field, &expr->value.construct.fields, {
+        VISIT(visit_expression, field.value);
+    })
 }
 
 void walk_block(struct Visit* visit, struct Block* block){ FOR_EACH_ARRAY(
@@ -514,10 +502,10 @@ printer_visit_unit(struct Visit* visit, struct Unit* unit)
         PRINT("\n");
         printer_indent(p);
         PRINT("(imports");
-        for (uint i = 0; i < array_length(&unit->imports); ++i) {
+        FOR_EACH_ARRAY(struct Import, import, &unit->imports, {
             PRINT(" ");
-            VISIT(visit_import, array_at(struct Import, &unit->imports, i));
-        }
+            VISIT(visit_import, &import);
+        })
         PRINT(")");
     }
 
@@ -525,9 +513,7 @@ printer_visit_unit(struct Visit* visit, struct Unit* unit)
         PRINT("\n");
         printer_indent(p);
         PRINT("(emission_order");
-        for (uint i = 0; i < array_length(&unit->type_emission_order); ++i) {
-            PRINT(" %lu", *array_at(Type_Id, &unit->type_emission_order, i));
-        }
+        FOR_EACH_ARRAY(Type_Id, id, &unit->type_emission_order, { PRINT(" %lu", id); })
         PRINT(")");
     }
 
@@ -536,11 +522,11 @@ printer_visit_unit(struct Visit* visit, struct Unit* unit)
         printer_indent(p);
         PRINT("(diagnostics");
         p->indentation_level++;
-        for (uint i = 0; i < array_length(&unit->diagnostics); ++i) {
+        FOR_EACH_ARRAY(struct Diagnostic, diagnostic, &unit->diagnostics, {
             PRINT("\n");
             printer_indent(p);
-            VISIT(visit_diagnostic, array_at(struct Diagnostic, &unit->diagnostics, i));
-        }
+            VISIT(visit_diagnostic, &diagnostic);
+        })
         p->indentation_level--;
         PRINT(")");
     }
@@ -555,10 +541,9 @@ printer_visit_type_ref(struct Visit* visit, struct Type_Ref* ref)
     PRINTER_PREAMBLE
 
     PRINT("(ref");
-    for (uint i = 0; i < array_length(&ref->mods); ++i) {
-        enum Type_Modifier mod = *array_at(enum Type_Modifier, &ref->mods, i);
+    FOR_EACH_ARRAY(enum Type_Modifier, mod, &ref->mods, {
         if (mod == TYPE_MOD_REFERENCE) PRINT(" &");
-    }
+    })
     struct Type* target = printer_type_at(p, ref->type_id);
     if (target)
         PRINT(" %s", string_c_str(target->name));
@@ -604,12 +589,11 @@ printer_visit_type_structure(struct Visit* visit, struct Type* type)
     PRINTER_PREAMBLE
 
     PRINT(" structure");
-    for (uint i = 0; i < array_length(&type->value.structure.fields); ++i) {
-        struct Field* field = array_at(struct Field, &type->value.structure.fields, i);
-        PRINT(" (field %s ", string_c_str(field->name));
-        VISIT(visit_type_ref, &field->type);
+    FOR_EACH_ARRAY(struct Field, field, &type->value.structure.fields, {
+        PRINT(" (field %s ", string_c_str(field.name));
+        VISIT(visit_type_ref, &field.type);
         PRINT(")");
-    }
+    })
 }
 
 void
@@ -618,16 +602,14 @@ printer_visit_type_variant(struct Visit* visit, struct Type* type)
     PRINTER_PREAMBLE
 
     PRINT(" variant");
-    for (uint i = 0; i < array_length(&type->value.variant.cases); ++i) {
-        struct Variant_Case* one_case =
-            array_at(struct Variant_Case, &type->value.variant.cases, i);
-        PRINT(" (case %s tag=%u", string_c_str(one_case->name), one_case->tag);
-        if (one_case->has_payload) {
+    FOR_EACH_ARRAY(struct Variant_Case, one_case, &type->value.variant.cases, {
+        PRINT(" (case %s tag=%u", string_c_str(one_case.name), one_case.tag);
+        if (one_case.has_payload) {
             PRINT(" ");
-            VISIT(visit_type_ref, &one_case->payload);
+            VISIT(visit_type_ref, &one_case.payload);
         }
         PRINT(")");
-    }
+    })
 }
 
 void
@@ -638,12 +620,11 @@ printer_visit_type_function(struct Visit* visit, struct Type* type)
     PRINT(" function (returns ");
     VISIT(visit_type_ref, &type->value.function.return_type);
     PRINT(")");
-    for (uint i = 0; i < array_length(&type->value.function.params); ++i) {
-        struct Type_Ref* param = array_at(struct Type_Ref, &type->value.function.params, i);
+    FOR_EACH_ARRAY(struct Type_Ref, param, &type->value.function.params, {
         PRINT(" (param ");
-        VISIT(visit_type_ref, param);
+        VISIT(visit_type_ref, &param);
         PRINT(")");
-    }
+    })
     if (type->value.function.variadic) PRINT(" variadic");
 }
 
@@ -658,12 +639,11 @@ printer_visit_function(struct Visit* visit, struct Function* function)
     PRINT(" (returns ");
     VISIT(visit_type_ref, &function->return_type);
     PRINT(")");
-    for (uint i = 0; i < array_length(&function->params); ++i) {
-        struct Param* param = array_at(struct Param, &function->params, i);
-        PRINT(" (param %s ", string_c_str(param->name));
-        VISIT(visit_type_ref, &param->type);
+    FOR_EACH_ARRAY(struct Param, param, &function->params, {
+        PRINT(" (param %s ", string_c_str(param.name));
+        VISIT(visit_type_ref, &param.type);
         PRINT(")");
-    }
+    })
     if (function->variadic) PRINT(" variadic");
 
     if (function->body) {
@@ -724,18 +704,17 @@ printer_visit_statement_conditional(struct Visit* visit, struct Statement* stmt)
     PRINTER_PREAMBLE
 
     PRINT("(conditional");
-    for (uint i = 0; i < array_length(&stmt->value.conditional.branches); ++i) {
-        struct If_Branch* branch = array_at(struct If_Branch, &stmt->value.conditional.branches, i);
+    FOR_EACH_ARRAY(struct If_Branch, branch, &stmt->value.conditional.branches, {
         PRINT(" ");
-        if (branch->condition) {
+        if (branch.condition) {
             PRINT("(when ");
-            VISIT(visit_expression, branch->condition);
+            VISIT(visit_expression, branch.condition);
             PRINT(") ");
         } else {
             PRINT("(else) ");
         }
-        VISIT(visit_block, branch->body);
-    }
+        VISIT(visit_block, branch.body);
+    })
     PRINT(")");
 }
 
@@ -927,16 +906,14 @@ printer_visit_expression_construct(struct Visit* visit, struct Expression* expr)
         PRINT(" %s", string_c_str(type->name));
     else
         PRINT(" #%lu", expr->value.construct.type_id);
-    for (uint i = 0; i < array_length(&expr->value.construct.fields); ++i) {
-        struct Construct_Field* field =
-            array_at(struct Construct_Field, &expr->value.construct.fields, i);
-        if (field->name.length > 0)
-            PRINT(" (field %s ", string_c_str(field->name));
+    FOR_EACH_ARRAY(struct Construct_Field, field, &expr->value.construct.fields, {
+        if (field.name.length > 0)
+            PRINT(" (field %s ", string_c_str(field.name));
         else
             PRINT(" (positional ");
-        VISIT(visit_expression, field->value);
+        VISIT(visit_expression, field.value);
         PRINT(")");
-    }
+    })
     PRINT(")");
 }