diff options
| author | Jared Roesch <roeschinc@gmail.com> | 2014-12-20 02:48:43 -0800 |
|---|---|---|
| committer | Jared Roesch <roeschinc@gmail.com> | 2014-12-20 03:54:39 -0800 |
| commit | d87b308b67ab070d67ab66062b33f64e5bc621e4 (patch) | |
| tree | 13fa47333d28c9926b8a26718f355250ad20247d /src/libsyntax | |
| parent | e0cac488ac6ca16507da390429565b7879f76bb4 (diff) | |
| download | rust-d87b308b67ab070d67ab66062b33f64e5bc621e4.tar.gz rust-d87b308b67ab070d67ab66062b33f64e5bc621e4.zip | |
Add support for multiple region bounds in where clauses
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax/ext/deriving/generic/mod.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 11 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 7 |
6 files changed, 21 insertions, 14 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 13ea5da66c8..440e11e385f 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -430,11 +430,9 @@ pub struct WhereBoundPredicate { pub struct WhereRegionPredicate { pub span: Span, pub lifetime: Lifetime, - pub bound: Lifetime + pub bounds: Vec<Lifetime>, } -impl Copy for WhereRegionPredicate {} - #[deriving(Clone, PartialEq, Eq, Encodable, Decodable, Hash, Show)] pub struct WhereEqPredicate { pub id: NodeId, diff --git a/src/libsyntax/ext/deriving/generic/mod.rs b/src/libsyntax/ext/deriving/generic/mod.rs index c40ccaa31a5..d8de3d2db97 100644 --- a/src/libsyntax/ext/deriving/generic/mod.rs +++ b/src/libsyntax/ext/deriving/generic/mod.rs @@ -435,7 +435,7 @@ impl<'a> TraitDef<'a> { ast::WherePredicate::RegionPredicate(ast::WhereRegionPredicate { span: self.span, lifetime: rb.lifetime, - bound: rb.bound + bounds: rb.bounds.iter().map(|b| b.clone()).collect() }) } ast::WherePredicate::EqPredicate(ref we) => { diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index dd1e8b73f36..86df5883864 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -824,12 +824,12 @@ pub fn noop_fold_where_predicate<T: Folder>( }) } ast::WherePredicate::RegionPredicate(ast::WhereRegionPredicate{lifetime, - bound, + bounds, span}) => { ast::WherePredicate::RegionPredicate(ast::WhereRegionPredicate { span: fld.new_span(span), lifetime: fld.fold_lifetime(lifetime), - bound: fld.fold_lifetime(bound) + bounds: bounds.move_map(|bound| fld.fold_lifetime(bound)) }) } ast::WherePredicate::EqPredicate(ast::WhereEqPredicate{id, diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 64bcf7dbdd1..f8b47e0405f 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4199,9 +4199,8 @@ impl<'a> Parser<'a> { self.eat(&token::Colon); - // FIXME(#20049) - let bounding_lifetime = - self.parse_lifetime(); + let bounds = + self.parse_lifetimes(token::BinOp(token::Plus)); let hi = self.span.hi; let span = mk_sp(lo, hi); @@ -4210,7 +4209,7 @@ impl<'a> Parser<'a> { ast::WhereRegionPredicate { span: span, lifetime: bounded_lifetime, - bound: bounding_lifetime + bounds: bounds } )); diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index d619a386664..f27a476dbdd 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -2444,11 +2444,18 @@ impl<'a> State<'a> { try!(self.print_bounds(":", bounds.as_slice())); } &ast::WherePredicate::RegionPredicate(ast::WhereRegionPredicate{ref lifetime, - ref bound, + ref bounds, ..}) => { try!(self.print_lifetime(lifetime)); try!(word(&mut self.s, ":")); - try!(self.print_lifetime(bound)); + + for (i, bound) in bounds.iter().enumerate() { + try!(self.print_lifetime(bound)); + + if i != 0 { + try!(word(&mut self.s, ":")); + } + } } &ast::WherePredicate::EqPredicate(ast::WhereEqPredicate{ref path, ref ty, ..}) => { try!(self.print_path(path, false)); diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index c2a7a0316c7..9938feb171e 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -590,10 +590,13 @@ pub fn walk_generics<'v, V: Visitor<'v>>(visitor: &mut V, generics: &'v Generics walk_ty_param_bounds_helper(visitor, bounds); } &ast::WherePredicate::RegionPredicate(ast::WhereRegionPredicate{ref lifetime, - ref bound, + ref bounds, ..}) => { visitor.visit_lifetime_ref(lifetime); - visitor.visit_lifetime_ref(bound); + + for bound in bounds.iter() { + visitor.visit_lifetime_ref(bound); + } } &ast::WherePredicate::EqPredicate(ast::WhereEqPredicate{id, ref path, |
