Ast_Kind_Binding,
Ast_Kind_Function,
Ast_Kind_Overloaded_Function,
- Ast_Kind_Foreign,
Ast_Kind_Block,
Ast_Kind_Local_Group,
Ast_Kind_Local,
// Top level nodes
struct AstBinding { AstTyped_base; AstNode* node; };
-struct AstForeign { AstNode_base; OnyxToken *mod_token, *name_token; AstNode *import; };
struct AstIncludeFile { AstNode_base; OnyxToken *filename; };
struct AstUsePackage {
AstNode_base;
&& binop->operation <= Binary_Op_Assign_End);
}
+static inline b32 node_is_type(AstNode* node) {
+ return (node->kind > Ast_Kind_Type_Start) && (node->kind < Ast_Kind_Type_End);
+}
+
#endif // #ifndef ONYXASTNODES_H
use "progs/print_funcs"
-use package printing
+use package printing as p {
+ print_f32, PrintableArray
+}
Foo :: struct {
- x : i32;
- y : i32;
+ x : i32;
+ y : i32;
}
foo_sum :: proc (foo: ^Foo) -> i32 {
- return foo.x + foo.y;
+ return foo.x + foo.y;
+}
+
+asdf :: proc (pa: PrintableArray) {
+ for i: 0, pa.len p.print(pa.data[i] as i32);
}
proc #export "main" {
- foo := __heap_start as ^Foo;
- foo.x = 123;
- foo.y = 321;
- print(foo.foo_sum());
+ foo := __heap_start as ^Foo;
+ foo.x = 123;
+ foo.y = 321;
+ p.print(foo.foo_sum());
+ pa := (__heap_start as i32 + 8) as ^p.PrintableArray;
+ pa.data = __heap_start as ^u8;
+ pa.len = 5;
+ asdf(*pa);
- print(1234);
+ p.print(1234);
- print_f32(123.0f);
+ print_f32(123.0f);
}
\ No newline at end of file
print_i64 :: proc #foreign "host" "print" (value: i64) ---
print_f64 :: proc #foreign "host" "print" (value: f64) ---
+PrintableArray :: struct {
+ data: ^u8;
+ len: i32;
+}
+
print_i32arr :: proc (arr: [] i32, len: i32) {
for i: 0, len print(arr[i]);
}
else if (parser->curr->type == Token_Type_Symbol) {
AstNode* symbol_node = make_node(AstNode, Ast_Kind_Symbol);
symbol_node->token = expect_token(parser, Token_Type_Symbol);
- *next_insertion = (AstType *) symbol_node;
+
+ if (parser->curr->type == '.') {
+ consume_token(parser);
+ AstFieldAccess* field = make_node(AstFieldAccess, Ast_Kind_Field_Access);
+ field->token = expect_token(parser, Token_Type_Symbol);
+ field->expr = (AstTyped *) symbol_node;
+
+ *next_insertion = (AstType *) field;
+ } else {
+ *next_insertion = (AstType *) symbol_node;
+ }
+
next_insertion = NULL;
}
return (AstType *) symbol_resolve(semstate.curr_scope, ((AstNode *) type)->token);
}
+ if (type->kind == Ast_Kind_Field_Access) {
+ AstFieldAccess* field = (AstFieldAccess *) type;
+ symres_field_access(&field);
+
+ if (!node_is_type((AstNode *) field)) {
+ onyx_message_add(Msg_Type_Literal,
+ type->token->pos,
+ "field access did not result in a type");
+ }
+
+ return (AstType *) field;
+ }
+
// NOTE: Already resolved
if (type->kind == Ast_Kind_Basic_Type) return type;
}
static void symres_field_access(AstFieldAccess** fa) {
+ if ((*fa)->expr == NULL) return;
symres_expression(&(*fa)->expr);
if ((*fa)->expr == NULL) return;
*expr = (AstTyped *) symbol_resolve(semstate.curr_scope, ((AstNode *) *expr)->token);
break;
- // NOTE: This is a good case, since it means the symbol is already resolved
- case Ast_Kind_Local: break;
case Ast_Kind_Function:
case Ast_Kind_NumLit:
symres_expression(&((AstArrayAccess *)(*expr))->expr);
break;
- default:
- DEBUG_HERE;
- break;
+ // NOTE: This is a good case, since it means the symbol is already resolved
+ case Ast_Kind_Local:
+ default: break;
}
}
"BINDING",
"FUNCTION",
"OVERLOADED_FUNCTION",
- "FOREIGN",
"BLOCK",
"SCOPE",
"LOCAL",
scope->parent = parent;
scope->symbols = NULL;
- bh_table_init(global_heap_allocator, scope->symbols, 16);
+ bh_table_init(global_heap_allocator, scope->symbols, 64);
return scope;
}