about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorPaul Stansifer <paul.stansifer@gmail.com>2012-11-12 23:06:55 -0500
committerGraydon Hoare <graydon@mozilla.com>2012-11-29 12:09:10 -0800
commitee076f63f910fe2b132904ad05d0cda178ff1ec6 (patch)
tree5417b8bffa8cf084c9ece9ae0ad4a6f6e0817e4a /src/libsyntax
parentfca52554e7e3b3eff0aaf8686fe4616628577ade (diff)
downloadrust-ee076f63f910fe2b132904ad05d0cda178ff1ec6.tar.gz
rust-ee076f63f910fe2b132904ad05d0cda178ff1ec6.zip
Allow for macros to occur in statement position.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ast.rs2
-rw-r--r--src/libsyntax/ast_util.rs3
-rw-r--r--src/libsyntax/fold.rs4
-rw-r--r--src/libsyntax/parse/classify.rs21
-rw-r--r--src/libsyntax/print/pprust.rs4
-rw-r--r--src/libsyntax/visit.rs3
6 files changed, 22 insertions, 15 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index 1adcadf1b6a..bc3ae65618a 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -665,6 +665,8 @@ enum stmt_ {
 
     // expr with trailing semi-colon (may have any type):
     stmt_semi(@expr, node_id),
+
+    stmt_mac(mac),
 }
 
 // FIXME (pending discussion of #1697, #2178...): local should really be
diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs
index 12ebca87a80..e6cd413c430 100644
--- a/src/libsyntax/ast_util.rs
+++ b/src/libsyntax/ast_util.rs
@@ -39,7 +39,8 @@ pure fn stmt_id(s: stmt) -> node_id {
     match s.node {
       stmt_decl(_, id) => id,
       stmt_expr(_, id) => id,
-      stmt_semi(_, id) => id
+      stmt_semi(_, id) => id,
+      stmt_mac(_) => fail ~"attempted to analyze unexpanded stmt",
     }
 }
 
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index 1db37418370..a92c902ae3f 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -305,10 +305,12 @@ fn noop_fold_block(b: blk_, fld: ast_fold) -> blk_ {
 }
 
 fn noop_fold_stmt(s: stmt_, fld: ast_fold) -> stmt_ {
+    let fold_mac = |x| fold_mac_(x, fld);
     return match s {
       stmt_decl(d, nid) => stmt_decl(fld.fold_decl(d), fld.new_id(nid)),
       stmt_expr(e, nid) => stmt_expr(fld.fold_expr(e), fld.new_id(nid)),
-      stmt_semi(e, nid) => stmt_semi(fld.fold_expr(e), fld.new_id(nid))
+      stmt_semi(e, nid) => stmt_semi(fld.fold_expr(e), fld.new_id(nid)),
+      stmt_mac(mac) => stmt_mac(fold_mac(mac))
     };
 }
 
diff --git a/src/libsyntax/parse/classify.rs b/src/libsyntax/parse/classify.rs
index 2f3e29bd90f..0d370525d17 100644
--- a/src/libsyntax/parse/classify.rs
+++ b/src/libsyntax/parse/classify.rs
@@ -21,18 +21,15 @@ fn expr_is_simple_block(e: @ast::expr) -> bool {
 }
 
 fn stmt_ends_with_semi(stmt: ast::stmt) -> bool {
-    match stmt.node {
-      ast::stmt_decl(d, _) => {
-        return match d.node {
-              ast::decl_local(_) => true,
-              ast::decl_item(_) => false
+    return match stmt.node {
+        ast::stmt_decl(d, _) => {
+            match d.node {
+                ast::decl_local(_) => true,
+                ast::decl_item(_) => false
             }
-      }
-      ast::stmt_expr(e, _) => {
-        return expr_requires_semi_to_be_stmt(e);
-      }
-      ast::stmt_semi(*) => {
-        return false;
-      }
+        }
+        ast::stmt_expr(e, _) => { expr_requires_semi_to_be_stmt(e) }
+        ast::stmt_semi(*) => { false }
+        ast::stmt_mac(*) => { false }
     }
 }
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index f525436cc3e..b55eec80a93 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -882,6 +882,10 @@ fn print_stmt(s: ps, st: ast::stmt) {
         print_expr(s, expr);
         word(s.s, ~";");
       }
+      ast::stmt_mac(mac) => {
+        space_if_not_bol(s);
+        print_mac(s, mac);
+      }
     }
     if parse::classify::stmt_ends_with_semi(st) { word(s.s, ~";"); }
     maybe_print_trailing_comment(s, st.span, None);
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index afd928a9fbc..ca2af67771e 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -347,7 +347,8 @@ fn visit_stmt<E>(s: @stmt, e: E, v: vt<E>) {
     match s.node {
       stmt_decl(d, _) => v.visit_decl(d, e, v),
       stmt_expr(ex, _) => v.visit_expr(ex, e, v),
-      stmt_semi(ex, _) => v.visit_expr(ex, e, v)
+      stmt_semi(ex, _) => v.visit_expr(ex, e, v),
+      stmt_mac(mac) => visit_mac(mac, e, v)
     }
 }