diff options
Diffstat (limited to 'boot/visit/ir.c')
| -rw-r--r-- | boot/visit/ir.c | 81 |
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 |
