aboutsummaryrefslogtreecommitdiff
path: root/src/error.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/error.cpp')
-rw-r--r--src/error.cpp100
1 files changed, 58 insertions, 42 deletions
diff --git a/src/error.cpp b/src/error.cpp
index 1877a672b..03d96219b 100644
--- a/src/error.cpp
+++ b/src/error.cpp
@@ -266,7 +266,7 @@ gb_internal void terminal_reset_colours(void) {
}
-gb_internal isize show_error_on_line(TokenPos const &pos, TokenPos end, char const *prefix=nullptr) {
+gb_internal isize show_error_on_line(TokenPos const &pos, TokenPos end) {
get_error_value()->end = end;
if (!show_error_line()) {
return -1;
@@ -289,17 +289,13 @@ gb_internal isize show_error_on_line(TokenPos const &pos, TokenPos end, char con
MAX_LINE_LENGTH_PADDED = MAX_LINE_LENGTH-MAX_TAB_WIDTH-ELLIPSIS_PADDING,
};
- if (prefix) {
- error_out("\t%s\n\n", prefix);
- }
+ i32 error_length = gb_max(end.offset - pos.offset, 1);
error_out("\t");
terminal_set_colours(TerminalStyle_Bold, TerminalColour_White);
- i32 error_length = gb_max(end.offset - pos.offset, 1);
-
isize squiggle_extra = 0;
if (line_len > MAX_LINE_LENGTH_PADDED) {
@@ -394,8 +390,6 @@ gb_internal void error_va(TokenPos const &pos, TokenPos end, char const *fmt, va
error_out_empty();
} else {
error_out_pos(pos);
- }
- if (has_ansi_terminal_colours()) {
error_out_coloured("Error: ", TerminalStyle_Normal, TerminalColour_Red);
}
error_out_va(fmt, va);
@@ -411,29 +405,31 @@ gb_internal void warning_va(TokenPos const &pos, TokenPos end, char const *fmt,
error_va(pos, end, fmt, va);
return;
}
+ if (global_ignore_warnings()) {
+ return;
+ }
+
global_error_collector.warning_count.fetch_add(1);
mutex_lock(&global_error_collector.mutex);
push_error_value(pos, ErrorValue_Warning);
- if (!global_ignore_warnings()) {
- if (pos.line == 0) {
+ if (pos.line == 0) {
+ error_out_empty();
+ error_out_coloured("Warning: ", TerminalStyle_Normal, TerminalColour_Yellow);
+ error_out_va(fmt, va);
+ error_out("\n");
+ } else {
+ // global_error_collector.prev = pos;
+ if (json_errors()) {
error_out_empty();
- error_out_coloured("Warning: ", TerminalStyle_Normal, TerminalColour_Yellow);
- error_out_va(fmt, va);
- error_out("\n");
} else {
- // global_error_collector.prev = pos;
- if (json_errors()) {
- error_out_empty();
- } else {
- error_out_pos(pos);
- }
+ error_out_pos(pos);
error_out_coloured("Warning: ", TerminalStyle_Normal, TerminalColour_Yellow);
- error_out_va(fmt, va);
- error_out("\n");
- show_error_on_line(pos, end);
}
+ error_out_va(fmt, va);
+ error_out("\n");
+ show_error_on_line(pos, end);
}
try_pop_error_value();
mutex_unlock(&global_error_collector.mutex);
@@ -520,7 +516,7 @@ gb_internal void syntax_error_with_verbose_va(TokenPos const &pos, TokenPos end,
if (pos.line == 0) {
error_out_empty();
- error_out_coloured("Syntax_Error: ", TerminalStyle_Normal, TerminalColour_Red);
+ error_out_coloured("Syntax Error: ", TerminalStyle_Normal, TerminalColour_Red);
error_out_va(fmt, va);
error_out("\n");
} else {
@@ -531,7 +527,7 @@ gb_internal void syntax_error_with_verbose_va(TokenPos const &pos, TokenPos end,
error_out_pos(pos);
}
if (has_ansi_terminal_colours()) {
- error_out_coloured("Syntax_Error: ", TerminalStyle_Normal, TerminalColour_Red);
+ error_out_coloured("Syntax Error: ", TerminalStyle_Normal, TerminalColour_Red);
}
error_out_va(fmt, va);
error_out("\n");
@@ -548,30 +544,31 @@ gb_internal void syntax_warning_va(TokenPos const &pos, TokenPos end, char const
syntax_error_va(pos, end, fmt, va);
return;
}
+ if (global_ignore_warnings()) {
+ return;
+ }
mutex_lock(&global_error_collector.mutex);
global_error_collector.warning_count++;
push_error_value(pos, ErrorValue_Warning);
- if (!global_ignore_warnings()) {
- if (pos.line == 0) {
+ if (pos.line == 0) {
+ error_out_empty();
+ error_out_coloured("Syntax Warning: ", TerminalStyle_Normal, TerminalColour_Yellow);
+ error_out_va(fmt, va);
+ error_out("\n");
+ } else {
+ // global_error_collector.prev = pos;
+ if (json_errors()) {
error_out_empty();
- error_out_coloured("Syntax Warning: ", TerminalStyle_Normal, TerminalColour_Yellow);
- error_out_va(fmt, va);
- error_out("\n");
} else {
- // global_error_collector.prev = pos;
- if (json_errors()) {
- error_out_empty();
- } else {
- error_out_pos(pos);
- }
- error_out_coloured("Syntax Warning: ", TerminalStyle_Normal, TerminalColour_Yellow);
- error_out_va(fmt, va);
- error_out("\n");
- // show_error_on_line(pos, end);
+ error_out_pos(pos);
}
+ error_out_coloured("Syntax Warning: ", TerminalStyle_Normal, TerminalColour_Yellow);
+ error_out_va(fmt, va);
+ error_out("\n");
+ // show_error_on_line(pos, end);
}
try_pop_error_value();
@@ -672,7 +669,20 @@ gb_internal int error_value_cmp(void const *a, void const *b) {
return token_pos_cmp(x->pos, y->pos);
}
+gb_internal bool errors_already_printed = false;
+
gb_internal void print_all_errors(void) {
+ if (errors_already_printed) {
+ if (global_error_collector.warning_count.load() == global_error_collector.error_values.count) {
+ for (ErrorValue &ev : global_error_collector.error_values) {
+ array_free(&ev.msg);
+ }
+ array_clear(&global_error_collector.error_values);
+ errors_already_printed = false;
+ }
+ return;
+ }
+
auto const &escape_char = [](gbString res, u8 c) -> gbString {
switch (c) {
case '\n': res = gb_string_append_length(res, "\\n", 2); break;
@@ -719,9 +729,13 @@ gb_internal void print_all_errors(void) {
}
}
- if (it.str.len-it.pos > 0) {
- array_add_elems(&prev_ev->msg, it.str.text+it.pos, it.str.len-it.pos);
+ // Merge additional text (suggestions for example) into the previous error.
+ String current = {prev_ev->msg.data, prev_ev->msg.count};
+ String addition = {it.str.text+it.pos, it.str.len-it.pos};
+ if (addition.len > 0 && !string_contains_string(current, addition)) {
+ array_add_elems(&prev_ev->msg, addition.text, addition.len);
}
+
array_free(&ev.msg);
array_ordered_remove(&global_error_collector.error_values, i);
} else {
@@ -823,4 +837,6 @@ gb_internal void print_all_errors(void) {
}
gbFile *f = gb_file_get_standard(gbFileStandard_Error);
gb_file_write(f, res, gb_string_length(res));
-} \ No newline at end of file
+
+ errors_already_printed = true;
+}