intern struct type the first time it is defined
at that point the fields might not yet have proper types
This commit is contained in:
parent
1bd6c43341
commit
13df06421c
|
@ -977,6 +977,17 @@ impl Ast {
|
||||||
loc: SourceLocation,
|
loc: SourceLocation,
|
||||||
) -> Index {
|
) -> Index {
|
||||||
let i = self.reserve_node();
|
let i = self.reserve_node();
|
||||||
|
self.set_struct_decl(i, name, flags, fields, loc)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_struct_decl<I: IntoIterator<Item = (intern::Index, Index)>>(
|
||||||
|
&mut self,
|
||||||
|
i: Index,
|
||||||
|
name: intern::Index,
|
||||||
|
flags: StructFlags,
|
||||||
|
fields: I,
|
||||||
|
loc: SourceLocation,
|
||||||
|
) -> Index {
|
||||||
let (offset, _) = self.extend_extra([flags.pack()]);
|
let (offset, _) = self.extend_extra([flags.pack()]);
|
||||||
let (names, types) = fields
|
let (names, types) = fields
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
@ -3885,12 +3896,22 @@ pub mod ast_gen {
|
||||||
loc: tokens.current_source_location(),
|
loc: tokens.current_source_location(),
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
let decl = self.ast.reserve_node();
|
||||||
let decl = self.parse_braced(tokens, |this, tokens| {
|
let decl = self.parse_braced(tokens, |this, tokens| {
|
||||||
this.parse_struct_fields(tokens).map(|fields| {
|
this.parse_struct_fields(tokens).map(|fields| {
|
||||||
_ = tokens.eat_token(Token::Comma);
|
_ = tokens.eat_token(Token::Comma);
|
||||||
let flags =
|
let flags =
|
||||||
StructFlags::new(packed, c_like, fields.len() as u32);
|
StructFlags::new(packed, c_like, fields.len() as u32);
|
||||||
this.ast.push_struct_decl(name, flags, fields, loc)
|
|
||||||
|
this.intern.insert_or_replace_struct_type(
|
||||||
|
name,
|
||||||
|
decl,
|
||||||
|
flags.packed,
|
||||||
|
flags.c_like,
|
||||||
|
vec![],
|
||||||
|
);
|
||||||
|
|
||||||
|
this.ast.set_struct_decl(decl, name, flags, fields, loc)
|
||||||
})
|
})
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue