diff options
| author | Laurenz <laurmaedje@gmail.com> | 2023-03-07 15:17:13 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2023-03-07 15:17:13 +0100 |
| commit | 25b5bd117529cd04bb789e1988eb3a3db8025a0e (patch) | |
| tree | 2fbb4650903123da047a1f1f11a0abda95286e12 /macros/src/capable.rs | |
| parent | 6ab7760822ccd24b4ef126d4737d41f1be15fe19 (diff) | |
Fully untyped model
Diffstat (limited to 'macros/src/capable.rs')
| -rw-r--r-- | macros/src/capable.rs | 48 |
1 files changed, 0 insertions, 48 deletions
diff --git a/macros/src/capable.rs b/macros/src/capable.rs deleted file mode 100644 index dcfdfc82..00000000 --- a/macros/src/capable.rs +++ /dev/null @@ -1,48 +0,0 @@ -use syn::parse::Parser; -use syn::punctuated::Punctuated; -use syn::Token; - -use super::*; - -/// Expand the `#[capability]` macro. -pub fn capability(item: syn::ItemTrait) -> Result<TokenStream> { - let ident = &item.ident; - Ok(quote! { - #item - impl ::typst::model::Capability for dyn #ident {} - }) -} - -/// Expand the `#[capable(..)]` macro. -pub fn capable(attr: TokenStream, item: syn::Item) -> Result<TokenStream> { - let (ident, generics) = match &item { - syn::Item::Struct(s) => (&s.ident, &s.generics), - syn::Item::Enum(s) => (&s.ident, &s.generics), - _ => bail!(item, "only structs and enums are supported"), - }; - - let (params, args, clause) = generics.split_for_impl(); - let checks = Punctuated::<Ident, Token![,]>::parse_terminated - .parse2(attr)? - .into_iter() - .map(|capability| { - quote! { - if id == ::std::any::TypeId::of::<dyn #capability>() { - return Some(unsafe { - ::typst::util::fat::vtable(self as &dyn #capability) - }); - } - } - }); - - Ok(quote! { - #item - - unsafe impl #params ::typst::model::Capable for #ident #args #clause { - fn vtable(&self, id: ::std::any::TypeId) -> ::std::option::Option<*const ()> { - #(#checks)* - None - } - } - }) -} |
