aboutsummaryrefslogtreecommitdiff
path: root/src/Package.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-02-23 19:21:44 -0700
committerAndrew Kelley <andrew@ziglang.org>2023-03-15 10:48:13 -0700
commit6f717b18f05ba02439603e0987e9c9551fbadedb (patch)
treec95613ef714eed338372d1947c0132808beffab4 /src/Package.zig
parent572cb24d1a4f70c662ddf17df72d27dec44bc4fc (diff)
downloadzig-6f717b18f05ba02439603e0987e9c9551fbadedb.tar.gz
zig-6f717b18f05ba02439603e0987e9c9551fbadedb.zip
std.zig.ErrorBundle: rework binary encoding
* Separate into a "WIP" struct and a "finished" struct. * Use a bit of indirection for error notes to simplify ergonomics of this data structure.
Diffstat (limited to 'src/Package.zig')
-rw-r--r--src/Package.zig36
1 files changed, 17 insertions, 19 deletions
diff --git a/src/Package.zig b/src/Package.zig
index febcc51788..d26daf5a0c 100644
--- a/src/Package.zig
+++ b/src/Package.zig
@@ -225,7 +225,7 @@ pub fn fetchAndAddDependencies(
dependencies_source: *std.ArrayList(u8),
build_roots_source: *std.ArrayList(u8),
name_prefix: []const u8,
- error_bundle: *std.zig.ErrorBundle,
+ error_bundle: *std.zig.ErrorBundle.Wip,
all_modules: *AllModules,
) !void {
const max_bytes = 10 * 1024 * 1024;
@@ -260,13 +260,12 @@ pub fn fetchAndAddDependencies(
if (manifest.errors.len > 0) {
const file_path = try directory.join(arena, &.{Manifest.basename});
for (manifest.errors) |msg| {
- try Report.addErrorMessage(gpa, ast, file_path, error_bundle, 0, msg);
+ try Report.addErrorMessage(ast, file_path, error_bundle, 0, msg);
}
return error.PackageFetchFailed;
}
const report: Report = .{
- .gpa = gpa,
.ast = &ast,
.directory = directory,
.error_bundle = error_bundle,
@@ -343,10 +342,9 @@ pub fn createFilePkg(
}
const Report = struct {
- gpa: Allocator,
ast: *const std.zig.Ast,
directory: Compilation.Directory,
- error_bundle: *std.zig.ErrorBundle,
+ error_bundle: *std.zig.ErrorBundle.Wip,
fn fail(
report: Report,
@@ -354,7 +352,7 @@ const Report = struct {
comptime fmt_string: []const u8,
fmt_args: anytype,
) error{ PackageFetchFailed, OutOfMemory } {
- const gpa = report.gpa;
+ const gpa = report.error_bundle.gpa;
const file_path = try report.directory.join(gpa, &.{Manifest.basename});
defer gpa.free(file_path);
@@ -362,7 +360,7 @@ const Report = struct {
const msg = try std.fmt.allocPrint(gpa, fmt_string, fmt_args);
defer gpa.free(msg);
- try addErrorMessage(report.gpa, report.ast.*, file_path, report.error_bundle, 0, .{
+ try addErrorMessage(report.ast.*, file_path, report.error_bundle, 0, .{
.tok = tok,
.off = 0,
.msg = msg,
@@ -372,30 +370,28 @@ const Report = struct {
}
fn addErrorMessage(
- gpa: Allocator,
ast: std.zig.Ast,
file_path: []const u8,
- eb: *std.zig.ErrorBundle,
+ eb: *std.zig.ErrorBundle.Wip,
notes_len: u32,
msg: Manifest.ErrorMessage,
) error{OutOfMemory}!void {
const token_starts = ast.tokens.items(.start);
const start_loc = ast.tokenLocation(0, msg.tok);
- try eb.addErrorMessage(gpa, .{
- .msg = try eb.addString(gpa, msg.msg),
- .src_loc = try eb.addSourceLocation(gpa, .{
- .src_path = try eb.addString(gpa, file_path),
+ try eb.addRootErrorMessage(.{
+ .msg = try eb.addString(msg.msg),
+ .src_loc = try eb.addSourceLocation(.{
+ .src_path = try eb.addString(file_path),
.span_start = token_starts[msg.tok],
.span_end = @intCast(u32, token_starts[msg.tok] + ast.tokenSlice(msg.tok).len),
.span_main = token_starts[msg.tok] + msg.off,
.line = @intCast(u32, start_loc.line),
.column = @intCast(u32, start_loc.column),
- .source_line = try eb.addString(gpa, ast.source[start_loc.line_start..start_loc.line_end]),
+ .source_line = try eb.addString(ast.source[start_loc.line_start..start_loc.line_end]),
}),
.notes_len = notes_len,
});
- eb.incrementCount(1);
}
};
@@ -526,14 +522,16 @@ fn fetchAndUnpack(
defer gpa.free(file_path);
const eb = report.error_bundle;
- try Report.addErrorMessage(gpa, report.ast.*, file_path, eb, 1, .{
+ const notes_len = 1;
+ try Report.addErrorMessage(report.ast.*, file_path, eb, notes_len, .{
.tok = dep.url_tok,
.off = 0,
.msg = "url field is missing corresponding hash field",
});
- try eb.addErrorMessage(gpa, .{
- .msg = try eb.printString(gpa, "expected .hash = \"{s}\",", .{&actual_hex}),
- });
+ const notes_start = try eb.reserveNotes(notes_len);
+ eb.extra.items[notes_start] = @enumToInt(try eb.addErrorMessage(.{
+ .msg = try eb.printString("expected .hash = \"{s}\",", .{&actual_hex}),
+ }));
return error.PackageFetchFailed;
}