about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2012-09-07 17:07:32 -0700
committerTim Chevalier <chevalier@alum.wellesley.edu>2012-09-07 17:09:07 -0700
commit53ce42dc4f4fceaf6881a3026f3dbc8fd81ae626 (patch)
treefe06630b44b10afc5708cbebdacb9f8471580ab3 /src/libsyntax
parente9f5a099dfcb42c7f2bb38974b57bbde7042ee9c (diff)
downloadrust-53ce42dc4f4fceaf6881a3026f3dbc8fd81ae626.tar.gz
rust-53ce42dc4f4fceaf6881a3026f3dbc8fd81ae626.zip
Implement &-patterns
Closes #2855
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ast.rs1
-rw-r--r--src/libsyntax/ast_util.rs2
-rw-r--r--src/libsyntax/fold.rs1
-rw-r--r--src/libsyntax/parse/parser.rs23
-rw-r--r--src/libsyntax/print/pprust.rs4
-rw-r--r--src/libsyntax/visit.rs3
6 files changed, 30 insertions, 4 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index 03106f97bc7..b1f54e701ac 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -360,6 +360,7 @@ enum pat_ {
     pat_tup(~[@pat]),
     pat_box(@pat),
     pat_uniq(@pat),
+    pat_region(@pat), // borrowed pointer pattern
     pat_lit(@expr),
     pat_range(@expr, @expr),
 }
diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs
index 1ff4728f472..429028b966e 100644
--- a/src/libsyntax/ast_util.rs
+++ b/src/libsyntax/ast_util.rs
@@ -595,7 +595,7 @@ fn walk_pat(pat: @pat, it: fn(@pat)) {
       pat_enum(_, Some(s)) | pat_tup(s) => for s.each |p| {
         walk_pat(p, it)
       },
-      pat_box(s) | pat_uniq(s) => walk_pat(s, it),
+      pat_box(s) | pat_uniq(s) | pat_region(s) => walk_pat(s, it),
       pat_wild | pat_lit(_) | pat_range(_, _) | pat_ident(_, _, _)
         | pat_enum(_, _) => ()
     }
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index 976a57a919c..c7ce86921f6 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -384,6 +384,7 @@ fn noop_fold_pat(p: pat_, fld: ast_fold) -> pat_ {
           pat_tup(elts) => pat_tup(vec::map(elts, |x| fld.fold_pat(x))),
           pat_box(inner) => pat_box(fld.fold_pat(inner)),
           pat_uniq(inner) => pat_uniq(fld.fold_pat(inner)),
+          pat_region(inner) => pat_region(fld.fold_pat(inner)),
           pat_range(e1, e2) => {
             pat_range(fld.fold_expr(e1), fld.fold_expr(e2))
           }
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 175247bfaf3..a21d9de7567 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -42,8 +42,8 @@ use ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
              mac_invoc_tt, mac_var, matcher, match_nonterminal, match_seq,
              match_tok, method, mode, module_ns, mt, mul, mutability,
              named_field, neg, noreturn, not, pat, pat_box, pat_enum,
-             pat_ident, pat_lit, pat_range, pat_rec, pat_struct, pat_tup,
-             pat_uniq, pat_wild, path, private, proto, proto_bare,
+             pat_ident, pat_lit, pat_range, pat_rec, pat_region, pat_struct,
+             pat_tup, pat_uniq, pat_wild, path, private, proto, proto_bare,
              proto_block, proto_box, proto_uniq, provided, public, pure_fn,
              purity, re_anon, re_named, region, rem, required, ret_style,
              return_val, self_ty, shl, shr, stmt, stmt_decl, stmt_expr,
@@ -1844,6 +1844,25 @@ struct parser {
             };
 
           }
+          token::BINOP(token::AND) => {
+              let lo = self.span.lo;
+              self.bump();
+              let sub = self.parse_pat(refutable);
+              hi = sub.span.hi;
+              // HACK: parse &"..." as a literal of a borrowed str
+              pat = match sub.node {
+                  pat_lit(e@@{
+                      node: expr_lit(@{node: lit_str(_), span: _}), _
+                  }) => {
+                      let vst = @{id: self.get_id(), callee_id: self.get_id(),
+                                  node: expr_vstore(e, 
+                                          vstore_slice(self.region_from_name(None))),
+                                  span: mk_sp(lo, hi)};
+                      pat_lit(vst)
+                  }
+              _ => pat_region(sub)
+              };
+          }
           token::LBRACE => {
             self.bump();
             let (fields, etc) = self.parse_pat_fields(refutable);
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index 8b17760c7f2..451d5be1a50 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -1537,6 +1537,10 @@ fn print_pat(s: ps, &&pat: @ast::pat) {
       }
       ast::pat_box(inner) => { word(s.s, ~"@"); print_pat(s, inner); }
       ast::pat_uniq(inner) => { word(s.s, ~"~"); print_pat(s, inner); }
+      ast::pat_region(inner) => {
+          word(s.s, ~"&");
+          print_pat(s, inner);
+      }
       ast::pat_lit(e) => print_expr(s, e),
       ast::pat_range(begin, end) => {
         print_expr(s, begin);
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index 410108bb8ce..ffe97197f6f 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -237,7 +237,8 @@ fn visit_pat<E>(p: @pat, e: E, v: vt<E>) {
       pat_tup(elts) => for elts.each |elt| {
         v.visit_pat(elt, e, v)
       },
-      pat_box(inner) | pat_uniq(inner) => v.visit_pat(inner, e, v),
+      pat_box(inner) | pat_uniq(inner) | pat_region(inner) =>
+          v.visit_pat(inner, e, v),
       pat_ident(_, path, inner) => {
           visit_path(path, e, v);
           do option::iter(inner) |subpat| { v.visit_pat(subpat, e, v)};