extern crate proc_macro; use proc_macro::TokenStream; use proc_macro::TokenTree; use proc_macro::Ident; use proc_macro::Span; use std::iter::FromIterator; static mut TEMP_COUNTER: i64 = 0; #[proc_macro] pub fn temp(item: TokenStream) -> TokenStream { let mut iterator = item.clone().into_iter().peekable(); if item.is_empty() { unsafe { TEMP_COUNTER += 1; } } else if let Some(TokenTree::Literal(_)) = iterator.peek() { if let Ok(number) = item.to_string().parse::() { unsafe { TEMP_COUNTER = number; } } } else if let Some(TokenTree::Punct(i)) = iterator.next() { if i.as_char() == '+' { if let Some(TokenTree::Literal(i)) = iterator.next() { if let Ok(number) = i.to_string().parse::() { unsafe { TEMP_COUNTER += number; } } } } else if i.as_char() == '-' { if let Some(TokenTree::Literal(i)) = iterator.next() { if let Ok(number) = i.to_string().parse::() { unsafe { TEMP_COUNTER -= number; } } } else if let None = iterator.next() { } } } else { panic!("Invalid input to temporary variable generator."); } TokenStream::from_iter([ TokenTree::Ident(Ident::new(format!("temp{}", unsafe { TEMP_COUNTER }).as_str(), Span::call_site())) ]) }