diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-01-16 13:01:36 -0500 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2020-01-16 13:01:36 -0500 |
| commit | fbe6af81fdb1b964bb0c28f51de2458800b8274c (patch) | |
| tree | 6d65a49b911ba665a7e2c28c6619d1aa6517a744 /src/errmsg.cpp | |
| parent | 230d27c1cd00e7adf0ccfca2c8bb73ae1779aa4c (diff) | |
| parent | 7e5e767ba0fdde91dd66690168eff96b75c28e33 (diff) | |
| download | zig-fbe6af81fdb1b964bb0c28f51de2458800b8274c.tar.gz zig-fbe6af81fdb1b964bb0c28f51de2458800b8274c.zip | |
Merge remote-tracking branch 'origin/master' into llvm10
Diffstat (limited to 'src/errmsg.cpp')
| -rw-r--r-- | src/errmsg.cpp | 95 |
1 files changed, 60 insertions, 35 deletions
diff --git a/src/errmsg.cpp b/src/errmsg.cpp index edbfd858a8..9425b110c3 100644 --- a/src/errmsg.cpp +++ b/src/errmsg.cpp @@ -16,51 +16,70 @@ 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); + bool use_colors = color == ErrColorOn || (color == ErrColorAuto && is_tty); + + // Show the error location, if available + if (err->path != nullptr) { + const char *path = buf_ptr(err->path); + Slice<const char> pathslice{path, strlen(path)}; + + // Cache cwd + static Buf *cwdbuf{nullptr}; + static Slice<const char> 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); + + // 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); - 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 { + } + + // 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 +105,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) { |
