Create 'delimited!' macro for tests
diff --git a/tests/common/mod.rs b/tests/common/mod.rs
index 4665ef7..723fab4 100644
--- a/tests/common/mod.rs
+++ b/tests/common/mod.rs
@@ -9,16 +9,6 @@
use self::walkdir::DirEntry;
-macro_rules! errorf {
- ($($tt:tt)*) => {
- {
- use ::std::io::Write;
- let stderr = ::std::io::stderr();
- write!(stderr.lock(), $($tt)*).unwrap();
- }
- };
-}
-
pub mod parse;
pub mod respan;
diff --git a/tests/macros/mod.rs b/tests/macros/mod.rs
new file mode 100644
index 0000000..86d40ca
--- /dev/null
+++ b/tests/macros/mod.rs
@@ -0,0 +1,27 @@
+#[macro_export]
+macro_rules! errorf {
+ ($($tt:tt)*) => {{
+ use ::std::io::Write;
+ let stderr = ::std::io::stderr();
+ write!(stderr.lock(), $($tt)*).unwrap();
+ }};
+}
+
+#[macro_export]
+macro_rules! delimited {
+ ($first:expr, $($rest:expr,)*) => {{
+ let mut d = ::syn::delimited::Delimited::new();
+ let mut last = $first;
+ $(
+ d.push(::std::mem::replace(&mut last, $rest));
+ d.push_trailing(::std::default::Default::default());
+ )*
+ last = last;
+ d.push(last);
+ d
+ }};
+
+ ($($e:expr),+) => {
+ delimited!($($e,)+)
+ };
+}
diff --git a/tests/test_derive_input.rs b/tests/test_derive_input.rs
index 8884137..4003263 100644
--- a/tests/test_derive_input.rs
+++ b/tests/test_derive_input.rs
@@ -9,6 +9,9 @@
use std::iter::FromIterator;
+#[macro_use]
+mod macros;
+
fn op(c: char) -> TokenTree {
proc_macro2::TokenTree {
span: Default::default(),
@@ -88,7 +91,7 @@
semi_token: None,
struct_token: Default::default(),
data: VariantData::Struct(
- vec![
+ delimited![
Field {
ident: Some("ident".into()),
colon_token: Some(Default::default()),
@@ -112,28 +115,28 @@
qself: None,
path: Path {
leading_colon: None,
- segments: vec![
- PathSegment {
- ident: "Vec".into(),
- arguments: PathArguments::AngleBracketed(
- AngleBracketedGenericArguments {
- colon2_token: None,
- lt_token: Default::default(),
- args: vec![
- GenericArgument::Type(Type::from(TypePath {
- qself: None,
- path: "Attribute".into(),
- })),
- ].into(),
- gt_token: Default::default(),
- },
- ),
- }
- ].into(),
+ segments: delimited![
+ PathSegment {
+ ident: "Vec".into(),
+ arguments: PathArguments::AngleBracketed(
+ AngleBracketedGenericArguments {
+ colon2_token: None,
+ lt_token: Default::default(),
+ args: delimited![
+ GenericArgument::Type(Type::from(TypePath {
+ qself: None,
+ path: "Attribute".into(),
+ })),
+ ],
+ gt_token: Default::default(),
+ },
+ ),
+ }
+ ],
},
}.into(),
},
- ].into(),
+ ],
Default::default(),
),
}),
@@ -146,10 +149,10 @@
let expected_meta_item: MetaItem = MetaItemList {
ident: "derive".into(),
paren_token: Default::default(),
- nested: vec![
+ nested: delimited![
NestedMetaItem::MetaItem(MetaItem::Term("Debug".into())),
NestedMetaItem::MetaItem(MetaItem::Term("Clone".into())),
- ].into(),
+ ],
}.into();
assert_eq!(expected_meta_item, actual.attrs[0].meta_item().unwrap());
@@ -202,7 +205,7 @@
],
generics: Generics {
lt_token: Some(Default::default()),
- params: vec![
+ params: delimited![
GenericParam::Type(TypeParam {
attrs: Vec::new(),
ident: "T".into(),
@@ -219,17 +222,17 @@
eq_token: None,
default: None,
}),
- ].into(),
+ ],
gt_token: Some(Default::default()),
where_clause: None,
},
body: Body::Enum(BodyEnum {
- variants: vec![
+ variants: delimited![
Variant {
ident: "Ok".into(),
attrs: Vec::new(),
data: VariantData::Tuple(
- vec![
+ delimited![
Field {
colon_token: None,
ident: None,
@@ -240,7 +243,7 @@
path: "T".into(),
}.into(),
},
- ].into(),
+ ],
Default::default(),
),
discriminant: None,
@@ -249,7 +252,7 @@
ident: "Err".into(),
attrs: Vec::new(),
data: VariantData::Tuple(
- vec![
+ delimited![
Field {
ident: None,
colon_token: None,
@@ -260,7 +263,7 @@
path: "E".into(),
}.into(),
},
- ].into(),
+ ],
Default::default(),
),
discriminant: None,
@@ -291,7 +294,7 @@
base: Box::new(Expr::Tuple(ExprTuple {
attrs: Vec::new(),
paren_token: Default::default(),
- elems: vec![
+ elems: delimited![
Expr::Lit(ExprLit {
attrs: Vec::new(),
lit: Lit {
@@ -306,7 +309,7 @@
span: Default::default(),
},
}),
- ].into(),
+ ],
})),
dot_token: Default::default(),
member: Member::Unnamed(Index {
@@ -316,7 +319,7 @@
}),
)),
},
- ].into(),
+ ],
brace_token: Default::default(),
enum_token: Default::default(),
}),
@@ -367,10 +370,10 @@
style: AttrStyle::Outer,
path: Path {
leading_colon: Some(Default::default()),
- segments: vec![
+ segments: delimited![
PathSegment::from("attr_args"),
PathSegment::from("identity"),
- ].into(),
+ ],
},
tts: TokenStream::from_iter(vec![
word("fn"),
@@ -429,7 +432,7 @@
style: AttrStyle::Outer,
path: Path {
leading_colon: None,
- segments: vec![PathSegment::from("inert")].into(),
+ segments: delimited![PathSegment::from("inert")],
},
tts: TokenStream::from_iter(vec![op('<'), word("T"), op('>')]),
is_sugared_doc: false,
@@ -467,7 +470,7 @@
style: AttrStyle::Outer,
path: Path {
leading_colon: None,
- segments: vec![PathSegment::from("foo"), PathSegment::from("self")].into(),
+ segments: delimited![PathSegment::from("foo"), PathSegment::from("self")],
},
tts: TokenStream::empty(),
is_sugared_doc: false,
@@ -507,14 +510,13 @@
generics: Generics::default(),
body: Body::Struct(BodyStruct {
data: VariantData::Tuple(
- vec![
+ delimited![
Field {
ident: None,
vis: Visibility::Restricted(VisRestricted {
path: Box::new(Path {
leading_colon: None,
- segments: vec![PathSegment::from("m"), PathSegment::from("n")]
- .into(),
+ segments: delimited![PathSegment::from("m"), PathSegment::from("n")],
}),
in_token: Some(Default::default()),
paren_token: Default::default(),
@@ -527,7 +529,7 @@
path: "u8".into(),
}.into(),
},
- ].into(),
+ ],
Default::default(),
),
semi_token: Some(Default::default()),
diff --git a/tests/test_generics.rs b/tests/test_generics.rs
index 8cdb4a2..4b55b15 100644
--- a/tests/test_generics.rs
+++ b/tests/test_generics.rs
@@ -10,6 +10,9 @@
extern crate proc_macro2;
use proc_macro2::{Span, Term, TokenStream};
+#[macro_use]
+mod macros;
+
mod common;
#[test]
@@ -18,7 +21,7 @@
let generics = Generics {
gt_token: Some(Default::default()),
lt_token: Some(Default::default()),
- params: vec![
+ params: delimited![
GenericParam::Lifetime(LifetimeDef {
attrs: Default::default(),
lifetime: Lifetime::new(Term::intern("'a"), Span::default()),
@@ -28,7 +31,7 @@
GenericParam::Lifetime(LifetimeDef {
attrs: Default::default(),
lifetime: Lifetime::new(Term::intern("'b"), Span::default()),
- bounds: vec![Lifetime::new(Term::intern("'a"), Span::default())].into(),
+ bounds: delimited![Lifetime::new(Term::intern("'a"), Span::default())],
colon_token: Some(token::Colon::default()),
}),
GenericParam::Type(TypeParam {
@@ -43,9 +46,9 @@
},
],
ident: "T".into(),
- bounds: vec![
+ bounds: delimited![
TypeParamBound::Region(Lifetime::new(Term::intern("'a"), Span::default())),
- ].into(),
+ ],
default: Some(
TypeTuple {
elems: Default::default(),
@@ -55,10 +58,10 @@
colon_token: Some(Default::default()),
eq_token: Default::default(),
}),
- ].into(),
+ ],
where_clause: Some(WhereClause {
where_token: Default::default(),
- predicates: vec![
+ predicates: delimited![
WherePredicate::BoundPredicate(WhereBoundPredicate {
bound_lifetimes: None,
colon_token: Default::default(),
@@ -66,7 +69,7 @@
qself: None,
path: "T".into(),
}.into(),
- bounds: vec![
+ bounds: delimited![
TypeParamBound::Trait(
PolyTraitRef {
bound_lifetimes: None,
@@ -74,9 +77,9 @@
},
TraitBoundModifier::None,
),
- ].into(),
+ ],
}),
- ].into(),
+ ],
}),
};
diff --git a/tests/test_grouping.rs b/tests/test_grouping.rs
index b09225e..7d031d2 100644
--- a/tests/test_grouping.rs
+++ b/tests/test_grouping.rs
@@ -9,6 +9,9 @@
extern crate proc_macro2;
use proc_macro2::*;
+#[macro_use]
+mod macros;
+
mod common;
fn tt(k: TokenNode) -> TokenTree {
diff --git a/tests/test_meta_item.rs b/tests/test_meta_item.rs
index efb11ae..4784edd 100644
--- a/tests/test_meta_item.rs
+++ b/tests/test_meta_item.rs
@@ -7,6 +7,9 @@
use syn::synom::SynomBuffer;
use proc_macro2::{Literal, TokenStream};
+#[macro_use]
+mod macros;
+
fn lit<T: Into<Literal>>(t: T) -> Lit {
Lit {
value: LitKind::Other(t.into()),
@@ -38,7 +41,7 @@
MetaItemList {
ident: "foo".into(),
paren_token: Default::default(),
- nested: vec![NestedMetaItem::Literal(lit(Literal::integer(5)))].into(),
+ nested: delimited![NestedMetaItem::Literal(lit(Literal::integer(5)))],
},
)
}
@@ -50,7 +53,7 @@
MetaItemList {
ident: "foo".into(),
paren_token: Default::default(),
- nested: vec![NestedMetaItem::MetaItem(MetaItem::Term("bar".into()))].into(),
+ nested: delimited![NestedMetaItem::MetaItem(MetaItem::Term("bar".into()))],
},
)
}
@@ -62,7 +65,7 @@
MetaItemList {
ident: "foo".into(),
paren_token: Default::default(),
- nested: vec![
+ nested: delimited![
NestedMetaItem::MetaItem(
MetaNameValue {
ident: "bar".into(),
@@ -70,7 +73,7 @@
lit: lit(Literal::integer(5)),
}.into(),
),
- ].into(),
+ ],
},
)
}
@@ -82,7 +85,7 @@
MetaItemList {
ident: "foo".into(),
paren_token: Default::default(),
- nested: vec![
+ nested: delimited![
NestedMetaItem::MetaItem(MetaItem::Term("word".into())),
NestedMetaItem::MetaItem(
MetaNameValue {
@@ -95,7 +98,7 @@
MetaItemList {
ident: "list".into(),
paren_token: Default::default(),
- nested: vec![
+ nested: delimited![
NestedMetaItem::MetaItem(
MetaNameValue {
ident: "name2".into(),
@@ -103,11 +106,11 @@
lit: lit(Literal::integer(6)),
}.into(),
),
- ].into(),
+ ],
}.into(),
),
NestedMetaItem::MetaItem(MetaItem::Term("word2".into())),
- ].into(),
+ ],
},
)
}
diff --git a/tests/test_precedence.rs b/tests/test_precedence.rs
index fbe27e8..8af0941 100644
--- a/tests/test_precedence.rs
+++ b/tests/test_precedence.rs
@@ -31,8 +31,10 @@
use common::{parse, respan};
-#[allow(dead_code)]
#[macro_use]
+mod macros;
+
+#[allow(dead_code)]
mod common;
/// Test some pre-set expressions chosen by us.
diff --git a/tests/test_round_trip.rs b/tests/test_round_trip.rs
index c5b82f9..b1a5164 100644
--- a/tests/test_round_trip.rs
+++ b/tests/test_round_trip.rs
@@ -23,8 +23,10 @@
use std::sync::atomic::{AtomicUsize, Ordering};
use std::time::Instant;
-#[allow(dead_code)]
#[macro_use]
+mod macros;
+
+#[allow(dead_code)]
mod common;
#[test]