diff options
Diffstat (limited to 'macros')
| -rw-r--r-- | macros/src/element.rs | 23 | ||||
| -rw-r--r-- | macros/src/func.rs | 9 |
2 files changed, 31 insertions, 1 deletions
diff --git a/macros/src/element.rs b/macros/src/element.rs index 61830939..d5882666 100644 --- a/macros/src/element.rs +++ b/macros/src/element.rs @@ -407,9 +407,29 @@ fn create_vtable_func(element: &Elem) -> TokenStream { /// Create a parameter info for a field. fn create_param_info(field: &Field) -> TokenStream { - let Field { name, docs, positional, variadic, required, ty, .. } = field; + let Field { + name, + docs, + positional, + 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(|| { + quote! { + || { + let typed: #default_ty = #default; + ::typst::eval::Value::from(typed) + } + } + })); let ty = if *variadic { quote! { <#ty as ::typst::eval::Variadics>::Inner } } else { @@ -422,6 +442,7 @@ fn create_param_info(field: &Field) -> TokenStream { cast: <#ty as ::typst::eval::Cast< ::typst::syntax::Spanned<::typst::eval::Value> >>::describe(), + default: #default, positional: #positional, named: #named, variadic: #variadic, diff --git a/macros/src/func.rs b/macros/src/func.rs index 2d38c01a..2e63ee75 100644 --- a/macros/src/func.rs +++ b/macros/src/func.rs @@ -152,6 +152,14 @@ fn create_param_info(param: &Param) -> TokenStream { let Param { name, docs, named, variadic, ty, default, .. } = param; let positional = !named; let required = default.is_none(); + let default = quote_option(&default.as_ref().map(|_default| { + quote! { + || { + let typed: #ty = #default; + ::typst::eval::Value::from(typed) + } + } + })); let ty = if *variadic { quote! { <#ty as ::typst::eval::Variadics>::Inner } } else { @@ -164,6 +172,7 @@ fn create_param_info(param: &Param) -> TokenStream { cast: <#ty as ::typst::eval::Cast< ::typst::syntax::Spanned<::typst::eval::Value> >>::describe(), + default: #default, positional: #positional, named: #named, variadic: #variadic, |
