Emit layout metadata from the intent IR

This commit is contained in:
Dennis Kobert
2026-08-13 16:11:58 +00:00
parent 40f99152ce
commit f195e363a5
3 changed files with 60 additions and 45 deletions

View File

@@ -1743,35 +1743,14 @@ pub(crate) fn generate_node_impl(crate_ident: &CrateIdent, parsed: &ParsedNodeFn
},
};
let layout_meta_fn = format_ident!("{}_layout_meta", fn_name);
let carrier_present = !shape.skips_carrier();
let element_spec = match &shape.element_write {
Some(ty) => quote!(#core_types::record::ElementSpec::Concrete(#core_types::record::element_write::<#ty>())),
None => quote!(#core_types::record::ElementSpec::Carried),
};
let sources = if carrier_present { quote!(::std::vec![0u8]) } else { quote!(::std::vec![]) };
let reads_meta: Vec<TokenStream2> = regular_fields
.iter()
.enumerate()
.filter(|(_, field)| !field.attribute_reads.is_empty())
.map(|(index, field)| {
let descs = field.attribute_reads.iter().map(|read| {
let marker = &read.marker;
quote!(#core_types::record::FieldWrite::of::<#marker>(0))
});
let index = index as u8;
quote!(#core_types::record::InputReads { input: #index, reads: ::std::vec![#(#descs),*] })
})
.collect();
let layout_meta = crate::codegen::ir::layout_meta_tokens(&crate::codegen::ir::build(parsed), element_spec, core_types);
let layout_meta_def = quote! {
#vis fn #layout_meta_fn() -> #core_types::record::LayoutMeta {
#core_types::record::LayoutMeta {
sources: #sources,
reads: ::std::vec![#(#reads_meta),*],
element: #element_spec,
writes: ::std::vec![#(#write_descs),*],
removes: ::std::vec![#(#remove_pairs),*],
level_delta: 0,
}
#layout_meta
}
};
let reading_secondaries = reading_secondary_indices(&regular_fields, shape);