typedef struct AstStructMember AstStructMember;
typedef struct AstEnumType AstEnumType;
typedef struct AstEnumValue AstEnumValue;
+typedef struct AstTypeAlias AstTypeAlias;
typedef struct AstBinding AstBinding;
typedef struct AstMemRes AstMemRes;
Ast_Kind_Array_Type,
Ast_Kind_Struct_Type,
Ast_Kind_Enum_Type,
+ Ast_Kind_Type_Alias,
Ast_Kind_Type_End,
Ast_Kind_Struct_Member,
Type *etcache;
};
struct AstEnumValue { AstTyped_base; AstNumLit* value; };
+struct AstTypeAlias { AstType_base; AstType* to; };
// Top level nodes
struct AstBinding { AstTyped_base; AstNode* node; };
Entity_Type_Use_Package,
Entity_Type_String_Literal,
Entity_Type_Enum,
- Entity_Type_Struct,
+ Entity_Type_Type_Alias,
Entity_Type_Memory_Reservation,
Entity_Type_Function_Header,
Entity_Type_Global_Header,
AstGlobal *global;
AstTyped *expr;
AstStrLit *strlit;
- AstStructType *struct_type;
+ AstType *type_alias;
AstEnumType *enum_type;
AstMemRes *mem_res;
};
use package printing
call_me :: proc (f: proc (i32) -> i32, val: i32) {
- f(val);
+ f(val);
}
funcs : [5] proc (i32, i32) -> i32
div :: proc (a: i32, b: i32) -> i32 { return a / b; }
mod :: proc (a: i32, b: i32) -> i32 { return a % b; }
+deferred_proc :: #type proc (i32, i32) -> i32
+my_int :: #type i32;
+
DeferredCall :: struct {
- func : proc (i32, i32) -> i32;
+ func : deferred_proc;
left : i32;
right : i32;
}
double :: proc (n: i32) -> i32 { return n << 1; }
proc #export "main" {
- call_me(echo, 10);
+ call_me(echo, 10);
- print(add as i32);
+ print(add as my_int);
funcs[0] = add;
funcs[1] = sub;
for i: 0, 5 print(funcs[i](10, 3));
dc := __heap_start as ^DeferredCall;
- dc.func = mod;
+ dc.func = add;
dc.left = 40;
dc.right = 19;
array_map(len, data, add_one);
print(data as [] i32, len);
+
+ cheese := Cheeses.Cheddar;
+
+ // Closest thing to a switch statement at the moment
+ {
+ if cheese == Cheeses.Cheddar {
+ print(1);
+ break;
+ }
+
+ print(2);
+
+ if cheese == Cheeses.Muenster {
+ print(10);
+ break;
+ }
+
+ print(2);
+
+ if cheese == Cheeses.Mozerella {
+ print(100);
+ break;
+ }
+ }
+
}
+
+Cheeses :: enum {
+ Cheddar;
+ Muenster;
+ Mozerella;
+}
\ No newline at end of file
break;
}
+ case Ast_Kind_Type_Alias:
case Ast_Kind_Struct_Type: {
- ent.type = Entity_Type_Struct;
- ent.struct_type = (AstStructType *) node;
+ ent.type = Entity_Type_Type_Alias;
+ ent.type_alias = (AstType *) node;
bh_arr_push(compiler_state->prog_info.entities, ent);
break;
}
if (check_expression(&entity->expr)) return;
break;
- case Entity_Type_Struct:
- if (check_struct(entity->struct_type)) return;
+ case Entity_Type_Type_Alias:
+ if (entity->type_alias->kind == Ast_Kind_Struct_Type)
+ if (check_struct((AstStructType *) entity->type_alias)) return;
break;
case Entity_Type_Enum: break;
else if (parser->curr->type == Token_Type_Keyword_Struct) {
return (AstTyped *) parse_struct(parser);
}
+ else if (parse_possible_directive(parser, "type")) {
+ AstTypeAlias* alias = make_node(AstTypeAlias, Ast_Kind_Type_Alias);
+ alias->to = parse_type(parser);
+ return (AstTyped *) alias;
+ }
else if (parser->curr->type == Token_Type_Keyword_Enum) {
return (AstTyped *) parse_enum_declaration(parser);
}
static AstType* symres_type(AstType* type) {
if (type == NULL) return NULL;
+ if (type->kind == Ast_Kind_Type_Alias) {
+ ((AstTypeAlias *) type)->to = symres_type(((AstTypeAlias *) type)->to);
+ return type;
+ }
+
if (type->kind == Ast_Kind_Symbol) {
return (AstType *) symbol_resolve(semstate.curr_scope, ((AstNode *) type)->token);
}
case Entity_Type_Overloaded_Function: symres_overloaded_function(entity->overloaded_function); break;
case Entity_Type_Global: symres_global(entity->global); break;
case Entity_Type_Expression: symres_expression(&entity->expr); break;
- case Entity_Type_Struct: symres_type((AstType *) entity->struct_type); break;
+ case Entity_Type_Type_Alias: entity->type_alias = symres_type(entity->type_alias); break;
case Entity_Type_Enum: symres_enum(entity->enum_type); break;
case Entity_Type_Memory_Reservation: symres_memres(&entity->mem_res); break;
case Ast_Kind_Basic_Type:
return ((AstBasicType *) type_node)->type;
+ case Ast_Kind_Type_Alias:
+ return type_build_from_ast(alloc, ((AstTypeAlias *) type_node)->to);
+
case Ast_Kind_Symbol:
assert(("symbol node in type expression", 0));
return NULL;
"FUNCTION_TYPE",
"ARRAY TYPE",
"STRUCT TYPE",
- "ENUM TYPE"
+ "ENUM TYPE",
+ "TYPE_ALIAS",
"TYPE_END (BAD)",
"STRUCT MEMBER",