stage1 解决@self无法在文件内直接使用的问题

This commit is contained in:
zzy committed 2026-09-17 16:30:38 +08:00
1 parent acfbbeee8b
commit 2594a81034
3 files changed
+81 -46

No files matched your search

+21 -15
View File
@@ -518,8 +518,11 @@ static spl_lang_type_id_t sema_import(spl_sema_t *sema, spl_ast_node_t *n,
spl_lang_type_id_t t = 0;
spl_ast_node_t *cm_after = spl_ast_node(mod_ast, cm_ref);
if (cm_after->resolved_def_id)
t = sema_eval_decl(sema, cm_after->resolved_def_id);
if (cm_after->resolved_def_id) {
spl_def_node_t *d = spl_def_node(sema->type, cm_after->resolved_def_id);
if (d)
t = d->lang_id;
}
sema->ast = saved_ast;
sema->scope->root_scope = saved_root;
@@ -766,12 +769,6 @@ static void sema_collect_signatures(spl_sema_t *sema) {
}
}
static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
sema_collect_names(sema, ref);
sema_collect_types(sema, ref);
sema_collect_signatures(sema);
}
static spl_lang_type_id_t sema_intrin_call(spl_sema_t *sema, spl_ast_node_t *n, spl_intrin_t in,
spl_ast_node_ref_vec_t *args) {
const spl_intrin_info_t *info = spl_intrin_info(in);
@@ -2609,10 +2606,23 @@ void spl_sema_run_module(spl_sema_t *sema, spl_ast_node_ref_t module_ref) {
spl_ast_node_t *mod = spl_ast_node(sema->ast, module_ref);
if (!mod || mod->kind != SPL_AST_CONTAINER_MEMBERS)
return;
spl_scope_id_t saved = sema->scope->current_scope;
sema_collect(sema, module_ref);
spl_scope_id_t saved_scope = sema->scope->current_scope;
spl_lang_type_id_t saved_agg = sema->current_aggregate_lang;
sema_collect_names(sema, module_ref);
spl_lang_type_id_t container_lang = 0;
if (mod->resolved_def_id)
container_lang = sema_eval_decl(sema, mod->resolved_def_id);
sema->current_aggregate_lang = container_lang;
sema_collect_types(sema, module_ref);
sema_collect_signatures(sema);
sema_infer(sema, module_ref);
sema->scope->current_scope = saved;
sema->current_aggregate_lang = saved_agg;
sema->scope->current_scope = saved_scope;
}
void spl_sema_run(spl_sema_t *sema) {
@@ -2622,10 +2632,6 @@ void spl_sema_run(spl_sema_t *sema) {
if (!root || root->kind != SPL_AST_ROOT)
return;
spl_sema_run_module(sema, root->root.members);
spl_ast_node_t *cm = spl_ast_node(sema->ast, root->root.members);
if (cm && cm->resolved_def_id)
sema_eval_decl(sema, cm->resolved_def_id);
}
void spl_sema_dump(spl_sema_t *sema) {