for i: 0, pa.len print(pa.data[i] as i32);
}
-SomeType :: enum (u16) {
- Value1;
- Value2;
- Value3 = 80;
- Value4;
-}
+SomeType :: enum #flags { Value1; Value2; Value3; Value4; }
print_st :: proc (st: SomeType) {
print(st as i32);
}
proc #export "main" {
-
st := SomeType.Value4;
print_st(st);
bh_arr_new(global_heap_allocator, enum_node->values, 4);
+ while (parser->curr->type == '#') {
+ if (parse_possible_directive(parser, "flags")) {
+ enum_node->flags |= Ast_Flag_Enum_Is_Flags;
+ } else {
+ OnyxToken* directive_token = expect_token(parser, '#');
+ OnyxToken* symbol_token = expect_token(parser, Token_Type_Symbol);
+
+ onyx_message_add(Msg_Type_Unknown_Directive,
+ directive_token->pos,
+ symbol_token->text, symbol_token->length);
+ }
+ }
+
AstType* backing = (AstType *) &basic_type_u32;
if (parser->curr->type == '(') {
consume_token(parser);
evalue->token = expect_token(parser, Token_Type_Symbol);
evalue->type_node = (AstType *) enum_node;
- if (parser->curr->type == '=') {
+ if (parser->curr->type == ':') {
consume_token(parser);
+ expect_token(parser, ':');
+
evalue->value = parse_numeric_literal(parser);
}
enum_node->backing_type = type_build_from_ast(semstate.allocator, enum_node->backing);
enum_node->scope = scope_create(semstate.node_allocator, NULL);
- u64 next_assign_value = 0;
+ u64 next_assign_value = (enum_node->flags & Ast_Flag_Enum_Is_Flags) ? 1 : 0;
bh_arr_each(AstEnumValue *, value, enum_node->values) {
symbol_introduce(enum_node->scope, (*value)->token, (AstNode *) *value);
(*value)->value = num;
}
- next_assign_value++;
+ if (enum_node->flags & Ast_Flag_Enum_Is_Flags) {
+ next_assign_value <<= 1;
+ } else {
+ next_assign_value++;
+ }
}
}