From 95619ecb8ccf8a5405b901e02cfbb389a8f95aba Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Sat, 11 Jan 2020 19:59:01 +0100 Subject: Stop dropping errors from clang * Refactor the error-writing code to be more compact and flexible --- src/errmsg.cpp | 76 ++++++++++++++++++++++++++++++---------------------------- 1 file changed, 40 insertions(+), 36 deletions(-) (limited to 'src/errmsg.cpp') diff --git a/src/errmsg.cpp b/src/errmsg.cpp index edbfd858a8..16d1dcd52f 100644 --- a/src/errmsg.cpp +++ b/src/errmsg.cpp @@ -16,51 +16,49 @@ enum ErrType { }; static void print_err_msg_type(ErrorMsg *err, ErrColor color, ErrType err_type) { - const char *path = buf_ptr(err->path); - size_t line = err->line_start + 1; - size_t col = err->column_start + 1; - const char *text = buf_ptr(err->msg); - bool is_tty = os_stderr_tty(); - if (color == ErrColorOn || (color == ErrColorAuto && is_tty)) { - if (err_type == ErrTypeError) { - os_stderr_set_color(TermColorBold); - fprintf(stderr, "%s:%" ZIG_PRI_usize ":%" ZIG_PRI_usize ": ", path, line, col); - os_stderr_set_color(TermColorRed); - fprintf(stderr, "error:"); - os_stderr_set_color(TermColorBold); - fprintf(stderr, " %s", text); - os_stderr_set_color(TermColorReset); - fprintf(stderr, "\n"); - } else if (err_type == ErrTypeNote) { - os_stderr_set_color(TermColorBold); - fprintf(stderr, "%s:%" ZIG_PRI_usize ":%" ZIG_PRI_usize ": ", path, line, col); - os_stderr_set_color(TermColorCyan); - fprintf(stderr, "note:"); - os_stderr_set_color(TermColorBold); - fprintf(stderr, " %s", text); - os_stderr_set_color(TermColorReset); - fprintf(stderr, "\n"); - } else { + bool use_colors = color == ErrColorOn || (color == ErrColorAuto && is_tty); + + // Show the error location, if available + if (err->path != nullptr) { + const size_t line = err->line_start + 1; + const size_t col = err->column_start + 1; + + if (use_colors) os_stderr_set_color(TermColorBold); + fprintf(stderr, "%s:%" ZIG_PRI_usize ":%" ZIG_PRI_usize ": ", buf_ptr(err->path), line, col); + } + + // Write out the error type + switch (err_type) { + case ErrTypeError: + if (use_colors) os_stderr_set_color(TermColorRed); + fprintf(stderr, "error: "); + break; + case ErrTypeNote: + if (use_colors) os_stderr_set_color(TermColorCyan); + fprintf(stderr, "note: "); + break; + default: zig_unreachable(); - } + } + // Write out the error message + if (use_colors) os_stderr_set_color(TermColorBold); + fputs(buf_ptr(err->msg), stderr); + if (use_colors) os_stderr_set_color(TermColorReset); + fputc('\n', stderr); + + if (buf_len(&err->line_buf) != 0){ + // Show the referenced line fprintf(stderr, "%s\n", buf_ptr(&err->line_buf)); for (size_t i = 0; i < err->column_start; i += 1) { fprintf(stderr, " "); } - os_stderr_set_color(TermColorGreen); + // Draw the caret + if (use_colors) os_stderr_set_color(TermColorGreen); fprintf(stderr, "^"); - os_stderr_set_color(TermColorReset); + if (use_colors) os_stderr_set_color(TermColorReset); fprintf(stderr, "\n"); - } else { - if (err_type == ErrTypeError) { - fprintf(stderr, "%s:%" ZIG_PRI_usize ":%" ZIG_PRI_usize ": error: %s\n", path, line, col, text); - } else if (err_type == ErrTypeNote) { - fprintf(stderr, " %s:%" ZIG_PRI_usize ":%" ZIG_PRI_usize ": note: %s\n", path, line, col, text); - } else { - zig_unreachable(); - } } for (size_t i = 0; i < err->notes.length; i += 1) { @@ -86,6 +84,12 @@ ErrorMsg *err_msg_create_with_offset(Buf *path, size_t line, size_t column, size err_msg->column_start = column; err_msg->msg = msg; + if (source == nullptr) { + // Must initialize the buffer anyway + buf_init_from_str(&err_msg->line_buf, ""); + return err_msg; + } + size_t line_start_offset = offset; for (;;) { if (line_start_offset == 0) { -- cgit v1.2.3 From fc20a589931ab9aac6f51e7685d724cbec52dd9e Mon Sep 17 00:00:00 2001 From: Michael Dusan Date: Sat, 11 Jan 2020 16:45:57 -0500 Subject: strip cwd from compile error paths closes #43138 --- src/errmsg.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) (limited to 'src/errmsg.cpp') diff --git a/src/errmsg.cpp b/src/errmsg.cpp index 16d1dcd52f..9425b110c3 100644 --- a/src/errmsg.cpp +++ b/src/errmsg.cpp @@ -21,11 +21,32 @@ static void print_err_msg_type(ErrorMsg *err, ErrColor color, ErrType err_type) // Show the error location, if available if (err->path != nullptr) { + const char *path = buf_ptr(err->path); + Slice pathslice{path, strlen(path)}; + + // Cache cwd + static Buf *cwdbuf{nullptr}; + static Slice cwd; + + if (cwdbuf == nullptr) { + cwdbuf = buf_alloc(); + Error err = os_get_cwd(cwdbuf); + if (err != ErrorNone) + zig_panic("get cwd failed"); + buf_append_char(cwdbuf, ZIG_OS_SEP_CHAR); + cwd.ptr = buf_ptr(cwdbuf); + cwd.len = strlen(cwd.ptr); + } + const size_t line = err->line_start + 1; const size_t col = err->column_start + 1; - if (use_colors) os_stderr_set_color(TermColorBold); - fprintf(stderr, "%s:%" ZIG_PRI_usize ":%" ZIG_PRI_usize ": ", buf_ptr(err->path), line, col); + + // Strip cwd from path + if (memStartsWith(pathslice, cwd)) + fprintf(stderr, ".%c%s:%" ZIG_PRI_usize ":%" ZIG_PRI_usize ": ", ZIG_OS_SEP_CHAR, path+cwd.len, line, col); + else + fprintf(stderr, "%s:%" ZIG_PRI_usize ":%" ZIG_PRI_usize ": ", path, line, col); } // Write out the error type -- cgit v1.2.3