about summary refs log tree commit diff
path: root/boot/visit/ir.c
diff options
context:
space:
mode:
Diffstat (limited to 'boot/visit/ir.c')
-rw-r--r--boot/visit/ir.c81
1 files changed, 64 insertions, 17 deletions
diff --git a/boot/visit/ir.c b/boot/visit/ir.c
index 1920f3b..5317276 100644
--- a/boot/visit/ir.c
+++ b/boot/visit/ir.c
@@ -66,7 +66,7 @@ struct Visit_Table
     void (*visit_block)(struct Visit* visitor, struct Block* block);
     void (*visit_type_ref)(struct Visit* visitor, struct Type_Ref* ref);
     void (*visit_import)(struct Visit* visitor, struct Import* import);
-    void (*visit_diagnostic)(struct Visit* visitor, struct Diagnostic* diagnostic);
+    void (*visit_lower_error)(struct Visit* visitor, struct Lower_Error* error);
 };
 
 void
@@ -82,8 +82,7 @@ walk_unit(struct Visit* visit, struct Unit* unit)
     FOR_EACH_ARRAY (struct Function*, function, &unit->functions.entries)
         VISIT(visit_function, *function);
     FOR_EACH_ARRAY (struct Import, import, &unit->imports) VISIT(visit_import, import);
-    FOR_EACH_ARRAY (struct Diagnostic, diagnostic, &unit->diagnostics)
-        VISIT(visit_diagnostic, diagnostic);
+    FOR_EACH_ARRAY (struct Lower_Error, error, &unit->lower_errors) VISIT(visit_lower_error, error);
 }
 
 void
@@ -362,7 +361,7 @@ walk_block(struct Visit* visit, struct Block* block)
 
 WALK_LEAF_FUNCTION(walk_type_ref, struct Type_Ref*);
 WALK_LEAF_FUNCTION(walk_import, struct Import*);
-WALK_LEAF_FUNCTION(walk_diagnostic, struct Diagnostic*);
+WALK_LEAF_FUNCTION(walk_lower_error, struct Lower_Error*);
 
 struct Visit_Table walk_functions = {
     .visit_unit = walk_unit,
@@ -407,7 +406,7 @@ struct Visit_Table walk_functions = {
     .visit_block = walk_block,
     .visit_type_ref = walk_type_ref,
     .visit_import = walk_import,
-    .visit_diagnostic = walk_diagnostic,
+    .visit_lower_error = walk_lower_error,
 };
 
 void
@@ -515,15 +514,15 @@ printer_visit_unit(struct Visit* visit, struct Unit* unit)
         PRINT(")");
     }
 
-    if (array_length(&unit->diagnostics) > 0) {
+    if (array_length(&unit->lower_errors) > 0) {
         PRINT("\n");
         printer_indent(p);
-        PRINT("(diagnostics");
+        PRINT("(lower_errors");
         p->indentation_level++;
-        FOR_EACH_ARRAY (struct Diagnostic, diagnostic, &unit->diagnostics) {
+        FOR_EACH_ARRAY (struct Lower_Error, error, &unit->lower_errors) {
             PRINT("\n");
             printer_indent(p);
-            VISIT(visit_diagnostic, diagnostic);
+            VISIT(visit_lower_error, error);
         }
         p->indentation_level--;
         PRINT(")");
@@ -947,15 +946,63 @@ printer_visit_import(struct Visit* visit, struct Import* import)
 }
 
 void
-printer_visit_diagnostic(struct Visit* visit, struct Diagnostic* diagnostic)
+printer_visit_lower_error(struct Visit* visit, struct Lower_Error* error)
 {
     PRINTER_PREAMBLE
-    const ascii* sev = "note";
-    if (diagnostic->severity == DIAGNOSTIC_WARNING)
-        sev = "warning";
-    else if (diagnostic->severity == DIAGNOSTIC_ERROR)
-        sev = "error";
-    PRINT("(%s \"%s\")", sev, string_c_str(diagnostic->message));
+
+    switch (error->kind) {
+    case LOWER_ERROR_UNDEFINED_TYPE:
+        PRINT("(undefined-type %s)", string_c_str(error->name));
+        return;
+    case LOWER_ERROR_DUPLICATE_TYPE:
+        PRINT("(duplicate-type %s)", string_c_str(error->name));
+        return;
+    case LOWER_ERROR_DUPLICATE_FUNCTION:
+        PRINT("(duplicate-function %s)", string_c_str(error->name));
+        return;
+    case LOWER_ERROR_NAME_SHADOWS:
+        PRINT("(name-shadows %s)", string_c_str(error->name));
+        return;
+    case LOWER_ERROR_TYPE_CYCLE: {
+        PRINT("(type-cycle (chain");
+        FOR_EACH_ARRAY (Type_Id, id, &error->cycle_chain) {
+            struct Type* type = printer_type_at(p, *id);
+            if (type)
+                PRINT(" %s", string_c_str(type->name));
+            else
+                PRINT(" #%lu", *id);
+        }
+        PRINT("))");
+        return;
+    }
+    case LOWER_ERROR_ASSIGNMENT_AS_EXPRESSION:
+        PRINT("(assignment-as-expression)");
+        return;
+    case LOWER_ERROR_RANGE_OUTSIDE_LOOP:
+        PRINT("(range-outside-loop)");
+        return;
+    case LOWER_ERROR_CONSTRUCT_SUBJECT_NOT_NAME:
+        PRINT("(construct-subject-not-name)");
+        return;
+    case LOWER_ERROR_TYPE_EXPRESSION_IN_BODY:
+        PRINT("(type-expression-in-body)");
+        return;
+    case LOWER_ERROR_UNSUPPORTED_TOP_LEVEL:
+        PRINT("(unsupported-top-level)");
+        return;
+    case LOWER_ERROR_UNKNOWN_LOOP_STYLE:
+        PRINT("(unknown-loop-style)");
+        return;
+    case LOWER_ERROR_UNKNOWN_COMPOUND_ASSIGN:
+        PRINT("(unknown-compound-assign)");
+        return;
+    case LOWER_ERROR_UNIMPLEMENTED:
+        PRINT("(unimplemented \"%s\")", string_c_str(error->detail));
+        return;
+    default:
+        PRINT("(unknown-error)");
+        return;
+    }
 }
 
 struct Visit_Table printer_visit_functions = {
@@ -1001,7 +1048,7 @@ struct Visit_Table printer_visit_functions = {
     .visit_block = printer_visit_block,
     .visit_type_ref = printer_visit_type_ref,
     .visit_import = printer_visit_import,
-    .visit_diagnostic = printer_visit_diagnostic,
+    .visit_lower_error = printer_visit_lower_error,
 };
 
 void