stage2 提供sys包装 解决stage1的bug

This commit is contained in:
zzy committed 2026-09-17 17:25:55 +08:00
1 parent 5de4937637
commit 1a6df012cd
5 files changed
+178 -29

No files matched your search

+7 -18
View File
@@ -764,7 +764,10 @@ static void sema_collect_signatures(spl_sema_t *sema) {
usize n = vec_size(sema->type->def_table);
for (usize i = 1; i < n; ++i) {
spl_def_node_t *d = &vec_at(sema->type->def_table, i);
if (d->kind == SPL_DEF_FN && d->state == SPL_DECL_UNRESOLVED)
/* Nested imports share def_table, but each module has its own scope.
* Resolve other modules' signatures only when processing their AST. */
if (d->owner_ast == sema->ast && d->kind == SPL_DEF_FN &&
d->state == SPL_DECL_UNRESOLVED)
sema_eval_decl(sema, i);
}
}
@@ -1042,11 +1045,10 @@ static void sema_bind_pattern(spl_sema_t *sema, spl_ast_node_ref_t pat_ref,
}
}
/* type 解包:把容器 struct 的 methods 里的名字引入当前 scope。
/* type 解包:把 struct 的 methods 里的名字引入当前 scope。
语法层由 pattern 承载,语义层在这里分派。
约束:
- 源类型必须是 LANG_TYPE_STRUCT 且 agg_type.variants 为空
(即 @import 返回的容器 struct,不是普通带字段的 struct)
- 源类型必须是 LANG_TYPE_STRUCT;实例字段不会被导入
- PATTERN_DOT 不允许有 sub_pattern(编译期没有 payload 概念)
- PATTERN_FIELD 不允许带 sub pattern(同上)
- 不做递归导出,显式即所得 */
@@ -1166,19 +1168,6 @@ static void sema_do_type_unpack(spl_sema_t *sema, spl_ast_node_t *decl, spl_ast_
return;
}
spl_type_id_t src_ir = spl_lang_type_get_ir_type(sema->type, src_lang);
spl_type_node_t *irn = spl_type_node(&sema->type->ir, src_ir);
if (!irn) {
spl_diag_error(sema->diag, SPL_DIAG_KIND_TYPE_MISMATCH, &decl->dbg,
"type unpack source IR unresolved");
return;
}
if (vec_size(irn->agg_type.variants) != 0) {
spl_diag_error(sema->diag, SPL_DIAG_KIND_TYPE_MISMATCH, &decl->dbg,
"type unpack source has fields; only container struct allowed");
return;
}
sema_type_unpack_walk(sema, pat, src_lang);
}
@@ -1373,7 +1362,7 @@ static spl_lang_type_id_t sema_coerce(spl_sema_t *sema, spl_ast_node_ref_t ref,
case SPL_AST_EXPR_AGGREGATE_LIT: {
spl_lang_type_node_t *en = spl_lang_type_node(sema->type, expected);
if (!en || (en->kind != SPL_LANG_TYPE_STRUCT && en->kind != SPL_LANG_TYPE_UNION &&
en->kind != SPL_LANG_TYPE_ENUM))
en->kind != SPL_LANG_TYPE_ENUM && en->kind != SPL_LANG_TYPE_SLICE))
break;
if (n->aggregate_literal.name) {