Added flags directive to enums
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 26 Jul 2020 19:40:51 +0000 (14:40 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 26 Jul 2020 19:40:51 +0000 (14:40 -0500)
docs/plan
include/onyxastnodes.h
onyx
progs/ez.onyx
src/onyxparser.c
src/onyxsymres.c

index fd4b099f22f621ddfe506beea97a78eb2b58431b..aa24c32e9f867d8e5f0f73aa2bb8d87dc117125f 100644 (file)
--- a/docs/plan
+++ b/docs/plan
@@ -117,7 +117,7 @@ HOW:
 
         [X] Package system
 
-        [ ] Enum types
+        [X] Enum types
 
         [ ] Static pointers to sized data
 
index 1393417b8e40b3bb841429e0ea674fa3cc397d4b..785cda91fe0b3880dd488f7529e41f19416a1989 100644 (file)
@@ -135,6 +135,9 @@ typedef enum AstFlags {
     
     // Type flags
     Ast_Flag_Type_Is_Resolved = BH_BIT(8),
+
+    // Enum flags
+    Ast_Flag_Enum_Is_Flags    = BH_BIT(11),
 } AstFlags;
 
 typedef enum UnaryOp {
diff --git a/onyx b/onyx
index 5aad47df32e260995fada08dd0ac63d7f215c535..90f0812b9b7061f6d372896caefc770bb6f4d174 100755 (executable)
Binary files a/onyx and b/onyx differ
index 47784d99ffb734486bbefcd4b0285949d6257cfd..0ab71b5f6fd50e750c6d33e6b8802431e4f532cd 100644 (file)
@@ -17,19 +17,13 @@ asdf :: proc (pa: PrintableArray) {
     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);
 
index 10b93d0ed1e28f19252b15738b11776c30db5aa5..9c54464d3a8f06fe4efe26d74830c1cdc72b7c76 100644 (file)
@@ -1077,6 +1077,19 @@ static AstEnumType* parse_enum_declaration(OnyxParser* parser) {
 
     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);
@@ -1096,8 +1109,10 @@ static AstEnumType* parse_enum_declaration(OnyxParser* 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);
         }
 
index c7a04c41aff1039a330cf96246c4cb4e42c419d3..029a062b6980b385cdb2f473935a5016c34017cb 100644 (file)
@@ -421,7 +421,7 @@ static void symres_enum(AstEnumType* enum_node) {
     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);
 
@@ -446,7 +446,11 @@ static void symres_enum(AstEnumType* enum_node) {
             (*value)->value = num;
         }
 
-        next_assign_value++;
+        if (enum_node->flags & Ast_Flag_Enum_Is_Flags) {
+            next_assign_value <<= 1;
+        } else { 
+            next_assign_value++;
+        }
     }
 }