Skip to content

Commit b3f7961

Browse files
eduardosmAmanieu
authored andcommitted
Support adding attributes to simd_test tests
It uses the syn crate to parse the function, so the name can now be extracted without the `find_name` helper.
1 parent 4e45990 commit b3f7961

File tree

2 files changed

+6
-34
lines changed

2 files changed

+6
-34
lines changed

crates/simd-test-macro/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ test = false
1111
[dependencies]
1212
proc-macro2 = "1.0"
1313
quote = "1.0"
14+
syn = { version = "2.0", features = ["full"] }

crates/simd-test-macro/src/lib.rs

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[macro_use]
88
extern crate quote;
99

10-
use proc_macro2::{Delimiter, Ident, Literal, Span, TokenStream, TokenTree};
10+
use proc_macro2::{Ident, Literal, Span, TokenStream, TokenTree};
1111
use quote::ToTokens;
1212
use std::env;
1313

@@ -44,13 +44,9 @@ pub fn simd_test(
4444
.collect();
4545

4646
let enable_feature = string(enable_feature);
47-
let item = TokenStream::from(item);
48-
let name = find_name(item.clone());
49-
50-
let name: TokenStream = name
51-
.to_string()
52-
.parse()
53-
.unwrap_or_else(|_| panic!("failed to parse name: {}", name.to_string()));
47+
let mut item = syn::parse_macro_input!(item as syn::ItemFn);
48+
let item_attrs = std::mem::take(&mut item.attrs);
49+
let name = &item.sig.ident;
5450

5551
let target = env::var("TARGET").expect(
5652
"TARGET environment variable should be set for rustc (e.g. TARGET=x86_64-apple-darwin cargo test)"
@@ -109,6 +105,7 @@ pub fn simd_test(
109105
#[allow(non_snake_case)]
110106
#[test]
111107
#maybe_ignore
108+
#(#item_attrs)*
112109
fn #name() {
113110
if #force_test | (#cfg_target_features) {
114111
let v = unsafe { #name() };
@@ -123,29 +120,3 @@ pub fn simd_test(
123120
};
124121
ret.into()
125122
}
126-
127-
fn find_name(item: TokenStream) -> Ident {
128-
let mut tokens = item.into_iter();
129-
while let Some(tok) = tokens.next() {
130-
if let TokenTree::Ident(word) = tok {
131-
if word == "fn" {
132-
break;
133-
}
134-
}
135-
}
136-
137-
fn get_ident(tt: TokenTree) -> Option<Ident> {
138-
match tt {
139-
TokenTree::Ident(i) => Some(i),
140-
TokenTree::Group(g) if g.delimiter() == Delimiter::None => {
141-
get_ident(g.stream().into_iter().next()?)
142-
}
143-
_ => None,
144-
}
145-
}
146-
147-
tokens
148-
.next()
149-
.and_then(get_ident)
150-
.expect("failed to find function name")
151-
}

0 commit comments

Comments
 (0)