diff options
| author | Laurenz <laurmaedje@gmail.com> | 2023-03-11 17:42:40 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2023-03-11 18:29:48 +0100 |
| commit | 529d3e10c6b4d973e88b6c295eb22a45ea426e42 (patch) | |
| tree | 1815aa9336e71565e24d94bacccb98f09e91b693 /macros/src/node.rs | |
| parent | 8e5f446544fd147277ed2e4208c7ea793cc846a7 (diff) | |
Section references
Diffstat (limited to 'macros/src/node.rs')
| -rw-r--r-- | macros/src/node.rs | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/macros/src/node.rs b/macros/src/node.rs index f89ee8df..678a154d 100644 --- a/macros/src/node.rs +++ b/macros/src/node.rs @@ -25,6 +25,7 @@ struct Field { positional: bool, required: bool, variadic: bool, + synthesized: bool, fold: bool, resolve: bool, parse: Option<FieldParser>, @@ -88,6 +89,7 @@ fn prepare(stream: TokenStream, body: &syn::ItemStruct) -> Result<Node> { positional, required, variadic, + synthesized: has_attr(&mut attrs, "synthesized"), fold: has_attr(&mut attrs, "fold"), resolve: has_attr(&mut attrs, "resolve"), parse: parse_attr(&mut attrs, "parse")?.flatten(), @@ -154,7 +156,7 @@ fn prepare(stream: TokenStream, body: &syn::ItemStruct) -> Result<Node> { fn create(node: &Node) -> TokenStream { let Node { vis, ident, docs, .. } = node; let all = node.fields.iter().filter(|field| !field.external); - let settable = all.clone().filter(|field| field.settable()); + let settable = all.clone().filter(|field| !field.synthesized && field.settable()); // Inherent methods and functions. let new = create_new_func(node); @@ -176,7 +178,7 @@ fn create(node: &Node) -> TokenStream { #[doc = #docs] #[derive(Debug, Clone, Hash)] #[repr(transparent)] - #vis struct #ident(::typst::model::Content); + #vis struct #ident(pub ::typst::model::Content); impl #ident { #new @@ -205,7 +207,10 @@ fn create(node: &Node) -> TokenStream { /// Create the `new` function for the node. fn create_new_func(node: &Node) -> TokenStream { - let relevant = node.fields.iter().filter(|field| !field.external && field.inherent()); + let relevant = node + .fields + .iter() + .filter(|field| !field.external && !field.synthesized && field.inherent()); let params = relevant.clone().map(|Field { ident, ty, .. }| { quote! { #ident: #ty } }); @@ -224,11 +229,11 @@ fn create_new_func(node: &Node) -> TokenStream { /// Create an accessor methods for a field. fn create_field_method(field: &Field) -> TokenStream { let Field { vis, docs, ident, name, output, .. } = field; - if field.inherent() { + if field.inherent() || field.synthesized { quote! { #[doc = #docs] #vis fn #ident(&self) -> #output { - self.0.field(#name).unwrap().clone().cast().unwrap() + self.0.expect_field(#name) } } } else { @@ -311,7 +316,7 @@ fn create_node_impl(node: &Node) -> TokenStream { let infos = node .fields .iter() - .filter(|field| !field.internal) + .filter(|field| !field.internal && !field.synthesized) .map(create_param_info); quote! { impl ::typst::model::Node for #ident { @@ -395,7 +400,11 @@ fn create_construct_impl(node: &Node) -> TokenStream { let handlers = node .fields .iter() - .filter(|field| !field.external && (!field.internal || field.parse.is_some())) + .filter(|field| { + !field.external + && !field.synthesized + && (!field.internal || field.parse.is_some()) + }) .map(|field| { let with_ident = &field.with_ident; let (prefix, value) = create_field_parser(field); @@ -436,6 +445,7 @@ fn create_set_impl(node: &Node) -> TokenStream { .iter() .filter(|field| { !field.external + && !field.synthesized && field.settable() && (!field.internal || field.parse.is_some()) }) |
