mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
- Move aroDiagnosticsToErrorBundle to compiler/util.zig
This commit is contained in:
parent
478cb9ce6a
commit
447280d0d9
4 changed files with 93 additions and 81 deletions
79
lib/compiler/aro/aro/Diagnostics.zig
vendored
79
lib/compiler/aro/aro/Diagnostics.zig
vendored
|
|
@ -562,82 +562,3 @@ fn addMessage(d: *Diagnostics, msg: Message) Compilation.Error!void {
|
|||
},
|
||||
}
|
||||
}
|
||||
|
||||
const ErrorBundle = std.zig.ErrorBundle;
|
||||
|
||||
pub fn toErrorBundle(
|
||||
d: *const Diagnostics,
|
||||
gpa: std.mem.Allocator,
|
||||
fail_msg: ?[]const u8,
|
||||
) !ErrorBundle {
|
||||
@branchHint(.cold);
|
||||
|
||||
var bundle: ErrorBundle.Wip = undefined;
|
||||
try bundle.init(gpa);
|
||||
errdefer bundle.deinit();
|
||||
|
||||
if (fail_msg) |msg| {
|
||||
try bundle.addRootErrorMessage(.{
|
||||
.msg = try bundle.addString(msg),
|
||||
});
|
||||
}
|
||||
|
||||
var cur_err: ?ErrorBundle.ErrorMessage = null;
|
||||
var cur_notes: std.ArrayList(ErrorBundle.ErrorMessage) = .empty;
|
||||
defer cur_notes.deinit(gpa);
|
||||
for (d.output.to_list.messages.items) |msg| {
|
||||
switch (msg.kind) {
|
||||
.off, .warning => {
|
||||
if (cur_err) |err| {
|
||||
try bundle.addRootErrorMessageWithNotes(err, cur_notes.items);
|
||||
// Clear the current error so that notes don't bleed into unassociated errors
|
||||
cur_err = null;
|
||||
}
|
||||
continue;
|
||||
},
|
||||
.note => if (cur_err == null) continue,
|
||||
.@"fatal error", .@"error" => {},
|
||||
}
|
||||
|
||||
const src_loc = src_loc: {
|
||||
if (msg.location) |location| {
|
||||
break :src_loc try bundle.addSourceLocation(.{
|
||||
.src_path = try bundle.addString(location.path),
|
||||
.line = location.line_no - 1, // 1-based -> 0-based
|
||||
.column = location.col - 1, // 1-based -> 0-based
|
||||
.span_start = location.width,
|
||||
.span_main = location.width,
|
||||
.span_end = location.width,
|
||||
.source_line = try bundle.addString(location.line),
|
||||
});
|
||||
}
|
||||
break :src_loc ErrorBundle.SourceLocationIndex.none;
|
||||
};
|
||||
|
||||
switch (msg.kind) {
|
||||
.@"fatal error", .@"error" => {
|
||||
if (cur_err) |err| {
|
||||
try bundle.addRootErrorMessageWithNotes(err, cur_notes.items);
|
||||
}
|
||||
cur_err = .{
|
||||
.msg = try bundle.addString(msg.text),
|
||||
.src_loc = src_loc,
|
||||
};
|
||||
cur_notes.clearRetainingCapacity();
|
||||
},
|
||||
.note => {
|
||||
cur_err.?.notes_len += 1;
|
||||
try cur_notes.append(gpa, .{
|
||||
.msg = try bundle.addString(msg.text),
|
||||
.src_loc = src_loc,
|
||||
});
|
||||
},
|
||||
.off, .warning => unreachable,
|
||||
}
|
||||
}
|
||||
if (cur_err) |err| {
|
||||
try bundle.addRootErrorMessageWithNotes(err, cur_notes.items);
|
||||
}
|
||||
|
||||
return try bundle.toOwnedBundle("");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ const cvtres = @import("cvtres.zig");
|
|||
const hasDisjointCodePage = @import("disjoint_code_page.zig").hasDisjointCodePage;
|
||||
const fmtResourceType = @import("res.zig").NameOrOrdinal.fmtResourceType;
|
||||
const aro = @import("aro");
|
||||
const compiler_util = @import("../util.zig");
|
||||
|
||||
pub fn main() !void {
|
||||
var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;
|
||||
|
|
@ -671,7 +672,11 @@ const ErrorHandler = union(enum) {
|
|||
) !void {
|
||||
switch (self.*) {
|
||||
.server => |*server| {
|
||||
var error_bundle = try comp.diagnostics.toErrorBundle(allocator, fail_msg);
|
||||
var error_bundle = try compiler_util.aroDiagnosticsToErrorBundle(
|
||||
comp.diagnostics,
|
||||
allocator,
|
||||
fail_msg,
|
||||
);
|
||||
defer error_bundle.deinit(allocator);
|
||||
|
||||
try server.serveErrorBundle(error_bundle);
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ const assert = std.debug.assert;
|
|||
const mem = std.mem;
|
||||
const process = std.process;
|
||||
const aro = @import("aro");
|
||||
const compiler_util = @import("../util.zig");
|
||||
const Translator = @import("Translator.zig");
|
||||
|
||||
const fast_exit = @import("builtin").mode != .Debug;
|
||||
|
|
@ -88,7 +89,11 @@ pub fn main() u8 {
|
|||
}
|
||||
|
||||
fn serveErrorBundle(arena: std.mem.Allocator, diagnostics: *const aro.Diagnostics) !void {
|
||||
const error_bundle = try diagnostics.toErrorBundle(arena, "translation failure");
|
||||
const error_bundle = try compiler_util.aroDiagnosticsToErrorBundle(
|
||||
diagnostics,
|
||||
arena,
|
||||
"translation failure",
|
||||
);
|
||||
var stdout_buffer: [1024]u8 = undefined;
|
||||
var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
|
||||
var server: std.zig.Server = .{
|
||||
|
|
|
|||
81
lib/compiler/util.zig
Normal file
81
lib/compiler/util.zig
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
//! Utilities shared between compiler sub-commands
|
||||
const std = @import("std");
|
||||
const aro = @import("aro");
|
||||
const ErrorBundle = std.zig.ErrorBundle;
|
||||
|
||||
pub fn aroDiagnosticsToErrorBundle(
|
||||
d: *const aro.Diagnostics,
|
||||
gpa: std.mem.Allocator,
|
||||
fail_msg: ?[]const u8,
|
||||
) !ErrorBundle {
|
||||
@branchHint(.cold);
|
||||
|
||||
var bundle: ErrorBundle.Wip = undefined;
|
||||
try bundle.init(gpa);
|
||||
errdefer bundle.deinit();
|
||||
|
||||
if (fail_msg) |msg| {
|
||||
try bundle.addRootErrorMessage(.{
|
||||
.msg = try bundle.addString(msg),
|
||||
});
|
||||
}
|
||||
|
||||
var cur_err: ?ErrorBundle.ErrorMessage = null;
|
||||
var cur_notes: std.ArrayList(ErrorBundle.ErrorMessage) = .empty;
|
||||
defer cur_notes.deinit(gpa);
|
||||
for (d.output.to_list.messages.items) |msg| {
|
||||
switch (msg.kind) {
|
||||
.off, .warning => {
|
||||
if (cur_err) |err| {
|
||||
try bundle.addRootErrorMessageWithNotes(err, cur_notes.items);
|
||||
// Clear the current error so that notes don't bleed into unassociated errors
|
||||
cur_err = null;
|
||||
}
|
||||
continue;
|
||||
},
|
||||
.note => if (cur_err == null) continue,
|
||||
.@"fatal error", .@"error" => {},
|
||||
}
|
||||
|
||||
const src_loc = src_loc: {
|
||||
if (msg.location) |location| {
|
||||
break :src_loc try bundle.addSourceLocation(.{
|
||||
.src_path = try bundle.addString(location.path),
|
||||
.line = location.line_no - 1, // 1-based -> 0-based
|
||||
.column = location.col - 1, // 1-based -> 0-based
|
||||
.span_start = location.width,
|
||||
.span_main = location.width,
|
||||
.span_end = location.width,
|
||||
.source_line = try bundle.addString(location.line),
|
||||
});
|
||||
}
|
||||
break :src_loc ErrorBundle.SourceLocationIndex.none;
|
||||
};
|
||||
|
||||
switch (msg.kind) {
|
||||
.@"fatal error", .@"error" => {
|
||||
if (cur_err) |err| {
|
||||
try bundle.addRootErrorMessageWithNotes(err, cur_notes.items);
|
||||
}
|
||||
cur_err = .{
|
||||
.msg = try bundle.addString(msg.text),
|
||||
.src_loc = src_loc,
|
||||
};
|
||||
cur_notes.clearRetainingCapacity();
|
||||
},
|
||||
.note => {
|
||||
cur_err.?.notes_len += 1;
|
||||
try cur_notes.append(gpa, .{
|
||||
.msg = try bundle.addString(msg.text),
|
||||
.src_loc = src_loc,
|
||||
});
|
||||
},
|
||||
.off, .warning => unreachable,
|
||||
}
|
||||
}
|
||||
if (cur_err) |err| {
|
||||
try bundle.addRootErrorMessageWithNotes(err, cur_notes.items);
|
||||
}
|
||||
|
||||
return try bundle.toOwnedBundle("");
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue