diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2012-08-06 13:15:40 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2012-08-06 13:17:42 -0700 |
| commit | bff512a90facf2b0064f13737d44c716863f644d (patch) | |
| tree | 72553ae018b6ed52c06e532346b35f3608d7559d /src/libsyntax/parse | |
| parent | 1e3143b34e66ca5157b03d3658d64d7c01563186 (diff) | |
| download | rust-bff512a90facf2b0064f13737d44c716863f644d.tar.gz rust-bff512a90facf2b0064f13737d44c716863f644d.zip | |
rustc: Implement functional record update for structs
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index a6c4e6c4131..71bd87981bc 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -912,18 +912,27 @@ class parser { self.bump(); let mut fields = ~[]; vec::push(fields, self.parse_field(token::COLON)); - while self.token != token::RBRACE { + while self.token != token::RBRACE && + !self.is_keyword(~"with") { self.expect(token::COMMA); - if self.token == token::RBRACE { + if self.token == token::RBRACE || + self.is_keyword(~"with") { // Accept an optional trailing comma. break; } vec::push(fields, self.parse_field(token::COLON)); } + let base; + if self.eat_keyword(~"with") { + base = some(self.parse_expr()); + } else { + base = none; + } + hi = pth.span.hi; self.expect(token::RBRACE); - ex = expr_struct(pth, fields); + ex = expr_struct(pth, fields, base); return self.mk_pexpr(lo, hi, ex); } } |
