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:
Janis 2024-12-25 20:37:35 +01:00
parent 1bd6c43341
commit 13df06421c

View file

@ -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)
})
})?;