aboutsummaryrefslogtreecommitdiff
path: root/src/error.cpp
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2024-06-13 17:34:17 +0200
committerGitHub <noreply@github.com>2024-06-13 17:34:17 +0200
commit45044de0b756f9ab018979abd5350533334a54ac (patch)
tree8d39901afb3343e582b5e8f80680e8be7cea5404 /src/error.cpp
parent20c17ba6f971cf572da4fa5e9601e0df8d517112 (diff)
parentc9c7d3270d71a3d35f12593c12817d2320c41061 (diff)
Merge pull request #3744 from Mango0x45/master
Pad ‘^~~~^’-style diagnostic ranges properly
Diffstat (limited to 'src/error.cpp')
-rw-r--r--src/error.cpp30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/error.cpp b/src/error.cpp
index 03d96219b..d0089c952 100644
--- a/src/error.cpp
+++ b/src/error.cpp
@@ -296,7 +296,7 @@ gb_internal isize show_error_on_line(TokenPos const &pos, TokenPos end) {
terminal_set_colours(TerminalStyle_Bold, TerminalColour_White);
- isize squiggle_extra = 0;
+ i32 squiggle_extra = 0;
if (line_len > MAX_LINE_LENGTH_PADDED) {
i32 left = MAX_TAB_WIDTH;
@@ -323,23 +323,39 @@ gb_internal isize show_error_on_line(TokenPos const &pos, TokenPos end) {
}
error_out("\n\t");
- for (i32 i = 0; i < offset; i++) {
- error_out(" ");
+ for (i32 rune_width, off = 0; off < offset; off += rune_width) {
+ i32 rune;
+ rune_width = cast(i32)utf8proc_iterate((u8 const *)line_text + off, line_len - off, &rune);
+ int w = utf8proc_charwidth(rune);
+ if (w > 0) {
+ error_out("%.*s", w, " ");
+ }
}
terminal_set_colours(TerminalStyle_Bold, TerminalColour_Green);
error_out("^");
if (end.file_id == pos.file_id) {
+ i32 rune;
+
if (end.line > pos.line) {
- for (i32 i = offset; i < line_len; i++) {
- error_out("~");
+ for (i32 rune, rune_width, off = offset; off < line_len; off += rune_width) {
+ rune_width = cast(i32)utf8proc_iterate((u8 const *)line_text + off, line_len - off, &rune);
+ int w = utf8proc_charwidth(rune);
+ if (w > 0) {
+ error_out("%.*s", w, "~~~~");
+ }
}
} else if (end.line == pos.line && end.column > pos.column) {
- for (i32 i = 1; i < error_length-1+squiggle_extra; i++) {
+ i32 columns = squiggle_extra;
+ for (i32 rune, rune_width, off = offset; off < offset + error_length - 1; off += rune_width) {
+ rune_width = cast(i32)utf8proc_iterate((u8 const *)line_text + off, line_len - off, &rune);
+ columns += utf8proc_charwidth(rune);
+ }
+ for (i32 i = 1; i < columns; i++) {
error_out("~");
}
- if (error_length > 1 && squiggle_extra == 0) {
+ if (columns > 0 && squiggle_extra == 0) {
error_out("^");
}
}