Skip to content

Commit f4adaf6

Browse files
committed
tool: simplify spirv proc macro
1 parent fa6a953 commit f4adaf6

File tree

1 file changed

+13
-8
lines changed
  • crates/spirv-std/macros/src

1 file changed

+13
-8
lines changed

crates/spirv-std/macros/src/lib.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ use proc_macro2::{Delimiter, Group, Span, TokenTree};
7878

7979
use syn::{ImplItemFn, visit_mut::VisitMut};
8080

81-
use quote::{ToTokens, quote};
81+
use quote::{ToTokens, TokenStreamExt, quote};
8282
use std::fmt::Write;
8383

8484
/// A macro for creating SPIR-V `OpTypeImage` types. Always produces a
@@ -154,26 +154,31 @@ pub fn spirv(attr: TokenStream, item: TokenStream) -> TokenStream {
154154
for tt in item {
155155
match tt {
156156
TokenTree::Group(group) if group.delimiter() == Delimiter::Parenthesis => {
157-
let mut sub_tokens = Vec::new();
157+
let mut group_tokens = proc_macro2::TokenStream::new();
158+
let mut last_token_hashtag = false;
158159
for tt in group.stream() {
160+
let is_token_hashtag =
161+
matches!(&tt, TokenTree::Punct(punct) if punct.as_char() == '#');
159162
match tt {
160163
TokenTree::Group(group)
161164
if group.delimiter() == Delimiter::Bracket
162-
&& matches!(group.stream().into_iter().next(), Some(TokenTree::Ident(ident)) if ident == "spirv")
163-
&& matches!(sub_tokens.last(), Some(TokenTree::Punct(p)) if p.as_char() == '#') =>
165+
&& last_token_hashtag
166+
&& matches!(group.stream().into_iter().next(), Some(TokenTree::Ident(ident)) if ident == "spirv") =>
164167
{
165168
// group matches [spirv ...]
166-
let inner = group.stream(); // group stream doesn't include the brackets
167-
sub_tokens.extend(
169+
// group stream doesn't include the brackets
170+
let inner = group.stream();
171+
group_tokens.extend(
168172
quote! { [cfg_attr(target_arch="spirv", rust_gpu::#inner)] },
169173
);
170174
}
171-
_ => sub_tokens.push(tt),
175+
_ => group_tokens.append(tt),
172176
}
177+
last_token_hashtag = is_token_hashtag;
173178
}
174179
tokens.push(TokenTree::from(Group::new(
175180
Delimiter::Parenthesis,
176-
sub_tokens.into_iter().collect(),
181+
group_tokens,
177182
)));
178183
}
179184
_ => tokens.push(tt),

0 commit comments

Comments
 (0)