mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-09-01 02:37:21 +00:00
Improve node macro and add more diagnostics (#1999)
* Improve node macro ergonomics * Fix type error in stub import * Fix wasm nodes * Code review --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
parent
3eb98c6d6d
commit
cd4124a596
15 changed files with 358 additions and 122 deletions
|
@ -140,7 +140,10 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
|||
|
||||
let all_implementation_types = fields.iter().flat_map(|field| match field {
|
||||
ParsedField::Regular { implementations, .. } => implementations.into_iter().cloned().collect::<Vec<_>>(),
|
||||
ParsedField::Node { implementations, .. } => implementations.into_iter().map(|tuple| syn::Type::Tuple(tuple.clone())).collect(),
|
||||
ParsedField::Node { implementations, .. } => implementations
|
||||
.into_iter()
|
||||
.flat_map(|implementation| [implementation.input.clone(), implementation.output.clone()])
|
||||
.collect(),
|
||||
});
|
||||
let all_implementation_types = all_implementation_types.chain(input.implementations.iter().cloned());
|
||||
|
||||
|
@ -200,6 +203,7 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
|||
let identifier = quote!(format!("{}::{}", #path, stringify!(#struct_name)));
|
||||
|
||||
let register_node_impl = generate_register_node_impl(parsed, &field_names, &struct_name, &identifier)?;
|
||||
let import_name = format_ident!("_IMPORT_STUB_{}", mod_name.to_string().to_case(Case::UpperSnake));
|
||||
|
||||
Ok(quote! {
|
||||
/// Underlying implementation for [#struct_name]
|
||||
|
@ -227,8 +231,8 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
|||
use gcore::ctor::ctor;
|
||||
|
||||
// Use the types specified in the implementation
|
||||
#[cfg(__never_compiled)]
|
||||
static _IMPORTS: core::marker::PhantomData<#(#all_implementation_types,)*> = core::marker::PhantomData;
|
||||
|
||||
static #import_name: core::marker::PhantomData<(#(#all_implementation_types,)*)> = core::marker::PhantomData;
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
pub struct #struct_name<#(#struct_generics,)*> {
|
||||
|
@ -286,19 +290,19 @@ fn generate_register_node_impl(parsed: &ParsedNodeFn, field_names: &[&Ident], st
|
|||
match field {
|
||||
ParsedField::Regular { implementations, ty, .. } => {
|
||||
if !implementations.is_empty() {
|
||||
implementations.into_iter().map(|ty| (&unit, ty, false)).collect()
|
||||
implementations.iter().map(|ty| (&unit, ty, false)).collect()
|
||||
} else {
|
||||
vec![(&unit, ty, false)]
|
||||
}
|
||||
}
|
||||
ParsedField::Node {
|
||||
implementations,
|
||||
output_type,
|
||||
input_type,
|
||||
output_type,
|
||||
..
|
||||
} => {
|
||||
if !implementations.is_empty() {
|
||||
implementations.into_iter().map(|tup| (&tup.elems[0], &tup.elems[1], true)).collect()
|
||||
implementations.iter().map(|impl_| (&impl_.input, &impl_.output, true)).collect()
|
||||
} else {
|
||||
vec![(input_type, output_type, true)]
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue