summaryrefslogtreecommitdiff
path: root/macros/src
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src')
-rw-r--r--macros/src/element.rs23
-rw-r--r--macros/src/func.rs9
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,