about summary refs log tree commit diff
path: root/src/comp/syntax
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-12-21 14:31:31 -0800
committerGraydon Hoare <graydon@mozilla.com>2011-12-21 14:31:31 -0800
commit8d9e7deab5fd509160d60c33f2c7fb83acde9366 (patch)
treef4c2c91b66c07c90ab3d855d3f4cc687cd63eb98 /src/comp/syntax
parent66856a39b38b1ded0200e57c713c39ecf3dcc192 (diff)
downloadrust-8d9e7deab5fd509160d60c33f2c7fb83acde9366.tar.gz
rust-8d9e7deab5fd509160d60c33f2c7fb83acde9366.zip
Switch log_expr to carrying a full expr:u32 for level. Add log_full variant that parses that expr, prepare for snapshot.
Diffstat (limited to 'src/comp/syntax')
-rw-r--r--src/comp/syntax/ast.rs2
-rw-r--r--src/comp/syntax/fold.rs3
-rw-r--r--src/comp/syntax/parse/parser.rs21
-rw-r--r--src/comp/syntax/print/pprust.rs19
-rw-r--r--src/comp/syntax/visit.rs5
5 files changed, 38 insertions, 12 deletions
diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs
index ed9349166ed..a7b856d3578 100644
--- a/src/comp/syntax/ast.rs
+++ b/src/comp/syntax/ast.rs
@@ -247,7 +247,7 @@ tag expr_ {
     expr_cont;
     expr_ret(option::t<@expr>);
     expr_be(@expr);
-    expr_log(int, @expr);
+    expr_log(int, @expr, @expr);
 
     /* just an assert, no significance to typestate */
     expr_assert(@expr);
diff --git a/src/comp/syntax/fold.rs b/src/comp/syntax/fold.rs
index c3caa56a9e4..ce9e237aeff 100644
--- a/src/comp/syntax/fold.rs
+++ b/src/comp/syntax/fold.rs
@@ -424,7 +424,8 @@ fn noop_fold_expr(e: expr_, fld: ast_fold) -> expr_ {
           expr_cont. { e }
           expr_ret(e) { expr_ret(option::map(e, fld.fold_expr)) }
           expr_be(e) { expr_be(fld.fold_expr(e)) }
-          expr_log(lv, e) { expr_log(lv, fld.fold_expr(e)) }
+          expr_log(i, lv, e) { expr_log(i, fld.fold_expr(lv),
+                                        fld.fold_expr(e)) }
           expr_assert(e) { expr_assert(fld.fold_expr(e)) }
           expr_check(m, e) { expr_check(m, fld.fold_expr(e)) }
           expr_if_check(cond, tr, fl) {
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index 0a436a521c9..0b19ec47918 100644
--- a/src/comp/syntax/parse/parser.rs
+++ b/src/comp/syntax/parse/parser.rs
@@ -165,7 +165,8 @@ fn bad_expr_word_table() -> hashmap<str, ()> {
                  "cont", "ret", "be", "fail", "type", "resource", "check",
                  "assert", "claim", "native", "fn", "lambda", "pure",
                  "unsafe", "block", "import", "export", "let", "const",
-                 "log", "log_err", "tag", "obj", "copy", "sendfn", "impl"] {
+                 "log", "log_err", "log_full",
+                 "tag", "obj", "copy", "sendfn", "impl"] {
         words.insert(word, ());
     }
     words
@@ -758,6 +759,15 @@ fn is_bar(t: token::token) -> bool {
     alt t { token::BINOP(token::OR.) | token::OROR. { true } _ { false } }
 }
 
+fn mk_lit_u32(p: parser, i: u32) -> @ast::expr {
+    let span = p.get_span();
+
+    let lv_lit = @{node: ast::lit_uint(i as u64, ast::ty_u32),
+                   span: span};
+
+    ret @{id: p.get_id(), node: ast::expr_lit(lv_lit), span: span};
+}
+
 fn parse_bottom_expr(p: parser) -> @ast::expr {
     let lo = p.get_lo_pos();
     let hi = p.get_hi_pos();
@@ -899,13 +909,18 @@ fn parse_bottom_expr(p: parser) -> @ast::expr {
             hi = e.span.hi;
             ex = ast::expr_fail(some(e));
         } else { ex = ast::expr_fail(none); }
+    } else if eat_word(p, "log_full") {
+        let e = parse_expr(p);
+        let lvl = parse_expr(p);
+        ex = ast::expr_log(2, lvl, e);
+        hi = e.span.hi;
     } else if eat_word(p, "log") {
         let e = parse_expr(p);
-        ex = ast::expr_log(1, e);
+        ex = ast::expr_log(1, mk_lit_u32(p, 1u32), e);
         hi = e.span.hi;
     } else if eat_word(p, "log_err") {
         let e = parse_expr(p);
-        ex = ast::expr_log(0, e);
+        ex = ast::expr_log(0, mk_lit_u32(p, 0u32), e);
         hi = e.span.hi;
     } else if eat_word(p, "assert") {
         let e = parse_expr(p);
diff --git a/src/comp/syntax/print/pprust.rs b/src/comp/syntax/print/pprust.rs
index 4ac884171b3..eef84757b8a 100644
--- a/src/comp/syntax/print/pprust.rs
+++ b/src/comp/syntax/print/pprust.rs
@@ -913,9 +913,16 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
         }
       }
       ast::expr_be(result) { word_nbsp(s, "be"); print_expr(s, result); }
-      ast::expr_log(lvl, expr) {
-        alt lvl { 1 { word_nbsp(s, "log"); } 0 { word_nbsp(s, "log_err"); } }
-        print_expr(s, expr);
+      ast::expr_log(lvl, lexp, expr) {
+        alt lvl {
+          1 { word_nbsp(s, "log"); print_expr(s, expr); }
+          0 { word_nbsp(s, "log_err"); print_expr(s, expr); }
+          2 {
+            word_nbsp(s, "log_full");
+            word(s.s, " ");
+            print_expr(s, lexp);
+          }
+        }
       }
       ast::expr_check(m, expr) {
         alt m {
@@ -990,7 +997,7 @@ fn print_expr_parens_if_not_bot(s: ps, ex: @ast::expr) {
       ast::expr_ternary(_, _, _) | ast::expr_move(_, _) |
       ast::expr_copy(_) | ast::expr_assign(_, _) | ast::expr_be(_) |
       ast::expr_assign_op(_, _, _) | ast::expr_swap(_, _) |
-      ast::expr_log(_, _) | ast::expr_assert(_) |
+      ast::expr_log(_, _, _) | ast::expr_assert(_) |
       ast::expr_check(_, _) { true }
       _ { false }
     };
@@ -1305,7 +1312,7 @@ fn need_parens(expr: @ast::expr, outer_prec: int) -> bool {
       ast::expr_be(_) { true }
       ast::expr_assert(_) { true }
       ast::expr_check(_, _) { true }
-      ast::expr_log(_, _) { true }
+      ast::expr_log(_, _, _) { true }
       _ { false }
     }
 }
@@ -1644,7 +1651,7 @@ fn ends_in_lit_int(ex: @ast::expr) -> bool {
       ast::expr_ternary(_, _, sub) | ast::expr_move(_, sub) |
       ast::expr_copy(sub) | ast::expr_assign(_, sub) | ast::expr_be(sub) |
       ast::expr_assign_op(_, _, sub) | ast::expr_swap(_, sub) |
-      ast::expr_log(_, sub) | ast::expr_assert(sub) |
+      ast::expr_log(_, _, sub) | ast::expr_assert(sub) |
       ast::expr_check(_, sub) { ends_in_lit_int(sub) }
       ast::expr_fail(osub) | ast::expr_ret(osub) {
         alt osub {
diff --git a/src/comp/syntax/visit.rs b/src/comp/syntax/visit.rs
index be3769a4ba1..e02193c2cd1 100644
--- a/src/comp/syntax/visit.rs
+++ b/src/comp/syntax/visit.rs
@@ -333,7 +333,10 @@ fn visit_expr<E>(ex: @expr, e: E, v: vt<E>) {
       expr_cont. { }
       expr_ret(eo) { visit_expr_opt(eo, e, v); }
       expr_be(x) { v.visit_expr(x, e, v); }
-      expr_log(_, x) { v.visit_expr(x, e, v); }
+      expr_log(_, lv, x) {
+        v.visit_expr(lv, e, v);
+        v.visit_expr(x, e, v);
+      }
       expr_check(_, x) { v.visit_expr(x, e, v); }
       expr_assert(x) { v.visit_expr(x, e, v); }
       expr_anon_obj(anon_obj) {