aboutsummaryrefslogtreecommitdiff
path: root/boot/visit
diff options
context:
space:
mode:
Diffstat (limited to 'boot/visit')
-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