about summary refs log tree commit diff
path: root/src/comp/syntax
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-08-15 15:35:40 -0700
committerGraydon Hoare <graydon@mozilla.com>2011-08-15 15:44:41 -0700
commit814bf41d898cd0410873f6c05c03a2b34366bfde (patch)
treec281eaf689a64894ca2ac50ab00d69db4394d570 /src/comp/syntax
parent9ca8df93b318aa4dc721a187f1216ac7f3a6671b (diff)
downloadrust-814bf41d898cd0410873f6c05c03a2b34366bfde.tar.gz
rust-814bf41d898cd0410873f6c05c03a2b34366bfde.zip
Add operator 'copy', translates as fall-through.
Diffstat (limited to 'src/comp/syntax')
-rw-r--r--src/comp/syntax/ast.rs1
-rw-r--r--src/comp/syntax/fold.rs3
-rw-r--r--src/comp/syntax/parse/parser.rs5
-rw-r--r--src/comp/syntax/print/pprust.rs4
-rw-r--r--src/comp/syntax/visit.rs1
5 files changed, 14 insertions, 0 deletions
diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs
index b997b084e87..82ca1772c73 100644
--- a/src/comp/syntax/ast.rs
+++ b/src/comp/syntax/ast.rs
@@ -317,6 +317,7 @@ tag expr_ {
      * FIXME: many of these @exprs should be constrained with
      * is_lval once we have constrained types working.
      */
+    expr_copy(@expr);
     expr_move(@expr, @expr);
     expr_assign(@expr, @expr);
     expr_swap(@expr, @expr);
diff --git a/src/comp/syntax/fold.rs b/src/comp/syntax/fold.rs
index 7e5bbf41493..806d72499aa 100644
--- a/src/comp/syntax/fold.rs
+++ b/src/comp/syntax/fold.rs
@@ -397,6 +397,9 @@ fn noop_fold_expr(e: &expr_, fld: ast_fold) -> expr_ {
           expr_move(el, er) {
             expr_move(fld.fold_expr(el), fld.fold_expr(er))
           }
+          expr_copy(e) {
+            expr_copy(fld.fold_expr(e))
+          }
           expr_assign(el, er) {
             expr_assign(fld.fold_expr(el), fld.fold_expr(er))
           }
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index 19f058d7ee2..86d61ba1f94 100644
--- a/src/comp/syntax/parse/parser.rs
+++ b/src/comp/syntax/parse/parser.rs
@@ -180,6 +180,7 @@ fn bad_expr_word_table() -> hashmap[str, ()] {
     words.insert("log_err", ());
     words.insert("tag", ());
     words.insert("obj", ());
+    words.insert("copy", ());
     ret words;
 }
 
@@ -999,6 +1000,10 @@ fn parse_bottom_expr(p: &parser) -> @ast::expr {
         hi = e.span.hi;
         expect(p, token::RPAREN);
         ex = ast::expr_chan(e);
+    } else if (eat_word(p, "copy")) {
+        let e = parse_expr(p);
+        ex = ast::expr_copy(e);
+        hi = e.span.hi;
     } else if (eat_word(p, "self")) {
         log "parsing a self-call...";
         expect(p, token::DOT);
diff --git a/src/comp/syntax/print/pprust.rs b/src/comp/syntax/print/pprust.rs
index 59781bdbfba..3835435777f 100644
--- a/src/comp/syntax/print/pprust.rs
+++ b/src/comp/syntax/print/pprust.rs
@@ -881,6 +881,10 @@ fn print_expr(s: &ps, expr: &@ast::expr) {
         ibox(s, 0u);
         print_block(s, blk);
       }
+      ast::expr_copy(e) {
+        word_space(s, "copy");
+        print_expr(s, e);
+      }
       ast::expr_move(lhs, rhs) {
         print_expr(s, lhs);
         space(s.s);
diff --git a/src/comp/syntax/visit.rs b/src/comp/syntax/visit.rs
index e0a5bebd256..2f366621c28 100644
--- a/src/comp/syntax/visit.rs
+++ b/src/comp/syntax/visit.rs
@@ -299,6 +299,7 @@ fn visit_expr[E](ex: &@expr, e: &E, v: &vt[E]) {
       expr_fn(f) { v.visit_fn(f, ~[], ex.span, none, ex.id, e, v); }
       expr_block(b) { v.visit_block(b, e, v); }
       expr_assign(a, b) { v.visit_expr(b, e, v); v.visit_expr(a, e, v); }
+      expr_copy(a) { v.visit_expr(a, e, v); }
       expr_move(a, b) { v.visit_expr(b, e, v); v.visit_expr(a, e, v); }
       expr_swap(a, b) { v.visit_expr(a, e, v); v.visit_expr(b, e, v); }
       expr_assign_op(_, a, b) {