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 }