1use proc_macro::*;
2
3#[proc_macro_attribute]
4pub fn rc_impl_gen_arc_impl(attr: TokenStream, item: TokenStream) -> TokenStream {
5 if let Some(attr) = attr.into_iter().next() {
6 let err = Ident::new("invalid", attr.span());
7 return TokenTree::from(err).into();
8 }
9
10 item.clone()
11 .into_iter()
12 .chain(rc_impl_gen_arc_impl_inner(item))
13 .collect()
14}
15
16fn rc_impl_gen_arc_impl_inner(input: TokenStream) -> TokenStream {
17 input.into_iter()
18 .map(|tt| match tt {
19 TokenTree::Group(group) => {
20 let new = rc_impl_gen_arc_impl_inner(group.stream());
21 let mut new_g = Group::new(group.delimiter(), new);
22 new_g.set_span(group.span());
23 new_g.into()
24 },
25 TokenTree::Ident(ident) => {
26 let new = ident.to_string().replace("Rc", "Arc");
27 Ident::new(&new, ident.span()).into()
28 },
29 _ => tt,
36 })
37 .collect()
38}