Skip to content

Commit 249867b

Browse files
author
Ivan Dubrov
committed
🦎Migrating to latest syn/proc_macro2/quote
1 parent 2edc6d4 commit 249867b

File tree

4 files changed

+44
-55
lines changed

4 files changed

+44
-55
lines changed

datatest-derive/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ Procmacro for the datatest crate
1313
proc-macro = true
1414

1515
[dependencies]
16-
quote = "0.6.10"
17-
syn = { version = "0.15.20", features = ["full"] }
18-
proc-macro2 = "0.4.23"
16+
quote = "1.0.2"
17+
syn = { version = "1.0.3", features = ["full"] }
18+
proc-macro2 = "1.0.1"

datatest-derive/src/lib.rs

Lines changed: 38 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use syn::parse::{Parse, ParseStream, Result as ParseResult};
99
use syn::punctuated::Punctuated;
1010
use syn::spanned::Spanned;
1111
use syn::token::Comma;
12-
use syn::{braced, parse_macro_input, ArgCaptured, FnArg, Ident, ItemFn, Pat};
12+
use syn::{braced, parse_macro_input, FnArg, Ident, ItemFn, Pat, PatIdent, PatType, Type};
1313

1414
type Error = syn::parse::Error;
1515

@@ -154,22 +154,17 @@ fn files_internal(
154154
func: proc_macro::TokenStream,
155155
channel: Channel,
156156
) -> proc_macro::TokenStream {
157-
let mut func_item = parse_macro_input!(func as ItemFn);
157+
let mut func_item: ItemFn = parse_macro_input!(func as ItemFn);
158158
let args: FilesTestArgs = parse_macro_input!(args as FilesTestArgs);
159-
160-
let func_name_str = func_item.ident.to_string();
161-
let desc_ident = Ident::new(
162-
&format!("__TEST_{}", func_item.ident),
163-
func_item.ident.span(),
164-
);
159+
let info = handle_common_attrs(&mut func_item, false);
160+
let func_ident = &func_item.sig.ident;
161+
let func_name_str = func_ident.to_string();
162+
let desc_ident = Ident::new(&format!("__TEST_{}", func_ident), func_ident.span());
165163
let trampoline_func_ident = Ident::new(
166-
&format!("__TEST_TRAMPOLINE_{}", func_item.ident),
167-
func_item.ident.span(),
164+
&format!("__TEST_TRAMPOLINE_{}", func_ident),
165+
func_ident.span(),
168166
);
169-
170-
let info = handle_common_attrs(&mut func_item, false);
171167
let ignore = info.ignore;
172-
173168
let root = args.root;
174169
let mut pattern_idx = None;
175170
let mut params: Vec<String> = Vec::new();
@@ -182,13 +177,9 @@ fn files_internal(
182177
// 2. For each argument we collect piece of code to create argument from the `&[PathBuf]` slice
183178
// given to us by the test runner.
184179
// 3. Capture the index of the argument corresponding to the "pattern" mapping
185-
for (mut idx, arg) in func_item.decl.inputs.iter().enumerate() {
186-
match arg {
187-
FnArg::Captured(ArgCaptured {
188-
pat: Pat::Ident(pat_ident),
189-
ty,
190-
..
191-
}) => {
180+
for (mut idx, arg) in func_item.sig.inputs.iter().enumerate() {
181+
match match_arg(arg) {
182+
Some((pat_ident, ty)) => {
192183
if info.bench {
193184
if idx == 0 {
194185
// FIXME: verify is Bencher!
@@ -220,7 +211,7 @@ fn files_internal(
220211
.into();
221212
}
222213
}
223-
_ => {
214+
None => {
224215
return Error::new(
225216
arg.span(),
226217
"unexpected argument; only simple argument types are allowed (`&str`, `String`, `&[u8]`, `Vec<u8>`, `&Path`, etc)",
@@ -244,9 +235,6 @@ fn files_internal(
244235
.into();
245236
}
246237

247-
// So we can invoke original function from the trampoline function
248-
let orig_func_name = &func_item.ident;
249-
250238
let (kind, bencher_param) = if info.bench {
251239
(
252240
quote!(BenchFn),
@@ -274,7 +262,7 @@ fn files_internal(
274262
#[automatically_derived]
275263
#[allow(non_snake_case)]
276264
fn #trampoline_func_ident(#bencher_param paths_arg: &[::std::path::PathBuf]) {
277-
let result = #orig_func_name(#(#invoke_args),*);
265+
let result = #func_ident(#(#invoke_args),*);
278266
::datatest::__internal::assert_test_result(result);
279267
}
280268

@@ -283,6 +271,15 @@ fn files_internal(
283271
output.into()
284272
}
285273

274+
fn match_arg(arg: &FnArg) -> Option<(&PatIdent, &Type)> {
275+
if let FnArg::Typed(PatType { pat, ty, .. }) = arg {
276+
if let Pat::Ident(pat_ident) = pat.as_ref() {
277+
return Some((pat_ident, ty));
278+
}
279+
}
280+
None
281+
}
282+
286283
enum ShouldPanic {
287284
No,
288285
Yes,
@@ -354,7 +351,7 @@ fn parse_should_panic(attr: &syn::Attribute) -> ShouldPanic {
354351
for item in list.nested {
355352
match item {
356353
syn::NestedMeta::Meta(syn::Meta::NameValue(ref nv))
357-
if nv.ident == "expected" =>
354+
if nv.path.is_ident("expected") =>
358355
{
359356
if let syn::Lit::Str(ref value) = nv.lit {
360357
return ShouldPanic::YesWithMessage(value.value());
@@ -413,32 +410,27 @@ fn data_internal(
413410
) -> proc_macro::TokenStream {
414411
let mut func_item = parse_macro_input!(func as ItemFn);
415412
let cases: DataTestArgs = parse_macro_input!(args as DataTestArgs);
413+
let info = handle_common_attrs(&mut func_item, false);
416414
let cases = match cases {
417415
DataTestArgs::Literal(path) => quote!(datatest::yaml(#path)),
418416
DataTestArgs::Expression(expr) => quote!(#expr),
419417
};
418+
let func_ident = &func_item.sig.ident;
420419

421-
let func_name_str = func_item.ident.to_string();
422-
let desc_ident = Ident::new(
423-
&format!("__TEST_{}", func_item.ident),
424-
func_item.ident.span(),
425-
);
420+
let func_name_str = func_ident.to_string();
421+
let desc_ident = Ident::new(&format!("__TEST_{}", func_ident), func_ident.span());
426422
let describe_func_ident = Ident::new(
427-
&format!("__TEST_DESCRIBE_{}", func_item.ident),
428-
func_item.ident.span(),
423+
&format!("__TEST_DESCRIBE_{}", func_ident),
424+
func_ident.span(),
429425
);
430426
let trampoline_func_ident = Ident::new(
431-
&format!("__TEST_TRAMPOLINE_{}", func_item.ident),
432-
func_item.ident.span(),
427+
&format!("__TEST_TRAMPOLINE_{}", func_ident),
428+
func_ident.span(),
433429
);
434430

435-
let info = handle_common_attrs(&mut func_item, false);
436431
let ignore = info.ignore;
437-
438432
// FIXME: check file exists!
439-
440-
let orig_func_ident = &func_item.ident;
441-
let mut args = func_item.decl.inputs.iter();
433+
let mut args = func_item.sig.inputs.iter();
442434

443435
if info.bench {
444436
// Skip Bencher argument
@@ -448,7 +440,7 @@ fn data_internal(
448440

449441
let arg = args.next();
450442
let ty = match arg {
451-
Some(FnArg::Captured(ArgCaptured { ty, .. })) => Some(ty),
443+
Some(FnArg::Typed(PatType { ty, .. })) => Some(ty.as_ref()),
452444
_ => None,
453445
};
454446
let (ref_token, ty) = match ty {
@@ -484,7 +476,7 @@ fn data_internal(
484476
#[automatically_derived]
485477
#[allow(non_snake_case)]
486478
fn #trampoline_func_ident(#bencher_param arg: #ty) {
487-
let result = #orig_func_ident(#bencher_arg #ref_token arg);
479+
let result = #func_ident(#bencher_arg #ref_token arg);
488480
::datatest::__internal::assert_test_result(result);
489481
}
490482

@@ -545,20 +537,16 @@ pub fn test_stable(
545537
) -> proc_macro::TokenStream {
546538
let mut func_item = parse_macro_input!(func as ItemFn);
547539
let info = handle_common_attrs(&mut func_item, true);
548-
let ignore = info.ignore;
549-
let func_ident = &func_item.ident;
550-
let func_name_str = func_item.ident.to_string();
551-
let desc_ident = Ident::new(
552-
&format!("__TEST_{}", func_item.ident),
553-
func_item.ident.span(),
554-
);
540+
let func_ident = &func_item.sig.ident;
541+
let func_name_str = func_ident.to_string();
542+
let desc_ident = Ident::new(&format!("__TEST_{}", func_ident), func_ident.span());
555543

544+
let ignore = info.ignore;
556545
let should_panic = match info.should_panic {
557546
ShouldPanic::No => quote!(::datatest::__internal::RegularShouldPanic::No),
558547
ShouldPanic::Yes => quote!(::datatest::__internal::RegularShouldPanic::Yes),
559548
ShouldPanic::YesWithMessage(v) => quote!(::datatest::__internal::RegularShouldPanic::YesWithMessage(#v)),
560549
};
561-
562550
let registration = test_registration(Channel::Stable, &desc_ident);
563551
let output = quote! {
564552
#registration

tests/datatest_stable.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,4 @@
44
// suites as we set `harness = false` for the "stable" one.
55
include!("tests/mod.rs");
66

7-
use datatest::test;
8-
97
datatest::harness!();

tests/tests/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#[cfg(feature = "stable")]
2+
use datatest::test;
3+
14
use serde::Deserialize;
25
use std::fmt;
36
use std::path::Path;

0 commit comments

Comments
 (0)