| //@ edition: 2024 |
| |
| extern crate proc_macro; |
| |
| use proc_macro::{Delimiter, TokenStream, TokenTree}; |
| |
| #[proc_macro_attribute] |
| pub fn norepr(_: TokenStream, input: TokenStream) -> TokenStream { |
| let mut tokens = vec![]; |
| let mut tts = input.into_iter().fuse().peekable(); |
| loop { |
| let Some(token) = tts.next() else { break }; |
| if let TokenTree::Punct(punct) = &token |
| && punct.as_char() == '#' |
| { |
| if let Some(TokenTree::Group(group)) = tts.peek() |
| && let Delimiter::Bracket = group.delimiter() |
| && let Some(TokenTree::Ident(ident)) = group.stream().into_iter().next() |
| && ident.to_string() == "repr" |
| { |
| let _ = tts.next(); |
| // skip '#' and '[repr(..)] |
| } else { |
| tokens.push(token); |
| } |
| } else { |
| tokens.push(token); |
| } |
| } |
| tokens.into_iter().collect() |
| } |