Removed resolved pointer from Ast_Typespec, it's accessed using a map now
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user