refactor ui flags

This commit is contained in:
Krzosa Karol
2025-01-16 08:55:00 +01:00
parent 6a1bb5a881
commit 947ac4bdf1
7 changed files with 100 additions and 59 deletions

View File

@@ -1,22 +1,24 @@
typedef enum {
#define AST_FLAG_XLIST \
X(null) \
X(string) \
X(integer) \
X(real) \
X(binary) \
X(enum) \
X(enum_member) \
X(struct) \
X(struct_member) \
X(var) \
X(type_name) \
X(type_pointer) \
X(type_array) \
X(dont_serialize)
#define AST_FLAG_XLIST \
X(ast_flag_null) \
X(ast_flag_string) \
X(ast_flag_integer) \
X(ast_flag_real) \
X(ast_flag_binary) \
X(ast_flag_enum) \
X(ast_flag_enum_member) \
X(ast_flag_struct) \
X(ast_flag_struct_member) \
X(ast_flag_var) \
X(ast_flag_type_name) \
X(ast_flag_type_pointer) \
X(ast_flag_type_array) \
X(ast_flag_dont_serialize) \
X(ast_flag_flag_enum) \
#define X(NAME) ast_flag_##NAME,
#define X(NAME) NAME,
AST_FLAG_XLIST
#undef X
} ast_flag_t;
@@ -39,7 +41,7 @@ struct ast_t {
s8_t s8_serial_ast_flag_t(ma_arena_t *arena, ast_flag_t flag) {
ma_temp_t scratch = ma_begin_scratch1(arena);
sb8_t *sb = sb8_serial_begin(scratch.arena);
#define X(NAME) if (flag & set_bit(ast_flag_##NAME)) sb8_printf(sb, #NAME);
#define X(NAME) if (flag & set_bit(NAME)) sb8_printf(sb, #NAME);
AST_FLAG_XLIST
#undef X
s8_t result = sb8_serial_end(arena, sb);
@@ -252,6 +254,12 @@ ast_t *parse_decls(ma_arena_t *arena, char *file, s8_t code) {
parser_expect(par, lex_kind_close_brace);
n->string = parser_expect(par, lex_kind_ident)->string;
parser_expect(par, lex_kind_semicolon);
if (parser_match(par, lex_kind_tag) && parser_expecti(par, s8_lit("flags"))) {
n->flags |= set_bit(ast_flag_flag_enum);
}
matched = true;
}

View File

@@ -46,7 +46,17 @@ s8_t s8_serial_ast(ma_arena_t *arena, ast_t *n) {
s8_t s8_serial_ast_to_code(ma_arena_t *arena, ast_t *n);
void sb8_serial_ast_to_code(sb8_t *sb, ast_t *n) {
if (n->flags & set_bit(ast_flag_enum)) {
if (n->flags & set_bit(ast_flag_flag_enum)) {
sb8_stmtf(sb, "typedef u32 %S;", n->string);
sb8_stmtf(sb, "enum {");
sb->indent += 1;
int i = 0;
for (ast_t *it = n->first; it; it = it->next) {
sb8_stmtf(sb, "%S = 1 << %d,", it->string, i++);
}
sb->indent -= 1;
sb8_stmtf(sb, "};");
} else if (n->flags & set_bit(ast_flag_enum)) {
sb8_printf(sb, "typedef enum {");
sb->indent += 1;
for (ast_t *it = n->first; it; it = it->next) {