summaryrefslogtreecommitdiff
path: root/macros/src/node.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-12-14 10:09:44 +0100
committerLaurenz <laurmaedje@gmail.com>2022-12-14 10:09:44 +0100
commit9ba4d2c134479aad876a0e2ac4cd1622a353109e (patch)
treea94e0e6ae53a1ba440e869fca26cc2ea0b179057 /macros/src/node.rs
parent4c73456fc1f5df8ebb3a89d9db657c3c54624d66 (diff)
New macro setup
Diffstat (limited to 'macros/src/node.rs')
-rw-r--r--macros/src/node.rs40
1 files changed, 3 insertions, 37 deletions
diff --git a/macros/src/node.rs b/macros/src/node.rs
index 4add9bc3..192ca667 100644
--- a/macros/src/node.rs
+++ b/macros/src/node.rs
@@ -1,4 +1,3 @@
-use syn::parse::Parser;
use syn::punctuated::Punctuated;
use syn::spanned::Spanned;
use syn::Token;
@@ -6,8 +5,8 @@ use syn::Token;
use super::*;
/// Expand the `#[node]` macro.
-pub fn expand(attr: TokenStream, body: syn::ItemImpl) -> Result<TokenStream> {
- let node = prepare(attr, body)?;
+pub fn node(body: syn::ItemImpl) -> Result<TokenStream> {
+ let node = prepare(body)?;
create(&node)
}
@@ -18,7 +17,6 @@ struct Node {
self_ty: syn::Type,
self_name: String,
self_args: Punctuated<syn::GenericArgument, Token![,]>,
- capabilities: Vec<syn::Ident>,
properties: Vec<Property>,
construct: Option<syn::ImplItemMethod>,
set: Option<syn::ImplItemMethod>,
@@ -47,7 +45,7 @@ enum Shorthand {
}
/// Preprocess the impl block of a node.
-fn prepare(attr: TokenStream, body: syn::ItemImpl) -> Result<Node> {
+fn prepare(body: syn::ItemImpl) -> Result<Node> {
// Extract the generic type arguments.
let params = body.generics.params.clone();
@@ -66,12 +64,6 @@ fn prepare(attr: TokenStream, body: syn::ItemImpl) -> Result<Node> {
_ => Punctuated::new(),
};
- // Parse the capabilities.
- let capabilities: Vec<_> = Punctuated::<Ident, Token![,]>::parse_terminated
- .parse2(attr)?
- .into_iter()
- .collect();
-
let mut properties = vec![];
let mut construct = None;
let mut set = None;
@@ -101,7 +93,6 @@ fn prepare(attr: TokenStream, body: syn::ItemImpl) -> Result<Node> {
self_ty,
self_name,
self_args,
- capabilities,
properties,
construct,
set,
@@ -215,7 +206,6 @@ fn create(node: &Node) -> Result<TokenStream> {
let construct_func = create_node_construct_func(node);
let set_func = create_node_set_func(node);
let field_method = create_node_field_method(node);
- let vtable_method = create_node_vtable_method(node);
let node_impl = quote! {
impl<#params> ::typst::model::Node for #self_ty {
@@ -225,10 +215,6 @@ fn create(node: &Node) -> Result<TokenStream> {
#set_func
#field_method
}
-
- unsafe impl<#params> ::typst::model::Capable for #self_ty {
- #vtable_method
- }
};
let mut modules: Vec<syn::ItemMod> = vec![];
@@ -359,26 +345,6 @@ fn create_node_field_method(node: &Node) -> syn::ImplItemMethod {
})
}
-/// Create the node's capability accessor method.
-fn create_node_vtable_method(node: &Node) -> syn::ImplItemMethod {
- let checks = node.capabilities.iter().map(|capability| {
- quote! {
- if id == ::std::any::TypeId::of::<dyn #capability>() {
- return Some(unsafe {
- ::typst::util::fat::vtable(self as &dyn #capability)
- });
- }
- }
- });
-
- parse_quote! {
- fn vtable(&self, id: ::std::any::TypeId) -> ::std::option::Option<*const ()> {
- #(#checks)*
- None
- }
- }
-}
-
/// Process a single const item.
fn create_property_module(node: &Node, property: &Property) -> (syn::Type, syn::ItemMod) {
let params = &node.params;