aboutsummaryrefslogtreecommitdiff
path: root/src/Module.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-09-09 18:55:58 +0300
committerVeikka Tuominen <git@vexu.eu>2022-09-15 00:50:18 +0300
commit31daea74d23be813737892a166cc16ade1272a1a (patch)
treeb25f5d80c2a9c63fe6d0099af5f89d38ed492112 /src/Module.zig
parent5e4483fff8077ec8d87ba9125f946955a34b6fc0 (diff)
downloadzig-31daea74d23be813737892a166cc16ade1272a1a.tar.gz
zig-31daea74d23be813737892a166cc16ade1272a1a.zip
stage2: implement referenced by trace for error messages
Closes #7668 Closes #12141
Diffstat (limited to 'src/Module.zig')
-rw-r--r--src/Module.zig20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/Module.zig b/src/Module.zig
index ea89225537..e756cc3dfd 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -166,6 +166,11 @@ decls_free_list: std.ArrayListUnmanaged(Decl.Index) = .{},
global_assembly: std.AutoHashMapUnmanaged(Decl.Index, []u8) = .{},
+reference_table: std.AutoHashMapUnmanaged(Decl.Index, struct {
+ referencer: Decl.Index,
+ src: LazySrcLoc,
+}) = .{},
+
pub const StringLiteralContext = struct {
bytes: *std.ArrayListUnmanaged(u8),
@@ -2084,6 +2089,13 @@ pub const ErrorMsg = struct {
src_loc: SrcLoc,
msg: []const u8,
notes: []ErrorMsg = &.{},
+ reference_trace: []Trace = &.{},
+
+ pub const Trace = struct {
+ decl: ?[*:0]const u8,
+ src_loc: SrcLoc,
+ hidden: u32 = 0,
+ };
pub fn create(
gpa: Allocator,
@@ -2122,8 +2134,15 @@ pub const ErrorMsg = struct {
}
gpa.free(err_msg.notes);
gpa.free(err_msg.msg);
+ gpa.free(err_msg.reference_trace);
err_msg.* = undefined;
}
+
+ pub fn clearTrace(err_msg: *ErrorMsg, gpa: Allocator) void {
+ if (err_msg.reference_trace.len == 0) return;
+ gpa.free(err_msg.reference_trace);
+ err_msg.reference_trace = &.{};
+ }
};
/// Canonical reference to a position within a source file.
@@ -3411,6 +3430,7 @@ pub fn deinit(mod: *Module) void {
mod.decls_free_list.deinit(gpa);
mod.allocated_decls.deinit(gpa);
mod.global_assembly.deinit(gpa);
+ mod.reference_table.deinit(gpa);
mod.string_literal_table.deinit(gpa);
mod.string_literal_bytes.deinit(gpa);