Fix placement of where-clause in tuple structs
diff --git a/src/data.rs b/src/data.rs
index 9e8e9b4..26367dd 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -51,24 +51,40 @@
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
+ use WhereClause;
use attr::parsing::outer_attr;
use constant::parsing::const_expr;
+ use generics::parsing::where_clause;
use ident::parsing::ident;
use ty::parsing::ty;
- named!(pub struct_body -> VariantData, alt!(
- struct_like_body => { VariantData::Struct }
+ named!(pub struct_body -> (WhereClause, VariantData), alt!(
+ do_parse!(
+ wh: where_clause >>
+ body: struct_like_body >>
+ (wh, VariantData::Struct(body))
+ )
|
- terminated!(tuple_like_body, punct!(";")) => { VariantData::Tuple }
+ do_parse!(
+ body: tuple_like_body >>
+ wh: where_clause >>
+ punct!(";") >>
+ (wh, VariantData::Tuple(body))
+ )
|
- punct!(";") => { |_| VariantData::Unit }
+ do_parse!(
+ wh: where_clause >>
+ punct!(";") >>
+ (wh, VariantData::Unit)
+ )
));
- named!(pub enum_body -> Vec<Variant>, do_parse!(
+ named!(pub enum_body -> (WhereClause, Vec<Variant>), do_parse!(
+ wh: where_clause >>
punct!("{") >>
variants: terminated_list!(punct!(","), variant) >>
punct!("}") >>
- (variants)
+ (wh, variants)
));
named!(variant -> Variant, do_parse!(
diff --git a/src/item.rs b/src/item.rs
index 3feed24..a140f8e 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -1102,14 +1102,21 @@
tokens.append("struct");
self.ident.to_tokens(tokens);
generics.to_tokens(tokens);
- generics.where_clause.to_tokens(tokens);
- variant_data.to_tokens(tokens);
match *variant_data {
VariantData::Struct(_) => {
+ generics.where_clause.to_tokens(tokens);
+ variant_data.to_tokens(tokens);
// no semicolon
}
- VariantData::Tuple(_) |
- VariantData::Unit => tokens.append(";"),
+ VariantData::Tuple(_) => {
+ variant_data.to_tokens(tokens);
+ generics.where_clause.to_tokens(tokens);
+ tokens.append(";");
+ }
+ VariantData::Unit => {
+ generics.where_clause.to_tokens(tokens);
+ tokens.append(";");
+ }
}
}
ItemKind::Union(ref variant_data, ref generics) => {
diff --git a/src/macro_input.rs b/src/macro_input.rs
index 00a31e1..3abdc3d 100644
--- a/src/macro_input.rs
+++ b/src/macro_input.rs
@@ -21,7 +21,7 @@
use Generics;
use attr::parsing::outer_attr;
use data::parsing::{visibility, struct_body, enum_body};
- use generics::parsing::{generics, where_clause};
+ use generics::parsing::generics;
use ident::parsing::ident;
named!(pub macro_input -> MacroInput, do_parse!(
@@ -30,25 +30,24 @@
which: alt!(keyword!("struct") | keyword!("enum")) >>
id: ident >>
generics: generics >>
- where_clause: where_clause >>
item: switch!(value!(which),
- "struct" => map!(struct_body, move |body| MacroInput {
+ "struct" => map!(struct_body, move |(wh, body)| MacroInput {
ident: id,
vis: vis,
attrs: attrs,
generics: Generics {
- where_clause: where_clause,
+ where_clause: wh,
.. generics
},
body: Body::Struct(body),
})
|
- "enum" => map!(enum_body, move |body| MacroInput {
+ "enum" => map!(enum_body, move |(wh, body)| MacroInput {
ident: id,
vis: vis,
attrs: attrs,
generics: Generics {
- where_clause: where_clause,
+ where_clause: wh,
.. generics
},
body: Body::Enum(body),
@@ -77,15 +76,9 @@
}
self.ident.to_tokens(tokens);
self.generics.to_tokens(tokens);
- self.generics.where_clause.to_tokens(tokens);
- self.body.to_tokens(tokens);
- }
- }
-
- impl ToTokens for Body {
- fn to_tokens(&self, tokens: &mut Tokens) {
- match *self {
+ match self.body {
Body::Enum(ref variants) => {
+ self.generics.where_clause.to_tokens(tokens);
tokens.append("{");
for variant in variants {
variant.to_tokens(tokens);
@@ -94,13 +87,21 @@
tokens.append("}");
}
Body::Struct(ref variant_data) => {
- variant_data.to_tokens(tokens);
match *variant_data {
VariantData::Struct(_) => {
+ self.generics.where_clause.to_tokens(tokens);
+ variant_data.to_tokens(tokens);
// no semicolon
}
- VariantData::Tuple(_) |
- VariantData::Unit => tokens.append(";"),
+ VariantData::Tuple(_) => {
+ variant_data.to_tokens(tokens);
+ self.generics.where_clause.to_tokens(tokens);
+ tokens.append(";");
+ }
+ VariantData::Unit => {
+ self.generics.where_clause.to_tokens(tokens);
+ tokens.append(";");
+ }
}
}
}