Parse macros in patterns

Fixes #6830.
This commit is contained in:
Keegan McAllister 2014-05-19 15:03:48 -07:00
parent b2f6dd53c9
commit 55776f2822
1 changed files with 20 additions and 7 deletions

View File

@ -2911,15 +2911,28 @@ impl<'a> Parser<'a> {
pat = PatRange(start, end);
} else if is_plain_ident(&self.token) && !can_be_enum_or_struct {
let name = self.parse_path(NoTypesAllowed).path;
let sub;
if self.eat(&token::AT) {
// parse foo @ pat
sub = Some(self.parse_pat());
if self.eat(&token::NOT) {
// macro invocation
let ket = token::close_delimiter_for(&self.token)
.unwrap_or_else(|| self.fatal("expected open delimiter"));
self.bump();
let tts = self.parse_seq_to_end(&ket,
seq_sep_none(),
|p| p.parse_token_tree());
let mac = MacInvocTT(name, tts, EMPTY_CTXT);
pat = ast::PatMac(codemap::Spanned {node: mac, span: self.span});
} else {
// or just foo
sub = None;
let sub = if self.eat(&token::AT) {
// parse foo @ pat
Some(self.parse_pat())
} else {
// or just foo
None
};
pat = PatIdent(BindByValue(MutImmutable), name, sub);
}
pat = PatIdent(BindByValue(MutImmutable), name, sub);
} else {
// parse an enum pat
let enum_path = self.parse_path(LifetimeAndTypesWithColons)