stage1 解决@self无法在文件内直接使用的问题
This commit is contained in:
1 parent
acfbbeee8b
commit
2594a81034
3 files changed
+81
-46
No files matched your search
@@ -633,8 +633,10 @@ spl_def_id_t spl_def_alloc(spl_lang_type_t *type, spl_def_node_kind_t kind, cons
|
||||
|
||||
void spl_def_resolve(spl_lang_type_t *type, spl_def_id_t id, spl_lang_type_id_t lang_id) {
|
||||
spl_def_node_t *d = spl_def_node(type, id);
|
||||
if (d)
|
||||
if (d) {
|
||||
d->lang_id = lang_id;
|
||||
d->state = SPL_DECL_RESOLVED;
|
||||
}
|
||||
}
|
||||
|
||||
spl_lang_type_id_t spl_def_get_lang_id(spl_lang_type_t *type, spl_def_id_t def_id) {
|
||||
|
||||
+21
-15
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user