changed tag syntax for structs
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 7 Oct 2021 18:51:17 +0000 (13:51 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 7 Oct 2021 18:51:17 +0000 (13:51 -0500)
bin/onyx
modules/immediate_mode/immediate_renderer.onyx
src/checker.c
src/parser.c

index 1012a7e8080be388fcb676b0a9964556564997dd..3393d4489214549d25fd391ea8a33cd752186816 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index 03718ce380182acd58eaa2d9e5a41f9f2759983d..6e063f74f15449fceed38c1f648be1ba9f5d447e 100644 (file)
@@ -446,8 +446,14 @@ immediate_renderer_free :: () {
 }
 
 vertex :: #match {
-    (position: Vector2)                { global_renderer->push_vertex(position); },
-    (position: Vector2, color: Color4) { global_renderer->push_vertex(position, color); },
+    macro (position: Vector2) {
+        gr :: global_renderer
+        gr->push_vertex(position);
+    },
+    macro (position: Vector2, color: Color4) {
+        gr :: global_renderer
+        gr->push_vertex(position, color);
+    },
 }
 
 rect :: (position: Vector2, size: Vector2, color: Color4 = .{1,1,1}) {
index 215a1c51439f01c8b53af61e68f3c5bc0733bdb8..551dc161480d72f305957f2333d26cffabdad7c2 100644 (file)
@@ -2216,6 +2216,7 @@ CheckStatus check_process_directive(AstNode* directive) {
                 AstFieldAccess* fa = (AstFieldAccess *) tag->expr;
 
                 if (fa->expr->kind == Ast_Kind_Struct_Type) {
+                    // CLEANUP: Everything in this case is handled very poorly.
                     AstStructType* st = (AstStructType *) fa->expr;
                     Type* s_type = type_build_from_ast(context.ast_alloc, (AstType *) st);
 
index 0f776f3d0b3f1ab50cd6320a046c0beef9547966..ec243dc56c29d547aba2b4885952244e800ac1b1 100644 (file)
@@ -1877,7 +1877,6 @@ static AstStructType* parse_struct(OnyxParser* parser) {
 
     bh_arr_new(global_heap_allocator, s_node->members, 4);
     
-    bh_arr(AstTyped *) struct_meta_tags=NULL;
     while (parser->curr->type == '#') {
         if (parser->hit_unexpected_token) return NULL;
 
@@ -1899,17 +1898,6 @@ static AstStructType* parse_struct(OnyxParser* parser) {
             s_node->min_size = numlit->value.i;
         }
 
-        else if (parse_possible_directive(parser, "tag")) {
-            expect_token(parser, '(');
-
-            AstTyped* expr = parse_expression(parser, 0);
-
-            if (struct_meta_tags == NULL) bh_arr_new(global_heap_allocator, struct_meta_tags, 1);
-            bh_arr_push(struct_meta_tags, expr);
-
-            expect_token(parser, ')');
-        }
-
         else {
             OnyxToken* directive_token = expect_token(parser, '#');
             OnyxToken* symbol_token = expect_token(parser, Token_Type_Symbol);
@@ -1918,6 +1906,24 @@ static AstStructType* parse_struct(OnyxParser* parser) {
         }
     }
 
+    bh_arr(AstTyped *) struct_meta_tags=NULL;
+    if (parser->curr->type == '[') {
+        expect_token(parser, '[');
+        if (struct_meta_tags == NULL) bh_arr_new(global_heap_allocator, struct_meta_tags, 1);
+
+        while (parser->curr->type != ']') {
+            if (parser->hit_unexpected_token) return s_node;
+
+            AstTyped* expr = parse_expression(parser, 0);
+            bh_arr_push(struct_meta_tags, expr);
+
+            if (parser->curr->type != ']')
+                expect_token(parser, ',');
+        }
+
+        expect_token(parser, ']');
+    }
+
     s_node->meta_tags = struct_meta_tags;
 
     expect_token(parser, '{');
@@ -1948,12 +1954,17 @@ static AstStructType* parse_struct(OnyxParser* parser) {
         } else {
             bh_arr(AstTyped *) meta_tags=NULL;
             while (parser->curr->type == '[') {
-                expect_token(parser, '[');
+                if (meta_tags == NULL) bh_arr_new(global_heap_allocator, meta_tags, 1);
 
-                AstTyped* expr = parse_expression(parser, 0);
+                expect_token(parser, '[');
+                while (parser->curr->type != ']') {
+                    AstTyped* expr = parse_expression(parser, 0);
+                    bh_arr_push(meta_tags, expr);
 
-                if (meta_tags == NULL) bh_arr_new(global_heap_allocator, meta_tags, 1);
-                bh_arr_push(meta_tags, expr);
+                    if (parser->curr->type != ']') {
+                        expect_token(parser, ',');
+                    }
+                }
 
                 expect_token(parser, ']');
             }