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 }