refactor ui flags
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user