stage2 修复语义问题
This commit is contained in:
1 parent
76f980654c
commit
fc2d8f8db4
2 files changed
+74
-28
No files matched your search
+38
-12
@@ -367,6 +367,10 @@ fn build_aggregate(self: *Sema, te: *Node, owner_def_id: usize): usize {
|
||||
|
||||
var saved = self.current_aggregate_lang;
|
||||
self.current_aggregate_lang = agg_lang;
|
||||
// 聚合体自成命名空间:成员类型可引用同体声明的嵌套类型(裸名)。
|
||||
var saved_scope = self.scope.current_scope;
|
||||
var agg_scope = Scope.alloc(&self.scope);
|
||||
self.scope.current_scope = agg_scope;
|
||||
|
||||
var members = Vec.blank(@sizeof(Member), @alignof(Member));
|
||||
var methods = Vec.blank(@sizeof(LangMethod), @alignof(LangMethod));
|
||||
@@ -376,19 +380,15 @@ fn build_aggregate(self: *Sema, te: *Node, owner_def_id: usize): usize {
|
||||
.TypeAggregate(&x) => { mlist = x.members; },
|
||||
_ => {},
|
||||
}
|
||||
|
||||
// 第一遍:登记嵌套类型/函数的 def,挂进 methods 与聚合作用域。成员类型可能引用它们,
|
||||
// 必须早于成员类型推断,否则限定名(经 methods)与裸名(经作用域)都解析不到。
|
||||
var i: usize = 0;
|
||||
while i < mlist.len {
|
||||
var mref = list_at(mlist, i);
|
||||
var mn = node(self, mref);
|
||||
if mn != null {
|
||||
match mn.body {
|
||||
.MemberDecl(md) => {
|
||||
var mtid: usize = 0;
|
||||
if md.type_expr != 0 { mtid = infer(self, md.type_expr); }
|
||||
var mm = Member { .name = md.name, .type_id = ir_of(self, mtid),
|
||||
.ast_node_ref = mref };
|
||||
Vec.push(&members, &mm as *u8);
|
||||
},
|
||||
.FnDecl(fd) => {
|
||||
var fn_def = mn.resolved_def_id;
|
||||
if fn_def == 0 {
|
||||
@@ -400,6 +400,8 @@ fn build_aggregate(self: *Sema, te: *Node, owner_def_id: usize): usize {
|
||||
if fn_d != null { fn_d.owner_def = owner_def_id; }
|
||||
var meth = LangMethod { .name = fd.name, .def_id = fn_def };
|
||||
Vec.push(&methods, &meth as *u8);
|
||||
Scope.insert(&self.scope, agg_scope,
|
||||
Symbol { .name = fd.name, .kind = .Fn, .node = fn_def });
|
||||
},
|
||||
.TypeDecl(td) => {
|
||||
var tpat = node(self, td.pattern);
|
||||
@@ -416,6 +418,8 @@ fn build_aggregate(self: *Sema, te: *Node, owner_def_id: usize): usize {
|
||||
}
|
||||
var meth = LangMethod { .name = tname, .def_id = tdef };
|
||||
Vec.push(&methods, &meth as *u8);
|
||||
Scope.insert(&self.scope, agg_scope,
|
||||
Symbol { .name = tname, .kind = .Type, .node = tdef });
|
||||
}
|
||||
},
|
||||
_ => {},
|
||||
@@ -424,6 +428,33 @@ fn build_aggregate(self: *Sema, te: *Node, owner_def_id: usize): usize {
|
||||
i = i + 1;
|
||||
}
|
||||
|
||||
var lslot = LangType.lang_node(&self.types, agg_lang);
|
||||
if lslot != null {
|
||||
Vec.drop(&lslot.methods);
|
||||
lslot.methods = methods;
|
||||
}
|
||||
|
||||
// 第二遍:成员(字段/变体)类型推断;此时嵌套名字已可解析。
|
||||
i = 0;
|
||||
while i < mlist.len {
|
||||
var mref = list_at(mlist, i);
|
||||
var mn = node(self, mref);
|
||||
if mn != null {
|
||||
match mn.body {
|
||||
.MemberDecl(md) => {
|
||||
var mtid: usize = 0;
|
||||
if md.type_expr != 0 { mtid = infer(self, md.type_expr); }
|
||||
var mm = Member { .name = md.name, .type_id = ir_of(self, mtid),
|
||||
.ast_node_ref = mref };
|
||||
Vec.push(&members, &mm as *u8);
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
}
|
||||
i = i + 1;
|
||||
}
|
||||
|
||||
self.scope.current_scope = saved_scope;
|
||||
self.current_aggregate_lang = saved;
|
||||
|
||||
// IR 节点
|
||||
@@ -445,11 +476,6 @@ fn build_aggregate(self: *Sema, te: *Node, owner_def_id: usize): usize {
|
||||
}
|
||||
TypeTable.define(&self.types.ir, agg_ir, &tk);
|
||||
|
||||
var lslot = LangType.lang_node(&self.types, agg_lang);
|
||||
if lslot != null {
|
||||
Vec.drop(&lslot.methods);
|
||||
lslot.methods = methods;
|
||||
}
|
||||
ret agg_lang;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user