about summary refs log tree commit diff
path: root/src/comp/syntax/parse
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-02-07 06:37:08 -0800
committerNiko Matsakis <niko@alum.mit.edu>2012-02-11 10:14:41 -0800
commitb106ef81164a33e2f18820274b48cb9673c423af (patch)
tree7b0fe347c80af1cdbc84df5b24290791c222e0fc /src/comp/syntax/parse
parentfc023d91c77f468211ba9f7681b4d2a6469aac74 (diff)
downloadrust-b106ef81164a33e2f18820274b48cb9673c423af.tar.gz
rust-b106ef81164a33e2f18820274b48cb9673c423af.zip
make bind syntax unnecessary: just use _ for one of the arguments
Diffstat (limited to 'src/comp/syntax/parse')
-rw-r--r--src/comp/syntax/parse/parser.rs31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index 8e2897407a3..3ce4d38013e 100644
--- a/src/comp/syntax/parse/parser.rs
+++ b/src/comp/syntax/parse/parser.rs
@@ -854,15 +854,9 @@ fn parse_bottom_expr(p: parser) -> pexpr {
         ret pexpr(mk_mac_expr(p, lo, p.span.hi, ast::mac_ellipsis));
     } else if eat_word(p, "bind") {
         let e = parse_expr_res(p, RESTRICT_NO_CALL_EXPRS);
-        fn parse_expr_opt(p: parser) -> option<@ast::expr> {
-            alt p.token {
-              token::UNDERSCORE { p.bump(); ret none; }
-              _ { ret some(parse_expr(p)); }
-            }
-        }
         let es =
             parse_seq(token::LPAREN, token::RPAREN, seq_sep(token::COMMA),
-                      parse_expr_opt, p);
+                      parse_expr_or_hole, p);
         hi = es.span.hi;
         ex = ast::expr_bind(e, es.node);
     } else if p.token == token::POUND {
@@ -1036,10 +1030,18 @@ fn parse_dot_or_call_expr_with(p: parser, e0: pexpr) -> pexpr {
         alt p.token {
           // expr(...)
           token::LPAREN if permits_call(p) {
-            let es = parse_seq(token::LPAREN, token::RPAREN,
-                               seq_sep(token::COMMA), parse_expr, p);
-            hi = es.span.hi;
-            let nd = ast::expr_call(to_expr(e), es.node, false);
+            let es_opt =
+                parse_seq(token::LPAREN, token::RPAREN,
+                          seq_sep(token::COMMA), parse_expr_or_hole, p);
+            hi = es_opt.span.hi;
+
+            let nd =
+                if vec::any(es_opt.node, {|e| option::is_none(e) }) {
+                    ast::expr_bind(to_expr(e), es_opt.node)
+                } else {
+                    let es = vec::map(es_opt.node) {|e| option::get(e) };
+                    ast::expr_call(to_expr(e), es, false)
+                };
             e = mk_pexpr(p, lo, hi, nd);
           }
 
@@ -1388,6 +1390,13 @@ fn parse_expr(p: parser) -> @ast::expr {
     ret parse_expr_res(p, UNRESTRICTED);
 }
 
+fn parse_expr_or_hole(p: parser) -> option<@ast::expr> {
+    alt p.token {
+      token::UNDERSCORE { p.bump(); ret none; }
+      _ { ret some(parse_expr(p)); }
+    }
+}
+
 fn parse_expr_res(p: parser, r: restriction) -> @ast::expr {
     let old = p.restriction;
     p.restriction = r;