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}