refactor: new direction for error reporting

This commit is contained in:
Brett Broadhurst 2026-03-18 17:52:07 -06:00
parent 72b686d750
commit c940374f27
Failed to generate hash of commit
11 changed files with 758 additions and 582 deletions

View file

@ -1,5 +1,6 @@
//! Virtual machine state for story execution.
const std = @import("std");
const Compilation = @import("compile.zig").Compilation;
const tokenizer = @import("tokenizer.zig");
const Ast = @import("Ast.zig");
const AstGen = @import("AstGen.zig");
@ -521,7 +522,7 @@ fn divert(vm: *Story, knot_name: []const u8) !void {
pub const LoadOptions = struct {
dump_writer: ?*std.Io.Writer = null,
stderr_writer: *std.Io.Writer,
error_writer: *std.Io.Writer,
use_color: bool = true,
dump_ast: bool = false,
dump_ir: bool = false,
@ -538,46 +539,22 @@ pub fn loadFromString(
source_bytes: [:0]const u8,
options: LoadOptions,
) !Story {
var arena_allocator = std.heap.ArenaAllocator.init(gpa);
defer arena_allocator.deinit();
const arena = arena_allocator.allocator();
const ast = try Ast.parse(gpa, arena, source_bytes, "<STDIN>", 0);
var comp = try Compilation.compile(gpa, .{
.source_bytes = source_bytes,
.filename = "<STDIN>",
.dump_writer = options.dump_writer,
.dump_use_color = options.use_color,
.dump_ast = options.dump_ast,
.dump_ir = options.dump_ir,
});
defer comp.deinit();
if (options.dump_ast) {
if (options.dump_writer) |w| {
try w.writeAll("=== AST ===\n");
try ast.render(gpa, w, .{
.use_color = options.use_color,
});
if (comp.errors.len > 0) {
for (comp.errors) |err| {
try comp.renderError(options.error_writer, err);
}
return error.Fail;
}
if (ast.errors.len > 0) {
try ast.renderErrors(gpa, options.stderr_writer, .{
.use_color = options.use_color,
});
return error.Invalid;
}
var sem_ir = try AstGen.generate(gpa, &ast);
defer sem_ir.deinit(gpa);
if (sem_ir.errors.len != 0) {
for (sem_ir.errors) |err| {
try options.stderr_writer.print("{any}\n", .{err});
}
try options.stderr_writer.flush();
return error.CompilationFailed;
}
if (options.dump_ir) {
if (options.dump_writer) |w| {
try w.writeAll("=== Semantic IR ===\n");
try sem_ir.dumpInfo(w);
try sem_ir.render(w);
}
}
var compiled = try Sema.compile(gpa, &sem_ir);
defer compiled.deinit(gpa);
var story: Story = .{
.allocator = gpa,
@ -585,9 +562,7 @@ pub fn loadFromString(
.dump_writer = options.dump_writer,
};
errdefer story.deinit();
try compiled.buildRuntime(gpa, &sem_ir, &story);
try comp.setupStoryRuntime(gpa, &story);
if (story.getKnot(Story.default_knot_name)) |knot| {
try story.divertToKnot(knot);
story.can_advance = true;