Coverage Report

Created: 2026-02-23 20:32

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/Users/alexjokela/projects/lattice/src/token.c
Line
Count
Source
1
#include "token.h"
2
#include <stdlib.h>
3
#include <string.h>
4
5
274k
Token token_simple(TokenType type, size_t line, size_t col) {
6
274k
    Token t;
7
274k
    memset(&t, 0, sizeof(t));
8
274k
    t.type = type;
9
274k
    t.line = line;
10
274k
    t.col = col;
11
274k
    return t;
12
274k
}
13
14
152k
Token token_str(TokenType type, char *str, size_t line, size_t col) {
15
152k
    Token t;
16
152k
    memset(&t, 0, sizeof(t));
17
152k
    t.type = type;
18
152k
    t.as.str_val = str;
19
152k
    t.line = line;
20
152k
    t.col = col;
21
152k
    return t;
22
152k
}
23
24
10.2k
Token token_int(int64_t val, size_t line, size_t col) {
25
10.2k
    Token t;
26
10.2k
    memset(&t, 0, sizeof(t));
27
10.2k
    t.type = TOK_INT_LIT;
28
10.2k
    t.as.int_val = val;
29
10.2k
    t.line = line;
30
10.2k
    t.col = col;
31
10.2k
    return t;
32
10.2k
}
33
34
324
Token token_float(double val, size_t line, size_t col) {
35
324
    Token t;
36
324
    memset(&t, 0, sizeof(t));
37
324
    t.type = TOK_FLOAT_LIT;
38
324
    t.as.float_val = val;
39
324
    t.line = line;
40
324
    t.col = col;
41
324
    return t;
42
324
}
43
44
437k
void token_free(Token *t) {
45
437k
    if (t->type == TOK_IDENT || t->type == TOK_STRING_LIT ||
46
437k
        t->type == TOK_MODE_DIRECTIVE ||
47
437k
        t->type == TOK_INTERP_START || t->type == TOK_INTERP_MID ||
48
437k
        t->type == TOK_INTERP_END) {
49
152k
        free(t->as.str_val);
50
152k
        t->as.str_val = NULL;
51
152k
    }
52
437k
}
53
54
static const char *simple_names[] = {
55
    [TOK_FLUX] = "flux", [TOK_FIX] = "fix", [TOK_LET] = "let",
56
    [TOK_FREEZE] = "freeze", [TOK_THAW] = "thaw", [TOK_FORGE] = "forge",
57
    [TOK_FN] = "fn", [TOK_STRUCT] = "struct",
58
    [TOK_IF] = "if", [TOK_ELSE] = "else", [TOK_FOR] = "for", [TOK_IN] = "in",
59
    [TOK_WHILE] = "while", [TOK_LOOP] = "loop",
60
    [TOK_RETURN] = "return", [TOK_BREAK] = "break", [TOK_CONTINUE] = "continue",
61
    [TOK_SPAWN] = "spawn", [TOK_TRUE] = "true", [TOK_FALSE] = "false", [TOK_NIL] = "nil",
62
    [TOK_CLONE] = "clone", [TOK_PRINT] = "print",
63
    [TOK_TRY] = "try", [TOK_CATCH] = "catch", [TOK_SCOPE] = "scope", [TOK_TEST] = "test", [TOK_MATCH] = "match", [TOK_ENUM] = "enum",
64
    [TOK_IMPORT] = "import", [TOK_FROM] = "from", [TOK_AS] = "as",
65
    [TOK_CRYSTALLIZE] = "crystallize", [TOK_SUBLIMATE] = "sublimate",
66
    [TOK_DEFER] = "defer", [TOK_SELECT] = "select",
67
    [TOK_TRAIT] = "trait", [TOK_IMPL] = "impl",
68
    [TOK_TILDE] = "~", [TOK_STAR] = "*",
69
    [TOK_PLUS] = "+", [TOK_MINUS] = "-", [TOK_SLASH] = "/", [TOK_PERCENT] = "%",
70
    [TOK_EQ] = "=", [TOK_EQEQ] = "==", [TOK_BANGEQ] = "!=",
71
    [TOK_LT] = "<", [TOK_GT] = ">", [TOK_LTEQ] = "<=", [TOK_GTEQ] = ">=",
72
    [TOK_AND] = "&&", [TOK_OR] = "||", [TOK_BANG] = "!",
73
    [TOK_DOT] = ".", [TOK_DOTDOT] = "..", [TOK_DOTDOTDOT] = "...", [TOK_ARROW] = "->", [TOK_FATARROW] = "=>",
74
    [TOK_QUESTION_QUESTION] = "??", [TOK_QUESTION_DOT] = "?.", [TOK_QUESTION_LBRACKET] = "?[", [TOK_QUESTION] = "?",
75
    [TOK_PIPE] = "|", [TOK_AMPERSAND] = "&",
76
    [TOK_CARET] = "^", [TOK_LSHIFT] = "<<", [TOK_RSHIFT] = ">>",
77
    [TOK_PLUS_EQ] = "+=", [TOK_MINUS_EQ] = "-=", [TOK_STAR_EQ] = "*=",
78
    [TOK_SLASH_EQ] = "/=", [TOK_PERCENT_EQ] = "%=",
79
    [TOK_AMP_EQ] = "&=", [TOK_PIPE_EQ] = "|=", [TOK_CARET_EQ] = "^=",
80
    [TOK_LSHIFT_EQ] = "<<=", [TOK_RSHIFT_EQ] = ">>=",
81
    [TOK_LPAREN] = "(", [TOK_RPAREN] = ")",
82
    [TOK_LBRACE] = "{", [TOK_RBRACE] = "}",
83
    [TOK_LBRACKET] = "[", [TOK_RBRACKET] = "]",
84
    [TOK_COMMA] = ",", [TOK_COLON] = ":", [TOK_COLONCOLON] = "::",
85
    [TOK_SEMICOLON] = ";",
86
    [TOK_EOF] = "EOF",
87
};
88
89
18
const char *token_type_name(TokenType type) {
90
18
    if (type == TOK_MODE_DIRECTIVE) return "#mode";
91
18
    if (type == TOK_IDENT) return "identifier";
92
15
    if (type == TOK_INT_LIT) return "integer";
93
12
    if (type == TOK_FLOAT_LIT) return "float";
94
12
    if (type == TOK_STRING_LIT) return "string";
95
12
    if (type == TOK_INTERP_START) return "INTERP_START";
96
12
    if (type == TOK_INTERP_MID) return "INTERP_MID";
97
12
    if (type == TOK_INTERP_END) return "INTERP_END";
98
12
    if ((size_t)type < sizeof(simple_names)/sizeof(simple_names[0]) && simple_names[type]) {
99
12
        return simple_names[type];
100
12
    }
101
0
    return "?";
102
12
}