Removed resolved pointer from Ast_Typespec, it's accessed using a map now

This commit is contained in:
Krzosa Karol
2022-05-27 12:05:23 +02:00
parent 01acad47ec
commit f66fd447e5
7 changed files with 70 additions and 921 deletions

View File

@@ -3,6 +3,7 @@
enum Sym_Kind{
SYM_NONE,
SYM_TYPESPEC,
SYM_TYPE,
SYM_CONST,
SYM_VAR,
@@ -103,6 +104,14 @@ resolved_get(Ast *ast){
return result;
}
function Ast_Resolved_Type *
resolved_typespec_get(Ast_Typespec *ast){
Sym *result = resolved_get(ast);
assert(result->kind == SYM_TYPESPEC);
assert(result->type);
return result->type;
}
function void
sym_insert_builtin_type(String name, Ast_Resolved_Type *type){
Intern_String string = intern_string(&pctx->interns, name);
@@ -152,8 +161,8 @@ eval_typespec(Ast_Typespec *ast){
parsing_error(node->pos, "This identifier is not a type");
}
node->resolved_type = type_sym->type;
return node->resolved_type;
sym_new_resolved(SYM_TYPESPEC, {}, type_sym->type, node);
return type_sym->type;
Ast_End();
}
@@ -162,15 +171,19 @@ eval_typespec(Ast_Typespec *ast){
Ast_Resolved_Type *ret = eval_typespec(node->lambda->ret);
Array<Ast_Resolved_Type *> args = {scratch};
For(node->lambda->args) args.add(eval_typespec(it[0]->typespec));
node->resolved_type = type_lambda(ret, args);
return node->resolved_type;
Ast_Resolved_Type *resolved_type = type_lambda(ret, args);
sym_new_resolved(SYM_TYPESPEC, {}, resolved_type, node);
return resolved_type;
Ast_End();
}
Ast_Begin(AST_TYPESPEC_POINTER, Ast_Typespec){
Ast_Resolved_Type *type = eval_typespec(node->base);
node->resolved_type = type_pointer(type);
return node->resolved_type;
Ast_Resolved_Type *resolved_type = type_pointer(type);
sym_new_resolved(SYM_TYPESPEC, {}, resolved_type, node);
return resolved_type;
Ast_End();
}
@@ -179,8 +192,10 @@ eval_typespec(Ast_Typespec *ast){
Operand expr = eval_expr(node->arr.expr);
if(!expr.is_const) parsing_error(node->pos, "Array size is not a constant");
if(expr.type != type_int) parsing_error(node->pos, "Array size is expected to be of type [Int] is instead of type %s", type_names[expr.type->kind]);
node->resolved_type = type_array(type, expr.int_val);
return node->resolved_type;
Ast_Resolved_Type *resolved_type = type_array(type, expr.int_val);
sym_new_resolved(SYM_TYPESPEC, {}, resolved_type, node);
return resolved_type;
Ast_End();
}
invalid_default_case;
@@ -336,8 +351,11 @@ eval_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *lambda_to_comple
Sym *arg_sym = sym_new_resolved(SYM_VAR, it[0]->name, type, it[0]);
sym_insert(arg_sym);
}
Sym *resolved_ret = resolved_get(node->ret);
assert(resolved_ret->kind == SYM_TYPESPEC);
For(node->block->stmts){
eval_stmt(it[0], node->ret->resolved_type);
eval_stmt(it[0], resolved_ret->type);
}
scope_close(scope_index);
}