imports
This commit is contained in:
@@ -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 });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user