| //@ force-host |
| //@ no-prefer-dynamic |
| |
| #![deny(unused)] |
| #![crate_type = "proc-macro"] |
| |
| extern crate proc_macro; |
| use proc_macro::*; |
| |
| #[proc_macro_attribute] |
| pub fn duplicate(attr: TokenStream, item: TokenStream) -> TokenStream { |
| let mut new_name = Some(attr.into_iter().nth(0).unwrap()); |
| let mut encountered_idents = 0; |
| let input = item.to_string(); |
| let ret = item |
| .into_iter() |
| .map(move |token| match token { |
| TokenTree::Ident(_) if encountered_idents == 1 => { |
| encountered_idents += 1; |
| new_name.take().unwrap() |
| } |
| TokenTree::Ident(_) => { |
| encountered_idents += 1; |
| token |
| } |
| _ => token, |
| }) |
| .collect::<TokenStream>(); |
| let mut input_again = input.parse::<TokenStream>().unwrap(); |
| input_again.extend(ret); |
| input_again |
| } |