lib/chant/src/parse/state/diagnostic.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const chant = @import("../../root.zig");
3 const types = @import("types.zig");
4 const Error = @import("../root.zig").Error;
5
6 const Token = chant.token.Token;
7 const Parser = types.Parser;
8
9 pub fn fail(parser: *Parser, err: Error, message: []const u8) Error {
10 const tok = parser.tokens[parser.index];
11 parser.diagnostic = .{
12 .message = message,
13 .file = tok.file,
14 .line = tok.line,
15 .column = tok.column,
16 };
17 return err;
18 }
19
20 test "diagnostic records token location" {
21 var arena_state = std.heap.ArenaAllocator.init(std.testing.allocator);
22 defer arena_state.deinit();
23 const arena = arena_state.allocator();
24
25 const tokens = [_]Token{
26 .{ .kind = .integer, .text = "42", .file = "bad.c", .line = 3, .column = 9 },
27 .{ .kind = .eof, .text = "", .file = "bad.c", .line = 3, .column = 11 },
28 };
29 var parser = try @import("test.zig").initParser(arena, &tokens);
30
31 try std.testing.expectEqual(@as(Error, error.ExpectedIdentifier), fail(&parser, error.ExpectedIdentifier, "expected identifier"));
32 try std.testing.expectEqualStrings("expected identifier", parser.diagnostic.message);
33 try std.testing.expectEqualStrings("bad.c", parser.diagnostic.file);
34 try std.testing.expectEqual(@as(u32, 3), parser.diagnostic.line);
35 try std.testing.expectEqual(@as(u32, 9), parser.diagnostic.column);
36 }