diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-07-01 22:18:41 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-07-01 22:36:24 -0700 |
| commit | 9743757113afbdaeca8a06e38f06a2ea4329b75e (patch) | |
| tree | f131e772902b9fc6089fab560004aa6d927fb8a1 /src/libsyntax/parse | |
| parent | fa6a446e6cd39ff3522a03fa9de7302e069408a7 (diff) | |
| download | rust-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.rs | 42 |
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}; |
