Skip to main content

rc_vec_proc_macro/
lib.rs

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            //TokenTree::Literal(lit) => {
30            //    let new = lit.to_string().replace("Rc", "Arc");
31            //    let mut new_lit = Literal::from_str(&new).unwrap();
32            //    new_lit.set_span(lit.span());
33            //    new_lit.into()
34            //},
35            _ => tt,
36        })
37        .collect()
38}