Allow ref and mut modifiers for short form field patterns
Previously, if you wanted to bind a field mutably or by ref, you had to do something like Foo { x: ref mut x }. You can now just do Foo { ref mut x }. Closes #6137
This commit is contained in:
parent
9fc48061d7
commit
8240faf73a
@ -2814,18 +2814,33 @@ fn parse_pat_fields(&self) -> (~[ast::FieldPat], bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let lo1 = self.last_span.lo;
|
let lo1 = self.last_span.lo;
|
||||||
|
let bind_type = if self.eat_keyword(keywords::Mut) {
|
||||||
|
BindByValue(MutMutable)
|
||||||
|
} else if self.eat_keyword(keywords::Ref) {
|
||||||
|
BindByRef(self.parse_mutability())
|
||||||
|
} else {
|
||||||
|
BindByValue(MutImmutable)
|
||||||
|
};
|
||||||
|
|
||||||
let fieldname = self.parse_ident();
|
let fieldname = self.parse_ident();
|
||||||
let hi1 = self.last_span.lo;
|
let hi1 = self.last_span.lo;
|
||||||
let fieldpath = ast_util::ident_to_path(mk_sp(lo1, hi1),
|
let fieldpath = ast_util::ident_to_path(mk_sp(lo1, hi1),
|
||||||
fieldname);
|
fieldname);
|
||||||
let subpat;
|
let subpat;
|
||||||
if *self.token == token::COLON {
|
if *self.token == token::COLON {
|
||||||
|
match bind_type {
|
||||||
|
BindByRef(..) | BindByValue(MutMutable) =>
|
||||||
|
self.fatal(format!("unexpected `{}`",
|
||||||
|
self.this_token_to_str())),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
self.bump();
|
self.bump();
|
||||||
subpat = self.parse_pat();
|
subpat = self.parse_pat();
|
||||||
} else {
|
} else {
|
||||||
subpat = @ast::Pat {
|
subpat = @ast::Pat {
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
node: PatIdent(BindByValue(MutImmutable), fieldpath, None),
|
node: PatIdent(bind_type, fieldpath, None),
|
||||||
span: *self.last_span
|
span: *self.last_span
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
17
src/test/compile-fail/bind-struct-early-modifiers.rs
Normal file
17
src/test/compile-fail/bind-struct-early-modifiers.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
struct Foo { x: int }
|
||||||
|
match Foo { x: 10 } {
|
||||||
|
Foo { ref x: ref x } => {}, //~ ERROR unexpected `:`
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
31
src/test/run-pass/bind-field-short-with-modifiers.rs
Normal file
31
src/test/run-pass/bind-field-short-with-modifiers.rs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
struct Foo { x: int, y: int }
|
||||||
|
let mut f = Foo { x: 10, y: 0 };
|
||||||
|
match f {
|
||||||
|
Foo { ref mut x, .. } => *x = 11,
|
||||||
|
}
|
||||||
|
match f {
|
||||||
|
Foo { ref x, ref y } => {
|
||||||
|
assert_eq!(f.x, 11);
|
||||||
|
assert_eq!(f.y, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match f {
|
||||||
|
Foo { mut x, y: ref mut y } => {
|
||||||
|
x = 12;
|
||||||
|
*y = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert_eq!(f.x, 11);
|
||||||
|
assert_eq!(f.y, 1);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user