mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-17 23:38:06 +08:00
Emit layout metadata from the intent IR
This commit is contained in:
@@ -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(®ular_fields, shape);
|
||||
|
||||
Reference in New Issue
Block a user