// 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::(); let mut input_again = input.parse::().unwrap(); input_again.extend(ret); input_again }