mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-02 03:18:12 +08:00
node-macro: modernize node macro
This commit is contained in:
@@ -13,7 +13,7 @@ mod validation;
|
|||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn node(attr: TokenStream, item: TokenStream) -> TokenStream {
|
pub fn node(attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||||
// Performs the `node_impl` macro's functionality of attaching an `impl Node for TheGivenStruct` block to the node struct
|
// Performs the `node_impl` macro's functionality of attaching an `impl Node for TheGivenStruct` block to the node struct
|
||||||
parsing::new_node_fn(attr.into(), item.into()).into()
|
parsing::new_node_fn(attr.into(), item.into()).unwrap_or_else(|err| err.to_compile_error()).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generate meta-information for an enum.
|
/// Generate meta-information for an enum.
|
||||||
@@ -27,5 +27,5 @@ pub fn node(attr: TokenStream, item: TokenStream) -> TokenStream {
|
|||||||
/// Doc comments on a variant become tooltip text.
|
/// Doc comments on a variant become tooltip text.
|
||||||
#[proc_macro_derive(ChoiceType, attributes(widget, menu_separator, label, icon))]
|
#[proc_macro_derive(ChoiceType, attributes(widget, menu_separator, label, icon))]
|
||||||
pub fn derive_choice_type(input_item: TokenStream) -> TokenStream {
|
pub fn derive_choice_type(input_item: TokenStream) -> TokenStream {
|
||||||
TokenStream::from(derive_choice_type::derive_choice_type_impl(input_item.into()).unwrap_or_else(|err| err.to_compile_error()))
|
derive_choice_type::derive_choice_type_impl(input_item.into()).unwrap_or_else(|err| err.to_compile_error()).into()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -642,24 +642,11 @@ fn extract_attribute<'a>(attrs: &'a [Attribute], name: &str) -> Option<&'a Attri
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Modify the new_node_fn function to use the code generation
|
// Modify the new_node_fn function to use the code generation
|
||||||
pub fn new_node_fn(attr: TokenStream2, item: TokenStream2) -> TokenStream2 {
|
pub fn new_node_fn(attr: TokenStream2, item: TokenStream2) -> syn::Result<TokenStream2> {
|
||||||
let parse_result = parse_node_fn(attr, item.clone());
|
let mut parsed_node = parse_node_fn(attr, item.clone()).map_err(|e| Error::new(e.span(), format!("Failed to parse node function: {e}")))?;
|
||||||
let Ok(mut parsed_node) = parse_result else {
|
|
||||||
let e = parse_result.unwrap_err();
|
|
||||||
return Error::new(e.span(), format!("Failed to parse node function: {e}")).to_compile_error();
|
|
||||||
};
|
|
||||||
|
|
||||||
parsed_node.replace_impl_trait_in_input();
|
parsed_node.replace_impl_trait_in_input();
|
||||||
if let Err(e) = crate::validation::validate_node_fn(&parsed_node) {
|
crate::validation::validate_node_fn(&parsed_node).map_err(|e| Error::new(e.span(), format!("Validation Error: {e}")))?;
|
||||||
return Error::new(e.span(), format!("Validation Error:\n{e}")).to_compile_error();
|
generate_node_code(&parsed_node).map_err(|e| Error::new(e.span(), format!("Failed to generate node code: {e}")))
|
||||||
}
|
|
||||||
match generate_node_code(&parsed_node) {
|
|
||||||
Ok(parsed) => parsed,
|
|
||||||
Err(e) => {
|
|
||||||
// Return the error as a compile error
|
|
||||||
Error::new(e.span(), format!("Failed to parse node function: {e}")).to_compile_error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ParsedNodeFn {
|
impl ParsedNodeFn {
|
||||||
|
|||||||
Reference in New Issue
Block a user