made "#type" optional in many cases
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 13 Nov 2021 15:18:14 +0000 (09:18 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 13 Nov 2021 15:18:14 +0000 (09:18 -0600)
examples/07_structs.onyx
include/astnodes.h
modules/immediate_mode/immediate_renderer.onyx
src/builtins.c
src/checker.c
src/parser.c
src/wasm_emit.c
tests/aoc-2020/day14.onyx
tests/aoc-2020/day20.onyx
tests/aoc-2020/day7.onyx
tests/new_printf.onyx

index 4cf1593defbc346808124f74ed7ab01d4c2caff8..ff2b59267b4176ce8d412ecc51cb3c534f61b2f7 100644 (file)
@@ -152,9 +152,10 @@ main :: (args: [] cstr) {
     // The first being of type T, and the second being an N dimensional array of type T.
 
     // To use a struct with parameters, simply pass them in the type.
-    param_struct_instance : ParamStruct(f32, 10);
-    param_struct_instance.t_member = 3.14159;
-    param_struct_instance.array_of_T = f32.[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ];
+    param_struct_instance := ParamStruct(f32, 10).{
+        t_member = 3.14159,
+        array_of_T = .[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ],
+    };
 
     println("param_struct_instance values:");
     println(param_struct_instance.t_member);
index a00ea249669b9aa43a008668c16e8e286c2371a2..f6c154bf0da82d85c76b58935ea4a60ebe183c3a 100644 (file)
@@ -780,8 +780,8 @@ struct AstSwitch {
     u32 flags;             \
     OnyxToken* token;      \
     struct Entity* entity; \
-    u64 type_id;           \
     void* __unused;        \
+    u64 type_id;           \
     Type* type
 struct AstType { AstType_base; };
 
index 13e873968a34b0bb04edc8f2f40e725ff39c93de..127e1e68ce62265d984ba2177bc48f4e66d0a0a7 100644 (file)
@@ -151,7 +151,7 @@ Immediate_Renderer :: struct {
             world_transform := array.get_ptr(world_transform_stack, -1);
             world_matrix := transform_to_matrix(world_transform);
 
-            for shader: (#type ^Shader).[ ^simple_shader, ^textured_shader, ^alpha_shader ] {
+            for shader: (^Shader).[ ^simple_shader, ^textured_shader, ^alpha_shader ] {
                 gl.useProgram(shader.program);
                 gl.uniformMatrix4(shader.world_uniform, false, world_matrix);
             }
index 8edafcdba122fa5efe082b808cf353ae7cc1cfe1..dbeff10908ef0c8e302a11014e46a46d5c50958c 100644 (file)
@@ -3,38 +3,38 @@
 #include "errors.h"
 #include "utils.h"
 
-AstBasicType basic_type_void      = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_Void]  };
-AstBasicType basic_type_bool      = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_Bool]  };
-AstBasicType basic_type_i8        = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I8]    };
-AstBasicType basic_type_u8        = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_U8]    };
-AstBasicType basic_type_i16       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I16]   };
-AstBasicType basic_type_u16       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_U16]   };
-AstBasicType basic_type_i32       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I32]   };
-AstBasicType basic_type_u32       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_U32]   };
-AstBasicType basic_type_i64       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I64]   };
-AstBasicType basic_type_u64       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_U64]   };
-AstBasicType basic_type_f32       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_F32]   };
-AstBasicType basic_type_f64       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_F64]   };
-AstBasicType basic_type_rawptr    = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_Rawptr] };
-AstBasicType basic_type_type_expr = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_Type_Index] };
+AstBasicType basic_type_void      = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_Void]  };
+AstBasicType basic_type_bool      = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_Bool]  };
+AstBasicType basic_type_i8        = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_I8]    };
+AstBasicType basic_type_u8        = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_U8]    };
+AstBasicType basic_type_i16       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_I16]   };
+AstBasicType basic_type_u16       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_U16]   };
+AstBasicType basic_type_i32       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_I32]   };
+AstBasicType basic_type_u32       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_U32]   };
+AstBasicType basic_type_i64       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_I64]   };
+AstBasicType basic_type_u64       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_U64]   };
+AstBasicType basic_type_f32       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_F32]   };
+AstBasicType basic_type_f64       = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_F64]   };
+AstBasicType basic_type_rawptr    = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_Rawptr] };
+AstBasicType basic_type_type_expr = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_Type_Index] };
 
 // NOTE: Types used for numeric literals
-AstBasicType basic_type_int_unsized   = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0,   NULL, NULL, &basic_types[Basic_Kind_Int_Unsized] };
-AstBasicType basic_type_float_unsized = { Ast_Kind_Basic_Type, 0, NULL, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_Float_Unsized] };
+AstBasicType basic_type_int_unsized   = { Ast_Kind_Basic_Type, 0, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_Int_Unsized] };
+AstBasicType basic_type_float_unsized = { Ast_Kind_Basic_Type, 0, NULL, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_Float_Unsized] };
 
 static OnyxToken simd_token = { Token_Type_Symbol, 0, "", { 0 } };
-AstBasicType basic_type_i8x16 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I8X16] };
-AstBasicType basic_type_i16x8 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I16X8] };
-AstBasicType basic_type_i32x4 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I32X4] };
-AstBasicType basic_type_i64x2 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_I64X2] };
-AstBasicType basic_type_f32x4 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_F32X4] };
-AstBasicType basic_type_f64x2 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, 0, NULL, NULL, &basic_types[Basic_Kind_F64X2] };
-AstBasicType basic_type_v128  = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, 0,  NULL, NULL, &basic_types[Basic_Kind_V128]  };
+AstBasicType basic_type_i8x16 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_I8X16] };
+AstBasicType basic_type_i16x8 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_I16X8] };
+AstBasicType basic_type_i32x4 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_I32X4] };
+AstBasicType basic_type_i64x2 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_I64X2] };
+AstBasicType basic_type_f32x4 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_F32X4] };
+AstBasicType basic_type_f64x2 = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_F64X2] };
+AstBasicType basic_type_v128  = { Ast_Kind_Basic_Type, Ast_Flag_Comptime, &simd_token, NULL, NULL, 0, NULL, &basic_types[Basic_Kind_V128]  };
 
 // HACK
 // :AutoReturnType
 Type         type_auto_return = { 0 };
-AstBasicType basic_type_auto_return = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, 0, NULL, NULL, &type_auto_return };
+AstBasicType basic_type_auto_return = { Ast_Kind_Basic_Type, 0, &simd_token, NULL, NULL, 0, NULL, &type_auto_return };
 
 OnyxToken builtin_package_token = { Token_Type_Symbol, 7, "builtin ", { 0 } };
 
index 79dffedf37a6d959c58b711432adfe7dad6492eb..093935479ac62db7b9d4da0dc7d20c3365413dff 100644 (file)
@@ -490,14 +490,15 @@ CheckStatus check_call(AstCall** pcall) {
             // HACK HACK HACK
             AstPolyCallType *pct = onyx_ast_node_new(context.ast_alloc, sizeof(AstPolyCallType), Ast_Kind_Poly_Call_Type);
             pct->token = call->token;
+            pct->__unused = call->next;
             pct->callee = (AstType *) callee;
             pct->params = (AstNode **) call->args.values;
             bh_arr_each(AstNode *, pp, pct->params) {
                 *pp = (AstNode *) (*(AstArgument **) pp)->value;
             }
 
-            CHECK(type, (AstType *) pct);
             *pcall = (AstCall *) pct;
+            CHECK(expression, (AstTyped **) pcall);
             return Check_Success;
         }
     }
@@ -1351,6 +1352,15 @@ CheckStatus check_address_of(AstAddressOf** paof) {
     }
 
     expr = (AstTyped *) strip_aliases((AstNode *) aof->expr);
+    if (node_is_type((AstNode *) expr)) {
+        AstPointerType *pt = onyx_ast_node_new(context.ast_alloc, sizeof(AstPointerType), Ast_Kind_Pointer_Type);
+        pt->token     = aof->token;
+        pt->elem      = (AstType *) expr;
+        pt->__unused  = aof->next;
+        *paof         = (AstAddressOf *) pt;
+        CHECK(type, (AstType *) pt);
+        return Check_Success;
+    }
 
     if ((expr->kind != Ast_Kind_Subscript
             && expr->kind != Ast_Kind_Dereference
@@ -1823,7 +1833,7 @@ CheckStatus check_statement(AstNode** pstmt) {
         case Ast_Kind_Defer:      return check_statement(&((AstDefer *) stmt)->stmt);
         case Ast_Kind_Call: {
             CHECK(call, (AstCall **) pstmt);
-            stmt->flags |= Ast_Flag_Expr_Ignored;
+            (*pstmt)->flags |= Ast_Flag_Expr_Ignored;
             return Check_Success;
         }
 
index f8f55a7c4778fb4a1cf1a981fa6822a90c6ee851..7c15a929d43a8517a6770447100b9d85cf571b03 100644 (file)
@@ -527,6 +527,12 @@ static AstTyped* parse_factor(OnyxParser* parser) {
             break;
         }
 
+        case '[': {
+            AstType *type = parse_type(parser);
+            retval = (AstTyped *) type;
+            break;
+        }
+
         case '#': {
             if (parse_possible_directive(parser, "file_contents")) {
                 AstFileContents* fc = make_node(AstFileContents, Ast_Kind_File_Contents);
index 659dca3ecc94a1bfefe0c1891b31f328a62592f5..477498b568d18e2560b35bc602a926109bf95dce 100644 (file)
@@ -2519,6 +2519,8 @@ EMIT_FUNC(expression, AstTyped* expr) {
 
     if (node_is_type((AstNode *) expr)) {
         AstType* type = (AstType *) expr;
+        if (type->flags & Ast_Flag_Expr_Ignored) return;
+
         if (type->type_id != 0) {
             WID(WI_I32_CONST, ((AstType *) expr)->type_id);
         } else {
@@ -2526,6 +2528,7 @@ EMIT_FUNC(expression, AstTyped* expr) {
             WID(WI_I32_CONST, t->id);
         }
 
+
         *pcode = code;
         return;
     }
index 97c8397c37ef214f41d66495444b95868a56e344..a5a333279f101578a1b21d95c8a2f317e7d94a73 100644 (file)
@@ -4,7 +4,7 @@ use package core
 reader :: package core.string.reader
 
 MASK_SIZE :: 36
-Bitmask :: #type [MASK_SIZE] u8;
+Bitmask :: [MASK_SIZE] u8;
 
 // Part 1
 bitmask_p1 :: (mask: Bitmask, val: u64) -> u64 {
index 917a28adfd6c1796dac17bac184062a8cbe1f42b..419a0f974dd97479270adafb695dca0510bdb507 100644 (file)
@@ -9,7 +9,7 @@ TILE_DATA_HEIGHT :: 10
 // Thought about making this dynamic and really fancy...
 // and then I remembered this is advent of code so that
 // is not necessary.
-TileData :: #type [TILE_DATA_WIDTH * TILE_DATA_HEIGHT] bool;
+TileData :: [TILE_DATA_WIDTH * TILE_DATA_HEIGHT] bool;
 
 Tile :: struct {
        id          : u32;
@@ -41,7 +41,7 @@ TO :: enum (u8) {
 }
 
 // TOT[t0][t1] = t1 * t0;    t1 after t0
-tile_orientation_table := (#type [8] TO).[
+tile_orientation_table := ([8] TO).[
     //                N         R90       R180      R270      F         FR90      FR180     FR270
     /* N     */ TO.[ TO.N,     TO.R90,   TO.R180,  TO.R270,  TO.F,     TO.FR90,  TO.FR180, TO.FR270 ],
     /* R90   */ TO.[ TO.R90,   TO.R180,  TO.R270,  TO.N,     TO.FR270, TO.F,     TO.FR90,  TO.FR180,],
@@ -96,7 +96,7 @@ build_edges :: (tile: [] bool, a := context.allocator) -> [] u32 {
 
 // These were not fun to think about by hand... But they make the
 // program ridiculously faster so I'm okay with it.
-side_relations := (#type [4] TO).[
+side_relations := ([4] TO).[
     TO.[ TO.F,     TO.N,     TO.R90,   TO.FR90,   ],
     TO.[ TO.N,     TO.F,     TO.FR90,  TO.R90,    ],
     TO.[ TO.R270,  TO.FR90,  TO.FR180, TO.N,      ],
@@ -246,7 +246,7 @@ main :: (args: [] cstr) {
        tiles := array.make(Tile);
        defer array.free(^tiles);
 
-    tile_map := map.make(u32, #type ^Tile, null);
+    tile_map := map.make(u32, ^Tile, null);
     defer map.free(^tile_map);
 
        tile_data := calloc(200 * sizeof TileData);
@@ -362,7 +362,7 @@ main :: (args: [] cstr) {
         }
     }
 
-    for ori: TO.[ TO.N, TO.R90, TO.R180, TO.R270, TO.F, TO.FR90, TO.FR180, TO.FR270 ] {
+    for ori: .[ TO.N, TO.R90, TO.R180, TO.R270, TO.F, TO.FR90, TO.FR180, TO.FR270 ] {
         if scan_for_monsters(cast(^u8) forest, ori, 12 * 8, 12 * 8) do break;
     }
     
index 2fb4ea3c9a81ca262c6e5eb86296f3b8955b5134..434e70fb81abb1062f96db87599286d217d0ed49 100644 (file)
@@ -115,7 +115,7 @@ main :: (args: [] cstr) {
     // printf("Count: {}\n", processed_bags.count - 1);
     
     // Part 2
-    to_process := array.make(#type ^BagNode);
+    to_process := array.make(^BagNode);
     multiplier := array.make(u32);
     array.push(^to_process, bg_get_node(^graph, "shiny gold"));
     array.push(^multiplier, 1);
index 9719371298696f15d3bba50e58463cba9d33442b..197308683a160fb373c3e5ff86a92adc415479ba 100644 (file)
@@ -3,5 +3,5 @@
 use package core
 
 main :: (args: [] cstr) {
-    printf("{} {} {{}} {} {.1} {.5} {}\n", 123, "Test", false, 12.34, 12.3456789, #type [..] map.Map(i32, str));
+    printf("{} {} {{}} {} {.1} {.5} {}\n", 123, "Test", false, 12.34, 12.3456789, [..] map.Map(i32, str));
 }