refactor: new direction for error reporting
This commit is contained in:
parent
72b686d750
commit
c940374f27
11 changed files with 758 additions and 582 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue