summaryrefslogtreecommitdiff
path: root/crates/typst-macros
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2024-01-30 10:43:08 +0100
committerGitHub <noreply@github.com>2024-01-30 09:43:08 +0000
commitf14288cacf7331a422cb447d60d529797def3950 (patch)
tree6776d31396e2f848b9053bb8420f96ac7e66ba4b /crates/typst-macros
parenta3e1c70e9e20b0438c233223eeead4f06a371c2c (diff)
Refactor folding (#3294)
Diffstat (limited to 'crates/typst-macros')
-rw-r--r--crates/typst-macros/src/elem.rs58
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)
}
}