diff options
| author | Paul Stansifer <paul.stansifer@gmail.com> | 2012-11-12 23:06:55 -0500 |
|---|---|---|
| committer | Graydon Hoare <graydon@mozilla.com> | 2012-11-29 12:09:10 -0800 |
| commit | ee076f63f910fe2b132904ad05d0cda178ff1ec6 (patch) | |
| tree | 5417b8bffa8cf084c9ece9ae0ad4a6f6e0817e4a /src/libsyntax | |
| parent | fca52554e7e3b3eff0aaf8686fe4616628577ade (diff) | |
| download | rust-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.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/ast_util.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax/parse/classify.rs | 21 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 3 |
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) } } |
