pgc_derive/
lib.rs

1extern crate proc_macro;
2extern crate syn;
3#[macro_use]
4extern crate synstructure;
5#[macro_use]
6extern crate quote;
7extern crate proc_macro2;
8
9decl_derive!([GcObject, attributes(unsafe_ignore_trace)] => derive_gcobject);
10
11fn derive_gcobject(mut s: synstructure::Structure) -> proc_macro2::TokenStream {
12    s.filter(|bi| {
13        !bi.ast()
14            .attrs
15            .iter()
16            .any(|attr| attr.path.is_ident("unsafe_ignore_trace"))
17    });
18    let body = s.each(|bi| quote!(v.extend(#bi.references())));
19    let gcobject_impl = s.unsafe_bound_impl(
20        quote!(::pgc::GcObject),
21        quote! {
22            #[allow(unused_mut)]
23            fn references(&self) -> Vec<pgc::Gc<dyn pgc::GcObject>> {
24                let mut v: Vec<pgc::Gc<dyn pgc::GcObject>> = vec![];
25                match *self {
26                    #body
27                };
28                v
29            }
30        },
31    );
32    quote! {
33        #gcobject_impl
34    }
35}