diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index fbfd5aa6634..6ea5596fa2c 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -928,7 +928,8 @@ class parser { !self.is_keyword(~"with") { self.expect(token::COMMA); if self.token == token::RBRACE || - self.is_keyword(~"with") { + self.is_keyword(~"with") || + self.token == token::DOTDOT { // Accept an optional trailing comma. break; } @@ -936,7 +937,7 @@ class parser { } let base; - if self.eat_keyword(~"with") { + if self.eat_keyword(~"with") || self.eat(token::DOTDOT) { base = some(self.parse_expr()); } else { base = none; @@ -1548,6 +1549,16 @@ class parser { let mut fields = ~[self.parse_field(token::COLON)]; let mut base = none; while self.token != token::RBRACE { + if self.token == token::COMMA + && self.look_ahead(1) == token::DOTDOT { + self.bump(); + self.bump(); + base = some(self.parse_expr()); break; + } + + // XXX: Remove "with" after all code is converted over and there's + // a snapshot. + // optional comma before "with" if self.token == token::COMMA && self.token_is_keyword(~"with", diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index be4786e7b1d..15b0c66d6c8 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1039,7 +1039,9 @@ fn print_expr(s: ps, &&expr: @ast::expr) { some(expr) => { if vec::len(fields) > 0u { space(s.s); } ibox(s, indent_unit); - word_space(s, ~"with"); + word(s.s, ~","); + space(s.s); + word(s.s, ~".."); print_expr(s, expr); end(s); } @@ -1055,7 +1057,9 @@ fn print_expr(s: ps, &&expr: @ast::expr) { some(expr) => { if vec::len(fields) > 0u { space(s.s); } ibox(s, indent_unit); - word_space(s, ~"with"); + word(s.s, ~","); + space(s.s); + word(s.s, ~".."); print_expr(s, expr); end(s); } diff --git a/src/test/run-pass/functional-struct-update.rs b/src/test/run-pass/functional-struct-update.rs index 50f746a436a..c6e885a2911 100644 --- a/src/test/run-pass/functional-struct-update.rs +++ b/src/test/run-pass/functional-struct-update.rs @@ -5,8 +5,7 @@ struct Foo { fn main() { let a = Foo { x: 1, y: 2 }; - let b = Foo { x: 3 with a }; - let c = Foo { x: 4, with a }; - io::println(fmt!("%? %?", b, c)); + let c = Foo { x: 4, .. a }; + io::println(fmt!("%?", c)); }