about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-08-06 17:14:32 -0700
committerBrian Anderson <banderson@mozilla.com>2012-08-07 12:23:43 -0700
commit2772b2e5c7f85e230bcae13c49eb1386afc6cd0e (patch)
tree6161076f339dc2adeffcfbc8bcb6e86882b7b16d /src/libsyntax
parentabf4421e7c2fce4e768eb20c126989501081f4f9 (diff)
downloadrust-2772b2e5c7f85e230bcae13c49eb1386afc6cd0e.tar.gz
rust-2772b2e5c7f85e230bcae13c49eb1386afc6cd0e.zip
syntax: Make match arm parsing more restrictive again
Require comma separators for all expression types except the plain block
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ast_map.rs2
-rw-r--r--src/libsyntax/ast_util.rs8
-rw-r--r--src/libsyntax/attr.rs8
-rw-r--r--src/libsyntax/ext/base.rs6
-rw-r--r--src/libsyntax/ext/fmt.rs10
-rw-r--r--src/libsyntax/ext/qquote.rs4
-rw-r--r--src/libsyntax/ext/simplext.rs8
-rw-r--r--src/libsyntax/ext/tt/earley_parser.rs4
-rw-r--r--src/libsyntax/parse/classify.rs11
-rw-r--r--src/libsyntax/parse/parser.rs6
-rw-r--r--src/libsyntax/print/pprust.rs6
-rw-r--r--src/libsyntax/visit.rs14
12 files changed, 47 insertions, 40 deletions
diff --git a/src/libsyntax/ast_map.rs b/src/libsyntax/ast_map.rs
index 2c774abff57..acd62b6a536 100644
--- a/src/libsyntax/ast_map.rs
+++ b/src/libsyntax/ast_map.rs
@@ -270,7 +270,7 @@ fn map_view_item(vi: @view_item, cx: ctx, _v: vt) {
           }
         };
         cx.map.insert(id, node_export(vp, extend(cx, name)));
-      }
+      },
       _ => ()
     }
 }
diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs
index 45556e941d4..deb8bb5963d 100644
--- a/src/libsyntax/ast_util.rs
+++ b/src/libsyntax/ast_util.rs
@@ -192,7 +192,7 @@ fn is_exported(i: ident, m: _mod) -> bool {
                 local = true;
                 parent_enum = some(/* FIXME (#2543) */ copy it.ident);
             }
-          }
+          },
           _ => ()
         }
         if local { break; }
@@ -476,7 +476,7 @@ fn id_visitor(vfn: fn@(node_id)) -> visit::vt<()> {
         visit_item: fn@(i: @item) {
             vfn(i.id);
             match i.node {
-              item_enum(vs, _) => for vs.each |v| { vfn(v.node.id); }
+              item_enum(vs, _) => for vs.each |v| { vfn(v.node.id); },
               _ => ()
             }
         },
@@ -603,10 +603,10 @@ fn walk_pat(pat: @pat, it: fn(@pat)) {
     match pat.node {
       pat_ident(_, pth, some(p)) => walk_pat(p, it),
       pat_rec(fields, _) | pat_struct(_, fields, _) =>
-        for fields.each |f| { walk_pat(f.pat, it) }
+        for fields.each |f| { walk_pat(f.pat, it) },
       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_wild | pat_lit(_) | pat_range(_, _) | pat_ident(_, _, _)
         | pat_enum(_, _) => ()
diff --git a/src/libsyntax/attr.rs b/src/libsyntax/attr.rs
index 0838a1a70d9..65c2e00faca 100644
--- a/src/libsyntax/attr.rs
+++ b/src/libsyntax/attr.rs
@@ -130,7 +130,7 @@ fn get_meta_item_value_str(meta: @ast::meta_item) -> option<@~str> {
       ast::meta_name_value(_, v) => match v.node {
         ast::lit_str(s) => option::some(s),
         _ => option::none
-      }
+      },
       _ => option::none
     }
 }
@@ -207,11 +207,11 @@ fn eq(a: @ast::meta_item, b: @ast::meta_item) -> bool {
           ast::meta_word(na) => match b.node {
             ast::meta_word(nb) => na == nb,
             _ => false
-          }
+          },
           ast::meta_name_value(na, va) => match b.node {
             ast::meta_name_value(nb, vb) => na == nb && va.node == vb.node,
             _ => false
-          }
+          },
           ast::meta_list(na, la) => {
 
             // ~[Fixme-sorting]
@@ -257,7 +257,7 @@ fn last_meta_item_value_str_by_name(
       some(item) => match attr::get_meta_item_value_str(item) {
         some(value) => some(value),
         none => none
-      }
+      },
       none => none
     }
 }
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs
index 79ef81f78c1..0f163e73c81 100644
--- a/src/libsyntax/ext/base.rs
+++ b/src/libsyntax/ext/base.rs
@@ -214,7 +214,7 @@ fn expr_to_str(cx: ext_ctxt, expr: @ast::expr, error: ~str) -> ~str {
       ast::expr_lit(l) => match l.node {
         ast::lit_str(s) => return *s,
         _ => cx.span_fatal(l.span, error)
-      }
+      },
       _ => cx.span_fatal(expr.span, error)
     }
 }
@@ -257,7 +257,7 @@ fn get_mac_args(cx: ext_ctxt, sp: span, arg: ast::mac_arg,
         _ => {
             cx.span_fatal(sp, fmt!{"#%s: malformed invocation", name})
           }
-      }
+      },
       none => cx.span_fatal(sp, fmt!{"#%s: missing arguments", name})
     }
 }
@@ -302,7 +302,7 @@ fn tt_args_to_original_flavor(cx: ext_ctxt, sp: span, arg: ~[ast::token_tree])
               }
               _ => fail ~"badly-structured parse result"
             }
-          }
+          },
           _ => fail ~"badly-structured parse result"
         };
 
diff --git a/src/libsyntax/ext/fmt.rs b/src/libsyntax/ext/fmt.rs
index 19b5fefc1cf..f8966196749 100644
--- a/src/libsyntax/ext/fmt.rs
+++ b/src/libsyntax/ext/fmt.rs
@@ -84,7 +84,7 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span,
               ty_hex(c) => match c {
                 case_upper => rt_type = ~"ty_hex_upper",
                 case_lower => rt_type = ~"ty_hex_lower"
-              }
+              },
               ty_bits => rt_type = ~"ty_bits",
               ty_octal => rt_type = ~"ty_octal",
               _ => rt_type = ~"ty_default"
@@ -125,7 +125,7 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span,
               ty_int(s) => match s {
                 signed => return true,
                 unsigned => return false
-              }
+              },
               ty_float => return true,
               _ => return false
             }
@@ -173,7 +173,7 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span,
             unsigned => {
                 return make_conv_call(cx, arg.span, ~"uint", cnv, arg)
             }
-          }
+          },
           ty_bool => return make_conv_call(cx, arg.span, ~"bool", cnv, arg),
           ty_char => return make_conv_call(cx, arg.span, ~"char", cnv, arg),
           ty_hex(_) => {
@@ -224,12 +224,12 @@ fn pieces_to_expr(cx: ext_ctxt, sp: span,
           ty_int(s) => match s {
             signed => debug!{"type: signed"},
             unsigned => debug!{"type: unsigned"}
-          }
+          },
           ty_bits => debug!{"type: bits"},
           ty_hex(cs) => match cs {
             case_upper => debug!{"type: uhex"},
             case_lower => debug!{"type: lhex"},
-          }
+          },
           ty_octal => debug!{"type: octal"},
           ty_float => debug!{"type: float"},
           ty_poly => debug!{"type: poly"}
diff --git a/src/libsyntax/ext/qquote.rs b/src/libsyntax/ext/qquote.rs
index 491d6104c7b..8d219ec4395 100644
--- a/src/libsyntax/ext/qquote.rs
+++ b/src/libsyntax/ext/qquote.rs
@@ -312,7 +312,7 @@ fn replace_expr(repls: ~[fragment],
       ast::expr_mac({node: mac_var(i), _}) => match (repls[i]) {
         from_expr(r) => (r.node, r.span),
         _ => fail /* fixme error message */
-      }
+      },
       _ => orig(e,s,fld)
     }
 }
@@ -326,7 +326,7 @@ fn replace_ty(repls: ~[fragment],
       ast::ty_mac({node: mac_var(i), _}) => match (repls[i]) {
         from_ty(r) => (r.node, r.span),
         _ => fail /* fixme error message */
-      }
+      },
       _ => orig(e,s,fld)
     }
 }
diff --git a/src/libsyntax/ext/simplext.rs b/src/libsyntax/ext/simplext.rs
index bdb0c663fc7..426fea346b9 100644
--- a/src/libsyntax/ext/simplext.rs
+++ b/src/libsyntax/ext/simplext.rs
@@ -77,7 +77,7 @@ fn elts_to_ell(cx: ext_ctxt, elts: ~[@expr]) ->
                           post: vec::slice(elts, idx + 1u, vec::len(elts))});
             }
             _ => ()
-          }
+          },
           _ => ()
         }
         idx += 1u;
@@ -518,7 +518,7 @@ fn block_to_ident(blk: blk_) -> option<ident> {
           some(expr) => match expr.node {
             expr_path(pth) => path_to_ident(pth),
             _ => none
-          }
+          },
           none => none
         }
 }
@@ -530,7 +530,7 @@ fn p_t_s_r_mac(cx: ext_ctxt, mac: ast::mac, _s: selector, _b: binders) {
               match_expr(e) => match e.node {
                 expr_mac(mac) => fn_m(mac),
                 _ => none
-              }
+              },
               _ => cx.bug(~"broken traversal in p_t_s_r")
             }
     }
@@ -650,7 +650,7 @@ fn add_new_extension(cx: ext_ctxt, sp: span, arg: ast::mac_arg,
                                           ~"macro name must be " +
                                           ~"consistent");
                         }
-                      }
+                      },
                       none => cx.span_fatal(pth.span,
                                             ~"macro name must not be a path")
                     }
diff --git a/src/libsyntax/ext/tt/earley_parser.rs b/src/libsyntax/ext/tt/earley_parser.rs
index f1c7ebb7dad..d84eb3ec488 100644
--- a/src/libsyntax/ext/tt/earley_parser.rs
+++ b/src/libsyntax/ext/tt/earley_parser.rs
@@ -322,7 +322,7 @@ fn parse_nt(p: parser, name: ~str) -> nonterminal {
       ~"item" => match p.parse_item(~[]) {
         some(i) => token::nt_item(i),
         none => p.fatal(~"expected an item keyword")
-      }
+      },
       ~"block" => token::nt_block(p.parse_block()),
       ~"stmt" => token::nt_stmt(p.parse_stmt(~[])),
       ~"pat" => token::nt_pat(p.parse_pat(true)),
@@ -333,7 +333,7 @@ fn parse_nt(p: parser, name: ~str) -> nonterminal {
         token::IDENT(sn,b) => { p.bump(); token::nt_ident(sn,b) }
         _ => p.fatal(~"expected ident, found "
                      + token::to_str(*p.reader.interner(), copy p.token))
-      }
+      },
       ~"path" => token::nt_path(p.parse_path_with_tps(false)),
       ~"tt" => {
         p.quote_depth += 1u; //but in theory, non-quoted tts might be useful
diff --git a/src/libsyntax/parse/classify.rs b/src/libsyntax/parse/classify.rs
index 38599907e6f..a77c613cb60 100644
--- a/src/libsyntax/parse/classify.rs
+++ b/src/libsyntax/parse/classify.rs
@@ -13,6 +13,13 @@ fn expr_requires_semi_to_be_stmt(e: @ast::expr) -> bool {
     }
 }
 
+fn expr_is_simple_block(e: @ast::expr) -> bool {
+    match e.node {
+      ast::expr_block({node: {rules: ast::default_blk, _}, _}) => true,
+      _ => false
+    }
+}
+
 fn stmt_ends_with_semi(stmt: ast::stmt) -> bool {
     match stmt.node {
       ast::stmt_decl(d, _) => {
@@ -52,7 +59,7 @@ fn ends_in_lit_int(ex: @ast::expr) -> bool {
         @{node: ast::lit_int(_, ast::ty_i), _}
         | @{node: ast::lit_int_unsuffixed(_), _} => true,
         _ => false
-      }
+      },
       ast::expr_binary(_, _, sub) | ast::expr_unary(_, sub) |
       ast::expr_move(_, sub) | ast::expr_copy(sub) |
       ast::expr_assign(_, sub) |
@@ -63,7 +70,7 @@ fn ends_in_lit_int(ex: @ast::expr) -> bool {
       ast::expr_fail(osub) | ast::expr_ret(osub) => match osub {
         some(ex) => ends_in_lit_int(ex),
         _ => false
-      }
+      },
       _ => false
     }
 }
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 5b889b4ad96..c675af6803c 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -963,7 +963,7 @@ class parser {
                 hi = self.span.hi;
                 ex = expr_vstore(self.mk_expr(lo, hi, ex), vstore_fixed(v));
             }
-          }
+          },
           _ => ()
         }
 
@@ -1579,7 +1579,7 @@ class parser {
             let expr = self.parse_expr_res(RESTRICT_STMT_EXPR);
 
             let require_comma =
-                classify::expr_requires_semi_to_be_stmt(expr)
+                !classify::expr_is_simple_block(expr)
                 && self.token != token::RBRACE;
 
             if require_comma {
@@ -1839,7 +1839,7 @@ class parser {
                                             (token::COMMA),
                                         |p| p.parse_pat(refutable));
                                   }
-                              }
+                              },
                               _ => ()
                             }
                             // at this point, we're not sure whether it's a
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index b31e63a9f68..865af11ee8b 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -649,7 +649,7 @@ fn print_item(s: ps, &&item: @ast::item) {
 /// expression arguments as expressions). It can be done! I think.
 fn print_tt(s: ps, tt: ast::token_tree) {
     match tt {
-      ast::tt_delim(tts) => for tts.each() |tt_elt| { print_tt(s, tt_elt); }
+      ast::tt_delim(tts) => for tts.each() |tt_elt| { print_tt(s, tt_elt); },
       ast::tt_tok(_, tk) => {
         match tk {
           parse::token::IDENT(*) => { // don't let idents run together
@@ -953,7 +953,7 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
             print_vstore(s, v);
               print_expr(s, e);
           }
-      }
+      },
       ast::expr_vec(exprs, mutbl) => {
         ibox(s, indent_unit);
         word(s.s, ~"[");
@@ -1114,7 +1114,7 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
               some(expr) => {
                 end(s); // close the ibox for the pattern
                 print_expr(s, expr);
-                if expr_requires_semi_to_be_stmt(expr)
+                if !expr_is_simple_block(expr)
                     && i < len - 1 {
                     word(s.s, ~",");
                 }
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index 08572e83f6e..db84e0974ff 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -93,7 +93,7 @@ fn visit_crate_directive<E>(cd: @crate_directive, e: E, v: vt<E>) {
       cdir_src_mod(_, _) => (),
       cdir_dir_mod(_, cdirs, _) => for cdirs.each |cdir| {
         visit_crate_directive(cdir, e, v);
-      }
+      },
       cdir_view_item(vi) => v.visit_view_item(vi, e, v),
       cdir_syntax(_) => ()
     }
@@ -191,10 +191,10 @@ fn visit_ty<E>(t: @ty, e: E, v: vt<E>) {
       }
       ty_rec(flds) => for flds.each |f| {
         v.visit_ty(f.node.mt.ty, e, v);
-      }
+      },
       ty_tup(ts) => for ts.each |tt| {
         v.visit_ty(tt, e, v);
-      }
+      },
       ty_fn(_, bounds, decl) => {
         for decl.inputs.each |a| { v.visit_ty(a.ty, e, v); }
         visit_ty_param_bounds(bounds, e, v);
@@ -222,7 +222,7 @@ fn visit_pat<E>(p: @pat, e: E, v: vt<E>) {
       }
       pat_rec(fields, _) => for fields.each |f| {
         v.visit_pat(f.pat, e, v)
-      }
+      },
       pat_struct(path, fields, _) => {
         visit_path(path, e, v);
         for fields.each |f| {
@@ -231,7 +231,7 @@ 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_ident(_, path, inner) => {
           visit_path(path, e, v);
@@ -339,7 +339,7 @@ fn visit_decl<E>(d: @decl, e: E, v: vt<E>) {
     match d.node {
       decl_local(locs) => for locs.each |loc| {
         v.visit_local(loc, e, v)
-      }
+      },
       decl_item(it) => v.visit_item(it, e, v)
     }
 }
@@ -380,7 +380,7 @@ fn visit_expr<E>(ex: @expr, e: E, v: vt<E>) {
         for flds.each |f| { v.visit_expr(f.node.expr, e, v); }
         visit_expr_opt(base, e, v);
       }
-      expr_tup(elts) => for elts.each |el| { v.visit_expr(el, e, v); }
+      expr_tup(elts) => for elts.each |el| { v.visit_expr(el, e, v); },
       expr_call(callee, args, _) => {
         visit_exprs(args, e, v);
         v.visit_expr(callee, e, v);