mirror of
https://github.com/ziglang/zig.git
synced 2025-12-17 11:43:16 +00:00
Merge pretty printing compile errors branch
This commit is contained in:
commit
cc525bc002
@ -462,7 +462,7 @@ pub const TTY = struct {
|
|||||||
// TODO give this a payload of file handle
|
// TODO give this a payload of file handle
|
||||||
windows_api,
|
windows_api,
|
||||||
|
|
||||||
fn setColor(conf: Config, out_stream: anytype, color: Color) void {
|
pub fn setColor(conf: Config, out_stream: anytype, color: Color) void {
|
||||||
nosuspend switch (conf) {
|
nosuspend switch (conf) {
|
||||||
.no_color => return,
|
.no_color => return,
|
||||||
.escape_codes => switch (color) {
|
.escape_codes => switch (color) {
|
||||||
|
|||||||
@ -31,21 +31,38 @@ pub fn hashSrc(src: []const u8) SrcHash {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn findLineColumn(source: []const u8, byte_offset: usize) struct { line: usize, column: usize } {
|
pub const Loc = struct {
|
||||||
|
line: usize,
|
||||||
|
column: usize,
|
||||||
|
/// Does not include the trailing newline.
|
||||||
|
source_line: []const u8,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn findLineColumn(source: []const u8, byte_offset: usize) Loc {
|
||||||
var line: usize = 0;
|
var line: usize = 0;
|
||||||
var column: usize = 0;
|
var column: usize = 0;
|
||||||
for (source[0..byte_offset]) |byte| {
|
var line_start: usize = 0;
|
||||||
switch (byte) {
|
var i: usize = 0;
|
||||||
|
while (i < byte_offset) : (i += 1) {
|
||||||
|
switch (source[i]) {
|
||||||
'\n' => {
|
'\n' => {
|
||||||
line += 1;
|
line += 1;
|
||||||
column = 0;
|
column = 0;
|
||||||
|
line_start = i + 1;
|
||||||
},
|
},
|
||||||
else => {
|
else => {
|
||||||
column += 1;
|
column += 1;
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return .{ .line = line, .column = column };
|
while (i < source.len and source[i] != '\n') {
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
return .{
|
||||||
|
.line = line,
|
||||||
|
.column = column,
|
||||||
|
.source_line = source[line_start..i],
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn lineDelta(source: []const u8, start: usize, end: usize) isize {
|
pub fn lineDelta(source: []const u8, start: usize, end: usize) isize {
|
||||||
|
|||||||
@ -272,28 +272,52 @@ pub const AllErrors = struct {
|
|||||||
line: u32,
|
line: u32,
|
||||||
column: u32,
|
column: u32,
|
||||||
byte_offset: u32,
|
byte_offset: u32,
|
||||||
|
/// Does not include the trailing newline.
|
||||||
|
source_line: ?[]const u8,
|
||||||
notes: []Message = &.{},
|
notes: []Message = &.{},
|
||||||
},
|
},
|
||||||
plain: struct {
|
plain: struct {
|
||||||
msg: []const u8,
|
msg: []const u8,
|
||||||
},
|
},
|
||||||
|
|
||||||
pub fn renderToStdErr(msg: Message) void {
|
pub fn renderToStdErr(msg: Message, ttyconf: std.debug.TTY.Config) void {
|
||||||
return msg.renderToStdErrInner("error");
|
const stderr_mutex = std.debug.getStderrMutex();
|
||||||
|
const held = std.debug.getStderrMutex().acquire();
|
||||||
|
defer held.release();
|
||||||
|
const stderr = std.io.getStdErr();
|
||||||
|
return msg.renderToStdErrInner(ttyconf, stderr, "error", .Red) catch return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn renderToStdErrInner(msg: Message, kind: []const u8) void {
|
fn renderToStdErrInner(
|
||||||
|
msg: Message,
|
||||||
|
ttyconf: std.debug.TTY.Config,
|
||||||
|
stderr_file: std.fs.File,
|
||||||
|
kind: []const u8,
|
||||||
|
color: std.debug.TTY.Color,
|
||||||
|
) anyerror!void {
|
||||||
|
const stderr = stderr_file.writer();
|
||||||
switch (msg) {
|
switch (msg) {
|
||||||
.src => |src| {
|
.src => |src| {
|
||||||
std.debug.print("{s}:{d}:{d}: {s}: {s}\n", .{
|
try stderr.print("{s}:{d}:{d}: ", .{
|
||||||
src.src_path,
|
src.src_path,
|
||||||
src.line + 1,
|
src.line + 1,
|
||||||
src.column + 1,
|
src.column + 1,
|
||||||
kind,
|
|
||||||
src.msg,
|
|
||||||
});
|
});
|
||||||
|
ttyconf.setColor(stderr, color);
|
||||||
|
try stderr.writeAll(kind);
|
||||||
|
ttyconf.setColor(stderr, .Bold);
|
||||||
|
try stderr.print(" {s}\n", .{src.msg});
|
||||||
|
ttyconf.setColor(stderr, .Reset);
|
||||||
|
if (src.source_line) |line| {
|
||||||
|
try stderr.writeAll(line);
|
||||||
|
try stderr.writeByte('\n');
|
||||||
|
try stderr.writeByteNTimes(' ', src.column);
|
||||||
|
ttyconf.setColor(stderr, .Green);
|
||||||
|
try stderr.writeAll("^\n");
|
||||||
|
ttyconf.setColor(stderr, .Reset);
|
||||||
|
}
|
||||||
for (src.notes) |note| {
|
for (src.notes) |note| {
|
||||||
note.renderToStdErrInner("note");
|
try note.renderToStdErrInner(ttyconf, stderr_file, "note", .Cyan);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.plain => |plain| {
|
.plain => |plain| {
|
||||||
@ -327,6 +351,7 @@ pub const AllErrors = struct {
|
|||||||
.byte_offset = byte_offset,
|
.byte_offset = byte_offset,
|
||||||
.line = @intCast(u32, loc.line),
|
.line = @intCast(u32, loc.line),
|
||||||
.column = @intCast(u32, loc.column),
|
.column = @intCast(u32, loc.column),
|
||||||
|
.source_line = try arena.allocator.dupe(u8, loc.source_line),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -342,6 +367,7 @@ pub const AllErrors = struct {
|
|||||||
.line = @intCast(u32, loc.line),
|
.line = @intCast(u32, loc.line),
|
||||||
.column = @intCast(u32, loc.column),
|
.column = @intCast(u32, loc.column),
|
||||||
.notes = notes,
|
.notes = notes,
|
||||||
|
.source_line = try arena.allocator.dupe(u8, loc.source_line),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -1489,6 +1515,7 @@ pub fn getAllErrorsAlloc(self: *Compilation) !AllErrors {
|
|||||||
.byte_offset = 0,
|
.byte_offset = 0,
|
||||||
.line = err_msg.line,
|
.line = err_msg.line,
|
||||||
.column = err_msg.column,
|
.column = err_msg.column,
|
||||||
|
.source_line = null, // TODO
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2106,8 +2106,12 @@ fn updateModule(gpa: *Allocator, comp: *Compilation, hook: AfterUpdateHook) !voi
|
|||||||
defer errors.deinit(comp.gpa);
|
defer errors.deinit(comp.gpa);
|
||||||
|
|
||||||
if (errors.list.len != 0) {
|
if (errors.list.len != 0) {
|
||||||
|
const ttyconf: std.debug.TTY.Config = switch (comp.color) {
|
||||||
|
.auto, .on => std.debug.detectTTYConfig(),
|
||||||
|
.off => .no_color,
|
||||||
|
};
|
||||||
for (errors.list) |full_err_msg| {
|
for (errors.list) |full_err_msg| {
|
||||||
full_err_msg.renderToStdErr();
|
full_err_msg.renderToStdErr(ttyconf);
|
||||||
}
|
}
|
||||||
const log_text = comp.getCompileLogOutput();
|
const log_text = comp.getCompileLogOutput();
|
||||||
if (log_text.len != 0) {
|
if (log_text.len != 0) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user