Tuple struct patterns
diff --git a/src/expr.rs b/src/expr.rs
index c181801..9e45a64 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -879,21 +879,21 @@
|
pat_range // must be before pat_lit
|
+ pat_tuple_struct // must be before pat_ident
+ |
+ pat_mac // must be before pat_ident
+ |
pat_ident // must be before pat_path
|
pat_path
// TODO: Struct
- // TODO: TupleStruct
|
pat_tuple
- // TODO: Box
|
pat_ref
|
pat_lit
// TODO: Vec
- |
- pat_mac
));
named!(pat_mac -> Pat, map!(mac, Pat::Mac));
@@ -924,9 +924,20 @@
))
));
+ named!(pat_tuple_struct -> Pat, do_parse!(
+ path: path >>
+ tuple: pat_tuple_helper >>
+ (Pat::TupleStruct(path, tuple.0, tuple.1))
+ ));
+
named!(pat_path -> Pat, map!(qpath, |(qself, path)| Pat::Path(qself, path)));
- named!(pat_tuple -> Pat, do_parse!(
+ named!(pat_tuple -> Pat, map!(
+ pat_tuple_helper,
+ |(pats, dotdot)| Pat::Tuple(pats, dotdot)
+ ));
+
+ named!(pat_tuple_helper -> (Vec<Pat>, Option<usize>), do_parse!(
punct!("(") >>
mut elems: separated_list!(punct!(","), pat) >>
dotdot: option!(do_parse!(
@@ -942,9 +953,9 @@
Some(rest) => {
let pos = elems.len();
elems.extend(rest);
- Pat::Tuple(elems, Some(pos))
+ (elems, Some(pos))
}
- None => Pat::Tuple(elems, None),
+ None => (elems, None),
})
));
@@ -1362,7 +1373,25 @@
}
}
Pat::Struct(ref _path, ref _fields, _dots) => unimplemented!(),
- Pat::TupleStruct(ref _path, ref _pats, _dotpos) => unimplemented!(),
+ Pat::TupleStruct(ref path, ref pats, dotpos) => {
+ path.to_tokens(tokens);
+ tokens.append("(");
+ match dotpos {
+ Some(pos) => {
+ if pos > 0 {
+ tokens.append_separated(&pats[..pos], ",");
+ tokens.append(",");
+ }
+ tokens.append("..");
+ if pos < pats.len() {
+ tokens.append(",");
+ tokens.append_separated(&pats[pos..], ",");
+ }
+ }
+ None => tokens.append_separated(pats, ","),
+ }
+ tokens.append(")");
+ }
Pat::Path(None, ref path) => path.to_tokens(tokens),
Pat::Path(Some(ref qself), ref path) => {
tokens.append("<");