Adding struts

This commit is contained in:
Krzosa Karol
2022-05-29 12:30:02 +02:00
parent 07b793aacc
commit ea1b74cda0
7 changed files with 112 additions and 44 deletions

View File

@@ -171,7 +171,7 @@ resolve_type_pair(Token *pos, Ast_Resolved_Type *a, Ast_Resolved_Type *b){
return result;
}
function Operand eval_decl(Ast *ast, Sym *sym = 0);
function Operand eval_binding(Ast *ast, Sym *sym = 0);
function void
eval_stmt(Ast *ast, Ast_Resolved_Type *ret){
switch(ast->kind){
@@ -185,14 +185,14 @@ eval_stmt(Ast *ast, Ast_Resolved_Type *ret){
}
Ast_Begin(AST_VAR, Ast_Var){
Operand op = eval_decl(node);
Operand op = eval_binding(node);
Sym *sym = sym_new_resolved(SYM_VAR, node->name, op.type, op.value, node);
sym_insert(sym);
Ast_End();
}
Ast_Begin(AST_CONST, Ast_Const){
Operand op = eval_decl(node);
Operand op = eval_binding(node);
Sym *sym = sym_new_resolved(SYM_CONST, node->name, op.type, op.value, node);
sym_insert(sym);
Ast_End();
@@ -484,6 +484,28 @@ eval_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *lambda_to_comple
Ast_End();
}
Ast_Begin(AST_STRUCT, Ast_Struct){
Scratch scratch;
Array<Ast_Resolved_Type_Field> members = {scratch};
For(node->members){
Operand op = eval_binding(it[0]);
Intern_String name = {};
if(is_flag_set(it[0]->flags, AST_BINDING)){
Ast_Named *named = (Ast_Named *)it[0];
name = named->name;
}
sym_new_resolved(SYM_VAR, name, op.type, {}, it[0]);
members.add({op.type, name});
}
Ast_Resolved_Type *resolved = type_struct(members);
Operand result = {type_type, true}; result.type_val = resolved;
return result;
Ast_End();
}
invalid_default_case;
}
@@ -491,7 +513,7 @@ eval_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *lambda_to_comple
}
function Operand
eval_decl(Ast *ast, Sym *sym){
eval_binding(Ast *ast, Sym *sym){
switch(ast->kind){
Ast_Begin(AST_VAR, Ast_Var){
@@ -538,7 +560,7 @@ resolve_sym(Sym *sym){
assert(sym->ast->kind == AST_VAR || sym->ast->kind == AST_CONST);
sym->state = SYM_RESOLVING;
Operand op = eval_decl(sym->ast, sym);
Operand op = eval_binding(sym->ast, sym);
sym->type = op.type;
if(sym->kind == SYM_CONST){
assert(op.is_const);