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,
|
||||
) -> Index {
|
||||
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 (names, types) = fields
|
||||
.into_iter()
|
||||
|
@ -3885,12 +3896,22 @@ pub mod ast_gen {
|
|||
loc: tokens.current_source_location(),
|
||||
})?;
|
||||
|
||||
let decl = self.ast.reserve_node();
|
||||
let decl = self.parse_braced(tokens, |this, tokens| {
|
||||
this.parse_struct_fields(tokens).map(|fields| {
|
||||
_ = tokens.eat_token(Token::Comma);
|
||||
let flags =
|
||||
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