lib/pluck/src/toplevel/diagnostics.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const context_owner = @import("context.zig");
 2 const ToplevelContext = context_owner.ToplevelContext;
 3 const top_types = @import("types.zig");
 4 const ToplevelError = top_types.ToplevelError;
 5 const SourceSpan = top_types.SourceSpan;
 6 
 7 pub fn formatParseError(self: *const ToplevelContext, writer: anytype) !void {
 8     if (self.last_error_span) |span| {
 9         try writer.print("parse error at {d}:{d}\n", .{ span.start.line + 1, span.start.column + 1 });
10         return;
11     }
12     try writer.print("parse error\n", .{});
13 }
14 
15 pub fn formatError(self: *const ToplevelContext, writer: anytype) !void {
16     try formatParseError(self, writer);
17 }
18 
19 pub fn lastErrorSpan(self: *const ToplevelContext) ?SourceSpan {
20     return self.last_error_span;
21 }
22 
23 pub fn formatToplevelError(self: *const ToplevelContext, err: anyerror, writer: anytype) !void {
24     if (err == ToplevelError.ParseError) {
25         try formatError(self, writer);
26         return;
27     }
28 
29     if (err == ToplevelError.InvalidToplevelForm) {
30         try writer.print("invalid top-level form\n", .{});
31         return;
32     }
33     if (err == ToplevelError.InvalidDefineForm) {
34         try writer.print("invalid define form\n", .{});
35         return;
36     }
37     if (err == ToplevelError.InvalidDefineTypeForm) {
38         try writer.print("invalid type definition form\n", .{});
39         return;
40     }
41     if (err == ToplevelError.InvalidQueryForm) {
42         try writer.print("invalid query form\n", .{});
43         return;
44     }
45     if (err == ToplevelError.UndefinedReference) {
46         try writer.print("undefined reference\n", .{});
47         return;
48     }
49     if (err == ToplevelError.UnrecognizedQueryConstructor) {
50         if (self.last_query_constructor_typo) |info| {
51             try writer.print(
52                 "unrecognized query constructor '{s}' (did you mean '{s}'?)\n",
53                 .{ info.got, info.suggestion },
54             );
55         } else {
56             try writer.print("unrecognized query constructor\n", .{});
57         }
58         return;
59     }
60     if (err == ToplevelError.QueryConstructorNotImplemented) {
61         try writer.print("query constructor is not implemented\n", .{});
62         return;
63     }
64     if (err == ToplevelError.InvalidQueryConstructorArgs) {
65         try writer.print("invalid query constructor arguments\n", .{});
66         return;
67     }
68     if (err == ToplevelError.QueryFailed) {
69         try writer.print("query failed\n", .{});
70         return;
71     }
72     if (err == ToplevelError.FileNotFound) {
73         try writer.print("file not found\n", .{});
74         return;
75     }
76     if (err == ToplevelError.IoError) {
77         try writer.print("I/O error\n", .{});
78         return;
79     }
80     if (err == ToplevelError.StdlibLoadFailed) {
81         try writer.print("internal error: failed to load standard library\n", .{});
82         return;
83     }
84     if (err == ToplevelError.OutOfMemory or err == error.OutOfMemory) {
85         try writer.print("out of memory\n", .{});
86         return;
87     }
88 
89     try writer.print("error: {s}\n", .{@errorName(err)});
90 }