about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-07-01 22:18:41 -0700
committerBrian Anderson <banderson@mozilla.com>2012-07-01 22:36:24 -0700
commit9743757113afbdaeca8a06e38f06a2ea4329b75e (patch)
treef131e772902b9fc6089fab560004aa6d927fb8a1 /src/libsyntax/parse
parentfa6a446e6cd39ff3522a03fa9de7302e069408a7 (diff)
downloadrust-9743757113afbdaeca8a06e38f06a2ea4329b75e.tar.gz
rust-9743757113afbdaeca8a06e38f06a2ea4329b75e.zip
syntax: Support dropping argument list from for/do
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/parser.rs42
1 files changed, 34 insertions, 8 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 754fbcd23fe..0492ab27346 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -1357,21 +1357,47 @@ class parser {
 
     // `|args| { ... }` like in `do` expressions
     fn parse_lambda_block_expr() -> @expr {
-        self.parse_lambda_expr_(|| {
-            let blk = self.parse_block();
-            self.mk_expr(blk.span.lo, blk.span.hi, expr_block(blk))
-        })
+        self.parse_lambda_expr_(
+            || {
+                alt self.token {
+                  token::BINOP(token::OR) | token::OROR {
+                    self.parse_fn_block_decl()
+                  }
+                  _ {
+                    // No argument list - `do foo {`
+                    ({
+                        {
+                            inputs: ~[],
+                            output: @{
+                                id: self.get_id(),
+                                node: ty_infer,
+                                span: self.span
+                            },
+                            purity: impure_fn,
+                            cf: return_val,
+                            constraints: ~[]
+                        }
+                    },
+                    @~[])
+                  }
+                }
+            },
+            || {
+                let blk = self.parse_block();
+                self.mk_expr(blk.span.lo, blk.span.hi, expr_block(blk))
+            })
     }
 
     // `|args| expr`
     fn parse_lambda_expr() -> @expr {
-        self.parse_lambda_expr_(|| self.parse_expr())
+        self.parse_lambda_expr_(|| self.parse_fn_block_decl(),
+                                || self.parse_expr())
     }
 
-    fn parse_lambda_expr_(parse_body: fn&() -> @expr) -> @expr {
+    fn parse_lambda_expr_(parse_decl: fn&() -> (fn_decl, capture_clause),
+                          parse_body: fn&() -> @expr) -> @expr {
         let lo = self.last_span.lo;
-        // New style lambdas `|args| expr`
-        let (decl, captures) = self.parse_fn_block_decl();
+        let (decl, captures) = parse_decl();
         let body = parse_body();
         let fakeblock = {view_items: ~[], stmts: ~[], expr: some(body),
                          id: self.get_id(), rules: default_blk};