浏览代码

Merge pull request #3744 from Mango0x45/master

Pad ‘^~~~^’-style diagnostic ranges properly
Jeroen van Rijn 1 年之前
父节点
当前提交
45044de0b7
共有 1 个文件被更改,包括 23 次插入7 次删除
  1. 23 7
      src/error.cpp

+ 23 - 7
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("^");
 				}
 			}