stage1 实现部分ast2ir内容
This commit is contained in:
1 parent
f1d86b6e34
commit
3d57260f3f
6 files changed
+298
-148
No files matched your search
+21
-21
@@ -29,7 +29,7 @@ bool spl_scope_insert(spl_scope_t *scope, spl_scope_id_t id, spl_symbol_t symbol
|
||||
spl_symbol_t old = {0};
|
||||
spl_scope_node_t *node = &vec_at(scope->scopes, id);
|
||||
if (map_get(node->symbols, symbol.name, &old)) {
|
||||
// spl_type_def(sema->type, old); TODO debug node
|
||||
// spl_def_node(sema->type, old); TODO debug node
|
||||
SPL_ERROR(&(spl_dbg_node_t){0}, "find same symbol %s", symbol.name);
|
||||
return false;
|
||||
}
|
||||
@@ -61,7 +61,7 @@ static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
case SPL_AST_CONTAINER_MEMBERS: {
|
||||
symbol.name = "$file";
|
||||
symbol.kind = SPL_SYMBOL_KIND_TYPE;
|
||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_AGG, "$file", n->dbg, ref);
|
||||
symbol.node = spl_def_alloc(sema->type, SPL_DEF_AGG, "$file", n->dbg, ref);
|
||||
n->resolved_def_id = symbol.node;
|
||||
|
||||
spl_scope_id_t scope_id = spl_scope_alloc(sema->scope);
|
||||
@@ -86,7 +86,7 @@ static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
case SPL_AST_TYPE_UNION:
|
||||
case SPL_AST_TYPE_ENUM:
|
||||
case SPL_AST_TYPE_SHAPE: /* TODO for shape */
|
||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_AGG, symbol.name, te->dbg, ref);
|
||||
symbol.node = spl_def_alloc(sema->type, SPL_DEF_AGG, symbol.name, te->dbg, ref);
|
||||
n->resolved_def_id = symbol.node;
|
||||
spl_scope_id_t scope_id = spl_scope_alloc(sema->scope);
|
||||
spl_scope_id_t old_id = sema->scope->current_scope;
|
||||
@@ -99,7 +99,7 @@ static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
sema->scope->current_scope = old_id;
|
||||
break;
|
||||
default:
|
||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_SCALAR, symbol.name, te->dbg, ref);
|
||||
symbol.node = spl_def_alloc(sema->type, SPL_DEF_SCALAR, symbol.name, te->dbg, ref);
|
||||
n->resolved_def_id = symbol.node;
|
||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||
break;
|
||||
@@ -109,7 +109,7 @@ static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
case SPL_AST_FN_DEFINE: {
|
||||
symbol.name = n->fn_decl.name;
|
||||
symbol.kind = SPL_SYMBOL_KIND_FN;
|
||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_FN_PARAMS, symbol.name, n->dbg, ref);
|
||||
symbol.node = spl_def_alloc(sema->type, SPL_DEF_FN, symbol.name, n->dbg, ref);
|
||||
n->resolved_def_id = symbol.node;
|
||||
// TODO same type avaliable insert twice for decl and define but define must only once
|
||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||
@@ -118,7 +118,7 @@ static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
case SPL_AST_CONST_DECL: {
|
||||
symbol.name = n->var_const_decl.name;
|
||||
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
||||
symbol.node = spl_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
||||
n->resolved_def_id = symbol.node;
|
||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||
} break;
|
||||
@@ -304,7 +304,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
spl_type_id_t fntid = spl_type_builder_fn(
|
||||
sema->type, ret_id, vec_unsafe_get_data(params_type), vec_size(params_type));
|
||||
// Move params_type don't need free
|
||||
spl_type_def_resolve(sema->type, n->resolved_def_id, fntid);
|
||||
spl_def_resolve(sema->type, n->resolved_def_id, fntid);
|
||||
break;
|
||||
}
|
||||
case SPL_AST_FN_DEFINE: {
|
||||
@@ -329,7 +329,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
vec_push(params_type, tid);
|
||||
|
||||
if (node->resolved_def_id) {
|
||||
spl_type_def_resolve(sema->type, node->resolved_def_id, tid);
|
||||
spl_def_resolve(sema->type, node->resolved_def_id, tid);
|
||||
}
|
||||
}
|
||||
spl_type_id_t ret_id = sema_parse(sema, n->fn_decl.type_expr);
|
||||
@@ -337,7 +337,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
spl_type_id_t fntid = spl_type_builder_fn(
|
||||
sema->type, ret_id, vec_unsafe_get_data(params_type), vec_size(params_type));
|
||||
// Move params_type don't need free
|
||||
spl_type_def_resolve(sema->type, n->resolved_def_id, fntid);
|
||||
spl_def_resolve(sema->type, n->resolved_def_id, fntid);
|
||||
|
||||
spl_type_id_t old_ret = sema->current_fn_ret_tid;
|
||||
sema->current_fn_ret_tid = ret_id;
|
||||
@@ -384,7 +384,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
spl_type_builder_int(sema->type, 32, 1), layout);
|
||||
// Move members don't need free
|
||||
|
||||
spl_type_def_resolve(sema->type, n->resolved_def_id, tid);
|
||||
spl_def_resolve(sema->type, n->resolved_def_id, tid);
|
||||
/* 第二遍:方法 body(struct 类型已 resolve,可引用自身类型) */
|
||||
vec_for(te->type_expr.aggregate_list, i) {
|
||||
spl_ast_node_ref_t mref = vec_at(te->type_expr.aggregate_list, i);
|
||||
@@ -401,7 +401,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
break;
|
||||
default: {
|
||||
spl_type_id_t tid = sema_parse(sema, n->type_decl.type_expr);
|
||||
spl_type_def_resolve(sema->type, n->resolved_def_id, tid);
|
||||
spl_def_resolve(sema->type, n->resolved_def_id, tid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -412,7 +412,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
spl_symbol_t symbol = {0};
|
||||
symbol.name = n->var_const_decl.name;
|
||||
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
||||
symbol.node = spl_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
||||
n->resolved_def_id = symbol.node;
|
||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||
}
|
||||
@@ -431,7 +431,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
SPL_ERROR(&n->dbg, "decl type must not none %d");
|
||||
sema->error_count += 1;
|
||||
}
|
||||
spl_type_def_resolve(sema->type, n->resolved_def_id, decl_tid);
|
||||
spl_def_resolve(sema->type, n->resolved_def_id, decl_tid);
|
||||
} break;
|
||||
case SPL_AST_MEMBER_DECL: {
|
||||
/* 字段/变体不建 def, 类型由 TYPE_DECL 组装成员时统一构造 */
|
||||
@@ -449,7 +449,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
spl_symbol_t symbol = {0};
|
||||
symbol.name = n->param_decl.name;
|
||||
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
||||
symbol.node = spl_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
||||
n->resolved_def_id = symbol.node;
|
||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||
}
|
||||
@@ -457,7 +457,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
if (n->param_decl.type_expr) {
|
||||
ptid = sema_parse(sema, n->param_decl.type_expr);
|
||||
}
|
||||
spl_type_def_resolve(sema->type, n->resolved_def_id, ptid);
|
||||
spl_def_resolve(sema->type, n->resolved_def_id, ptid);
|
||||
return ptid;
|
||||
} break;
|
||||
case SPL_AST_ATTR_ITEM:
|
||||
@@ -526,8 +526,8 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
spl_symbol_t symbol = {0};
|
||||
symbol.name = vname;
|
||||
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_VAR, vname, n->dbg, eref);
|
||||
spl_type_def_resolve(sema->type, symbol.node, etid);
|
||||
symbol.node = spl_def_alloc(sema->type, SPL_DEF_VAR, vname, n->dbg, eref);
|
||||
spl_def_resolve(sema->type, symbol.node, etid);
|
||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||
}
|
||||
}
|
||||
@@ -894,7 +894,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
}
|
||||
Assert(symbol.node != 0);
|
||||
n->resolved_def_id = symbol.node;
|
||||
spl_def_node_t *d = spl_type_def(sema->type, symbol.node);
|
||||
spl_def_node_t *d = spl_def_node(sema->type, symbol.node);
|
||||
Assert(d != 0);
|
||||
return d->type_id;
|
||||
}
|
||||
@@ -911,7 +911,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
sema->error_count++;
|
||||
break;
|
||||
}
|
||||
spl_def_node_t *d = spl_type_def(sema->type, sym.node);
|
||||
spl_def_node_t *d = spl_def_node(sema->type, sym.node);
|
||||
spl_type_id_t tid = d ? d->type_id : 0;
|
||||
spl_type_node_t *tn = spl_type_node(sema->type, tid);
|
||||
if (!tn || (tn->kind != SPL_TYPE_STRUCT && tn->kind != SPL_TYPE_UNION)) {
|
||||
@@ -987,7 +987,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
||||
if (vec_size(n->type_expr.type_path.ident_vec) == 1) {
|
||||
spl_symbol_t sym = {0};
|
||||
if (spl_scope_find(sema->scope, tname, &sym)) {
|
||||
spl_def_node_t *d = spl_type_def(sema->type, sym.node);
|
||||
spl_def_node_t *d = spl_def_node(sema->type, sym.node);
|
||||
if (d && d->type_id) {
|
||||
n->resolved_type_id = d->type_id;
|
||||
return d->type_id;
|
||||
@@ -1136,7 +1136,7 @@ void spl_sema_dump(spl_sema_t *sema) {
|
||||
vec_for(sema->type->def_table, i) {
|
||||
printf(" def#%zu ", i);
|
||||
spl_type_def_dump(sema->type, i);
|
||||
spl_def_node_t *d = spl_type_def(sema->type, i);
|
||||
spl_def_node_t *d = spl_def_node(sema->type, i);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user