Support parsing half-open ranges in patterns.
Fixes #117
diff --git a/src/expr.rs b/src/expr.rs
index 69a3389..c4fe0b4 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -290,7 +290,7 @@
/// A literal
Lit(Box<Expr>),
/// A range pattern, e.g. `1...2`
- Range(Box<Expr>, Box<Expr>),
+ Range(Box<Expr>, Box<Expr>, RangeLimits),
/// `[a, b, ..i, y, z]` is represented as:
/// `Pat::Slice(box [a, b], Some(i), box [y, z])`
Slice(Vec<Pat>, Option<Box<Pat>>, Vec<Pat>),
@@ -1141,9 +1141,9 @@
named!(pat_range -> Pat, do_parse!(
lo: pat_lit_expr >>
- punct!("...") >>
+ limits: range_limits >>
hi: pat_lit_expr >>
- (Pat::Range(Box::new(lo), Box::new(hi)))
+ (Pat::Range(Box::new(lo), Box::new(hi), limits))
));
named!(pat_lit_expr -> Expr, do_parse!(
@@ -1393,10 +1393,7 @@
}
ExprKind::Range(ref from, ref to, limits) => {
from.to_tokens(tokens);
- match limits {
- RangeLimits::HalfOpen => tokens.append(".."),
- RangeLimits::Closed => tokens.append("..."),
- }
+ limits.to_tokens(tokens);
to.to_tokens(tokens);
}
ExprKind::Path(None, ref path) => path.to_tokens(tokens),
@@ -1602,9 +1599,9 @@
target.to_tokens(tokens);
}
Pat::Lit(ref lit) => lit.to_tokens(tokens),
- Pat::Range(ref lo, ref hi) => {
+ Pat::Range(ref lo, ref hi, ref limits) => {
lo.to_tokens(tokens);
- tokens.append("...");
+ limits.to_tokens(tokens);
hi.to_tokens(tokens);
}
Pat::Slice(ref before, ref rest, ref after) => {
@@ -1630,6 +1627,15 @@
}
}
+ impl ToTokens for RangeLimits {
+ fn to_tokens(&self, tokens: &mut Tokens) {
+ match *self {
+ RangeLimits::HalfOpen => tokens.append(".."),
+ RangeLimits::Closed => tokens.append("..."),
+ }
+ }
+ }
+
impl ToTokens for FieldPat {
fn to_tokens(&self, tokens: &mut Tokens) {
if !self.is_shorthand {
diff --git a/src/fold.rs b/src/fold.rs
index 2874118..b7187f2 100644
--- a/src/fold.rs
+++ b/src/fold.rs
@@ -802,9 +802,10 @@
Box(b) => Box(b.lift(|p| folder.fold_pat(p))),
Ref(b, mutability) => Ref(b.lift(|p| folder.fold_pat(p)), mutability),
Lit(expr) => Lit(expr.lift(|e| folder.fold_expr(e))),
- Range(l, r) => {
+ Range(l, r, limits) => {
Range(l.lift(|e| folder.fold_expr(e)),
- r.lift(|e| folder.fold_expr(e)))
+ r.lift(|e| folder.fold_expr(e)),
+ limits)
}
Slice(lefts, pat, rights) => {
Slice(lefts.lift(|p| folder.fold_pat(p)),
diff --git a/src/visit.rs b/src/visit.rs
index 8c8645d..45ad8b4 100644
--- a/src/visit.rs
+++ b/src/visit.rs
@@ -632,7 +632,7 @@
Pat::Lit(ref expr) => {
visitor.visit_expr(expr);
}
- Pat::Range(ref start, ref end) => {
+ Pat::Range(ref start, ref end, _) => {
visitor.visit_expr(start);
visitor.visit_expr(end);
}