diff options
| author | Laurenz <laurmaedje@gmail.com> | 2024-01-30 10:43:08 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-30 09:43:08 +0000 |
| commit | f14288cacf7331a422cb447d60d529797def3950 (patch) | |
| tree | 6776d31396e2f848b9053bb8420f96ac7e66ba4b /crates/typst-macros | |
| parent | a3e1c70e9e20b0438c233223eeead4f06a371c2c (diff) | |
Refactor folding (#3294)
Diffstat (limited to 'crates/typst-macros')
| -rw-r--r-- | crates/typst-macros/src/elem.rs | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/crates/typst-macros/src/elem.rs b/crates/typst-macros/src/elem.rs index 722131b7..91147b8d 100644 --- a/crates/typst-macros/src/elem.rs +++ b/crates/typst-macros/src/elem.rs @@ -106,7 +106,9 @@ impl Elem { /// This includes: /// - Fields that are not synthesized. fn construct_fields(&self) -> impl Iterator<Item = &Field> + Clone { - self.real_fields().filter(|field| !field.synthesized) + self.real_fields().filter(|field| { + !field.synthesized && (!field.internal || field.parse.is_some()) + }) } } @@ -263,11 +265,6 @@ fn parse_field(field: &syn::Field) -> Result<Field> { field.output = parse_quote! { <#output as #foundations::Resolve>::Output }; } - if field.fold { - let output = &field.output; - field.output = parse_quote! { <#output as #foundations::Fold>::Output }; - } - validate_attrs(&attrs)?; Ok(field) @@ -555,32 +552,42 @@ fn create_style_chain_access( let elem = &element.ident; let Field { ty, default, enum_ident, .. } = field; - let getter = match (field.fold, field.resolve, field.borrowed) { - (false, false, false) => quote! { get }, - (false, false, true) => quote! { get_borrowed }, - (false, true, _) => quote! { get_resolve }, - (true, false, _) => quote! { get_fold }, - (true, true, _) => quote! { get_resolve_fold }, + + let getter = match (field.fold, field.borrowed) { + (false, false) => quote! { get }, + (false, true) => quote! { get_ref }, + (true, _) => quote! { get_folded }, }; - let default = default - .clone() - .unwrap_or_else(|| parse_quote! { ::std::default::Default::default() }); - let (init, default) = field.fold.then(|| (None, quote! { || #default })).unwrap_or_else(|| ( - Some(quote! { + let mut default = match default { + Some(default) => quote! { #default }, + None => quote! { ::std::default::Default::default() }, + }; + + let mut init = None; + if field.borrowed { + init = Some(quote! { static DEFAULT: ::once_cell::sync::Lazy<#ty> = ::once_cell::sync::Lazy::new(|| #default); - }), - quote! { &DEFAULT }, - )); + }); + default = quote! { &DEFAULT }; + } - quote! { - #init + let mut value = quote! { styles.#getter::<#ty>( <Self as #foundations::NativeElement>::elem(), <#elem as #foundations::Fields>::Enum::#enum_ident as u8, #inherent, - #default, + || #default, ) + }; + + if field.resolve { + value = quote! { #foundations::Resolve::resolve(#value, styles) }; + } + + quote! { + #init + #value } } @@ -995,21 +1002,18 @@ fn create_param_info(field: &Field) -> TokenStream { variadic, required, default, - fold, ty, - output, .. } = field; let named = !positional; let settable = field.settable(); - let default_ty = if *fold { &output } else { &ty }; let default = quote_option(&settable.then(|| { let default = default .clone() .unwrap_or_else(|| parse_quote! { ::std::default::Default::default() }); quote! { || { - let typed: #default_ty = #default; + let typed: #ty = #default; #foundations::IntoValue::into_value(typed) } } |
