This commit is contained in:
agra
2026-02-24 13:37:27 +02:00
parent 170e236764
commit b98711a1d3
13 changed files with 157 additions and 632 deletions

View File

@@ -31,6 +31,7 @@ pub const Diagnostic = struct {
level: Level,
message: []const u8,
span: ?Span,
source_file: ?[]const u8 = null,
};
pub const DiagnosticList = struct {
@@ -38,6 +39,8 @@ pub const DiagnosticList = struct {
allocator: std.mem.Allocator,
source: []const u8,
file_name: []const u8,
current_source_file: ?[]const u8 = null,
import_sources: ?*const std.StringHashMap([:0]const u8) = null,
pub fn init(allocator: std.mem.Allocator, source: []const u8, file_name: []const u8) DiagnosticList {
return .{
@@ -64,6 +67,7 @@ pub const DiagnosticList = struct {
.level = level,
.message = message,
.span = span,
.source_file = self.current_source_file,
}) catch {};
}
@@ -79,6 +83,17 @@ pub const DiagnosticList = struct {
return false;
}
fn resolveSourceAndFile(self: *const DiagnosticList, d: Diagnostic) struct { source: []const u8, file_name: []const u8 } {
if (d.source_file) |sf| {
if (self.import_sources) |is| {
if (is.get(sf)) |src| {
return .{ .source = src, .file_name = sf };
}
}
}
return .{ .source = self.source, .file_name = self.file_name };
}
pub fn render(self: *const DiagnosticList, writer: anytype) !void {
for (self.items.items) |d| {
const level_str = switch (d.level) {
@@ -87,8 +102,9 @@ pub const DiagnosticList = struct {
.note => "note",
};
if (d.span) |span| {
const loc = SourceLoc.compute(self.source, span.start);
try writer.print("{s}:{d}:{d}: {s}: {s}\n", .{ self.file_name, loc.line, loc.col, level_str, d.message });
const resolved = self.resolveSourceAndFile(d);
const loc = SourceLoc.compute(resolved.source, span.start);
try writer.print("{s}:{d}:{d}: {s}: {s}\n", .{ resolved.file_name, loc.line, loc.col, level_str, d.message });
} else {
try writer.print("{s}: {s}: {s}\n", .{ self.file_name, level_str, d.message });
}
@@ -103,8 +119,9 @@ pub const DiagnosticList = struct {
.note => "note",
};
if (d.span) |span| {
const loc = SourceLoc.compute(self.source, span.start);
std.debug.print("{s}:{d}:{d}: {s}: {s}\n", .{ self.file_name, loc.line, loc.col, level_str, d.message });
const resolved = self.resolveSourceAndFile(d);
const loc = SourceLoc.compute(resolved.source, span.start);
std.debug.print("{s}:{d}:{d}: {s}: {s}\n", .{ resolved.file_name, loc.line, loc.col, level_str, d.message });
} else {
std.debug.print("{s}: {s}: {s}\n", .{ self.file_name, level_str, d.message });
}