Adding struts
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user