31 lines
959 B
Rust
31 lines
959 B
Rust
//@ 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()
|
|
}
|