Make WhereClause always hold a `where` token
diff --git a/src/derive.rs b/src/derive.rs
index a007c03..5d92a10 100644
--- a/src/derive.rs
+++ b/src/derive.rs
@@ -98,29 +98,29 @@
}
}
- named!(struct_body -> (WhereClause, VariantData, Option<Token![;]>), alt!(
+ named!(struct_body -> (Option<WhereClause>, VariantData, Option<Token![;]>), alt!(
do_parse!(
- wh: syn!(WhereClause) >>
+ wh: option!(syn!(WhereClause)) >>
body: struct_like_body >>
(wh, VariantData::Struct(body.0, body.1), None)
)
|
do_parse!(
body: tuple_like_body >>
- wh: syn!(WhereClause) >>
+ wh: option!(syn!(WhereClause)) >>
semi: punct!(;) >>
(wh, VariantData::Tuple(body.0, body.1), Some(semi))
)
|
do_parse!(
- wh: syn!(WhereClause) >>
+ wh: option!(syn!(WhereClause)) >>
semi: punct!(;) >>
(wh, VariantData::Unit, Some(semi))
)
));
- named!(enum_body -> (WhereClause, Delimited<Variant, Token![,]>, token::Brace), do_parse!(
- wh: syn!(WhereClause) >>
+ named!(enum_body -> (Option<WhereClause>, Delimited<Variant, Token![,]>, token::Brace), do_parse!(
+ wh: option!(syn!(WhereClause)) >>
data: braces!(Delimited::parse_terminated) >>
(wh, data.0, data.1)
));
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 7b976d7..b7165ef 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -1518,7 +1518,7 @@
lt_token: _i . lt_token,
params: FoldHelper::lift(_i . params, |it| { _visitor.fold_generic_param(it) }),
gt_token: _i . gt_token,
- where_clause: _visitor.fold_where_clause(_i . where_clause),
+ where_clause: (_i . where_clause).map(|it| { _visitor.fold_where_clause(it) }),
}
}
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index ead15c9..ca2b407 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -1183,7 +1183,7 @@
// Skipped field _i . lt_token;
for el in & _i . params { let it = el.item(); _visitor.visit_generic_param(it) };
// Skipped field _i . gt_token;
- _visitor.visit_where_clause(& _i . where_clause);
+ if let Some(ref it) = _i . where_clause { _visitor.visit_where_clause(it) };
}
pub fn visit_ident<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Ident) {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 38cc19e..2dae4a7 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -1183,7 +1183,7 @@
// Skipped field _i . lt_token;
for mut el in & mut _i . params { let it = el.item_mut(); _visitor.visit_generic_param_mut(it) };
// Skipped field _i . gt_token;
- _visitor.visit_where_clause_mut(& mut _i . where_clause);
+ if let Some(ref mut it) = _i . where_clause { _visitor.visit_where_clause_mut(it) };
}
pub fn visit_ident_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Ident) {
diff --git a/src/generics.rs b/src/generics.rs
index 706aace..970428b 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -9,7 +9,7 @@
pub lt_token: Option<Token![<]>,
pub params: Delimited<GenericParam, Token![,]>,
pub gt_token: Option<Token![>]>,
- pub where_clause: WhereClause,
+ pub where_clause: Option<WhereClause>,
}
}
@@ -83,8 +83,8 @@
/// # ;
/// # }
/// ```
- pub fn split_for_impl(&self) -> (ImplGenerics, TypeGenerics, &WhereClause) {
- (ImplGenerics(self), TypeGenerics(self), &self.where_clause)
+ pub fn split_for_impl(&self) -> (ImplGenerics, TypeGenerics, Option<&WhereClause>) {
+ (ImplGenerics(self), TypeGenerics(self), self.where_clause.as_ref())
}
}
@@ -154,19 +154,12 @@
ast_struct! {
/// A `where` clause in a definition
- #[derive(Default)]
pub struct WhereClause {
- pub where_token: Option<Token![where]>,
+ pub where_token: Token![where],
pub predicates: Delimited<WherePredicate, Token![,]>,
}
}
-impl WhereClause {
- pub fn none() -> Self {
- WhereClause::default()
- }
-}
-
ast_enum_of_structs! {
/// A single predicate in a `where` clause
pub enum WherePredicate {
@@ -232,7 +225,7 @@
.collect::<Vec<_>>()
.into(),
gt_token: gt,
- where_clause: WhereClause::default(),
+ where_clause: None,
}
));
}
@@ -346,17 +339,13 @@
}
impl Synom for WhereClause {
- named!(parse -> Self, alt!(
- do_parse!(
- where_: keyword!(where) >>
- predicates: call!(Delimited::parse_terminated) >>
- (WhereClause {
- predicates: predicates,
- where_token: Some(where_),
- })
- )
- |
- epsilon!() => { |_| WhereClause::default() }
+ named!(parse -> Self, do_parse!(
+ where_: keyword!(where) >>
+ predicates: call!(Delimited::parse_terminated) >>
+ (WhereClause {
+ predicates: predicates,
+ where_token: where_,
+ })
));
fn description() -> Option<&'static str> {
@@ -564,10 +553,8 @@
impl ToTokens for WhereClause {
fn to_tokens(&self, tokens: &mut Tokens) {
- if !self.predicates.is_empty() {
- TokensOrDefault(&self.where_token).to_tokens(tokens);
- self.predicates.to_tokens(tokens);
- }
+ self.where_token.to_tokens(tokens);
+ self.predicates.to_tokens(tokens);
}
}
diff --git a/src/item.rs b/src/item.rs
index 57c9400..41c56d9 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -715,7 +715,7 @@
generics: syn!(Generics) >>
inputs: parens!(Delimited::parse_terminated) >>
ret: syn!(ReturnType) >>
- where_clause: syn!(WhereClause) >>
+ where_clause: option!(syn!(WhereClause)) >>
inner_attrs_stmts: braces!(tuple!(
many0!(Attribute::parse_inner),
call!(Block::parse_within)
@@ -860,7 +860,7 @@
(args, variadic)
)) >>
ret: syn!(ReturnType) >>
- where_clause: syn!(WhereClause) >>
+ where_clause: option!(syn!(WhereClause)) >>
semi: punct!(;) >>
({
let ((inputs, variadic), parens) = inputs;
@@ -927,7 +927,7 @@
type_: keyword!(type) >>
ident: syn!(Ident) >>
generics: syn!(Generics) >>
- where_clause: syn!(WhereClause) >>
+ where_clause: option!(syn!(WhereClause)) >>
eq: punct!(=) >>
ty: syn!(Type) >>
semi: punct!(;) >>
@@ -966,7 +966,7 @@
union_: keyword!(union) >>
ident: syn!(Ident) >>
generics: syn!(Generics) >>
- where_clause: syn!(WhereClause) >>
+ where_clause: option!(syn!(WhereClause)) >>
fields: braces!(call!(Delimited::parse_terminated_with,
Field::parse_struct)) >>
(ItemUnion {
@@ -994,7 +994,7 @@
bounds: cond!(colon.is_some(),
call!(Delimited::parse_separated_nonempty)
) >>
- where_clause: syn!(WhereClause) >>
+ where_clause: option!(syn!(WhereClause)) >>
body: braces!(many0!(TraitItem::parse)) >>
(ItemTrait {
attrs: attrs,
@@ -1072,7 +1072,7 @@
generics: syn!(Generics) >>
inputs: parens!(call!(Delimited::parse_terminated)) >>
ret: syn!(ReturnType) >>
- where_clause: syn!(WhereClause) >>
+ where_clause: option!(syn!(WhereClause)) >>
body: option!(braces!(
tuple!(many0!(Attribute::parse_inner),
call!(Block::parse_within))
@@ -1126,7 +1126,7 @@
bounds: cond!(colon.is_some(),
call!(Delimited::parse_separated_nonempty)
) >>
- where_clause: syn!(WhereClause) >>
+ where_clause: option!(syn!(WhereClause)) >>
default: option!(tuple!(punct!(=), syn!(Type))) >>
semi: punct!(;) >>
(TraitItemType {
@@ -1172,7 +1172,7 @@
epsilon!() => { |_| None }
) >>
self_ty: syn!(Type) >>
- where_clause: syn!(WhereClause) >>
+ where_clause: option!(syn!(WhereClause)) >>
body: braces!(many0!(ImplItem::parse)) >>
(ItemImpl {
attrs: attrs,
@@ -1237,7 +1237,7 @@
generics: syn!(Generics) >>
inputs: parens!(call!(Delimited::parse_terminated)) >>
ret: syn!(ReturnType) >>
- where_clause: syn!(WhereClause) >>
+ where_clause: option!(syn!(WhereClause)) >>
inner_attrs_stmts: braces!(tuple!(
many0!(Attribute::parse_inner),
call!(Block::parse_within)
diff --git a/tests/test_derive_input.rs b/tests/test_derive_input.rs
index fe9ef0c..4462b1c 100644
--- a/tests/test_derive_input.rs
+++ b/tests/test_derive_input.rs
@@ -221,7 +221,7 @@
}),
].into(),
gt_token: Some(Default::default()),
- where_clause: WhereClause::default(),
+ where_clause: None,
},
body: Body::Enum(BodyEnum {
variants: vec![
diff --git a/tests/test_generics.rs b/tests/test_generics.rs
index 0811a97..4365f33 100644
--- a/tests/test_generics.rs
+++ b/tests/test_generics.rs
@@ -56,8 +56,8 @@
eq_token: Default::default(),
}),
].into(),
- where_clause: WhereClause {
- where_token: Some(Default::default()),
+ where_clause: Some(WhereClause {
+ where_token: Default::default(),
predicates: vec![
WherePredicate::BoundPredicate(WhereBoundPredicate {
bound_lifetimes: None,
@@ -77,7 +77,7 @@
].into(),
}),
].into(),
- },
+ }),
};
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();