Refactor out parser.expect_delimited_token_tree().

This commit is contained in:
Jeffrey Seyfried 2017-01-31 02:21:24 +00:00
parent 752413005e
commit 7f822c800d

View File

@ -1170,10 +1170,7 @@ impl<'a> Parser<'a> {
self.expect(&token::Not)?; self.expect(&token::Not)?;
// eat a matched-delimiter token tree: // eat a matched-delimiter token tree:
let delim = self.expect_open_delim()?; let (delim, tts) = self.expect_delimited_token_tree()?;
let tts = self.parse_seq_to_end(&token::CloseDelim(delim),
SeqSep::none(),
|pp| pp.parse_token_tree())?;
if delim != token::Brace { if delim != token::Brace {
self.expect(&token::Semi)? self.expect(&token::Semi)?
} }
@ -1431,10 +1428,7 @@ impl<'a> Parser<'a> {
let path = self.parse_path(PathStyle::Type)?; let path = self.parse_path(PathStyle::Type)?;
if self.eat(&token::Not) { if self.eat(&token::Not) {
// MACRO INVOCATION // MACRO INVOCATION
let delim = self.expect_open_delim()?; let (_, tts) = self.expect_delimited_token_tree()?;
let tts = self.parse_seq_to_end(&token::CloseDelim(delim),
SeqSep::none(),
|p| p.parse_token_tree())?;
let hi = self.span.hi; let hi = self.span.hi;
TyKind::Mac(spanned(lo, hi, Mac_ { path: path, tts: tts })) TyKind::Mac(spanned(lo, hi, Mac_ { path: path, tts: tts }))
} else { } else {
@ -2028,13 +2022,12 @@ impl<'a> Parser<'a> {
}) })
} }
fn expect_open_delim(&mut self) -> PResult<'a, token::DelimToken> { fn expect_delimited_token_tree(&mut self) -> PResult<'a, (token::DelimToken, Vec<TokenTree>)> {
self.expected_tokens.push(TokenType::Token(token::Gt));
match self.token { match self.token {
token::OpenDelim(delim) => { token::OpenDelim(delim) => self.parse_token_tree().map(|tree| match tree {
self.bump(); TokenTree::Delimited(_, delimited) => (delim, delimited.tts.clone()),
Ok(delim) _ => unreachable!(),
}, }),
_ => Err(self.fatal("expected open delimiter")), _ => Err(self.fatal("expected open delimiter")),
} }
} }
@ -2244,10 +2237,7 @@ impl<'a> Parser<'a> {
// `!`, as an operator, is prefix, so we know this isn't that // `!`, as an operator, is prefix, so we know this isn't that
if self.eat(&token::Not) { if self.eat(&token::Not) {
// MACRO INVOCATION expression // MACRO INVOCATION expression
let delim = self.expect_open_delim()?; let (_, tts) = self.expect_delimited_token_tree()?;
let tts = self.parse_seq_to_end(&token::CloseDelim(delim),
SeqSep::none(),
|p| p.parse_token_tree())?;
let hi = self.prev_span.hi; let hi = self.prev_span.hi;
return Ok(self.mk_mac_expr(lo, hi, Mac_ { path: pth, tts: tts }, attrs)); return Ok(self.mk_mac_expr(lo, hi, Mac_ { path: pth, tts: tts }, attrs));
} }
@ -2580,6 +2570,7 @@ impl<'a> Parser<'a> {
match self.token { match self.token {
token::OpenDelim(..) => { token::OpenDelim(..) => {
let tt = self.tts.pop().unwrap().0; let tt = self.tts.pop().unwrap().0;
self.span = tt.span();
self.bump(); self.bump();
return Ok(tt); return Ok(tt);
}, },
@ -3393,10 +3384,7 @@ impl<'a> Parser<'a> {
token::Not if qself.is_none() => { token::Not if qself.is_none() => {
// Parse macro invocation // Parse macro invocation
self.bump(); self.bump();
let delim = self.expect_open_delim()?; let (_, tts) = self.expect_delimited_token_tree()?;
let tts = self.parse_seq_to_end(&token::CloseDelim(delim),
SeqSep::none(),
|p| p.parse_token_tree())?;
let mac = spanned(lo, self.prev_span.hi, Mac_ { path: path, tts: tts }); let mac = spanned(lo, self.prev_span.hi, Mac_ { path: path, tts: tts });
pat = PatKind::Mac(mac); pat = PatKind::Mac(mac);
} }
@ -3696,12 +3684,7 @@ impl<'a> Parser<'a> {
}, },
}; };
let tts = self.parse_unspanned_seq( let (_, tts) = self.expect_delimited_token_tree()?;
&token::OpenDelim(delim),
&token::CloseDelim(delim),
SeqSep::none(),
|p| p.parse_token_tree()
)?;
let hi = self.prev_span.hi; let hi = self.prev_span.hi;
let style = if delim == token::Brace { let style = if delim == token::Brace {
@ -4609,10 +4592,7 @@ impl<'a> Parser<'a> {
self.expect(&token::Not)?; self.expect(&token::Not)?;
// eat a matched-delimiter token tree: // eat a matched-delimiter token tree:
let delim = self.expect_open_delim()?; let (delim, tts) = self.expect_delimited_token_tree()?;
let tts = self.parse_seq_to_end(&token::CloseDelim(delim),
SeqSep::none(),
|p| p.parse_token_tree())?;
if delim != token::Brace { if delim != token::Brace {
self.expect(&token::Semi)? self.expect(&token::Semi)?
} }
@ -5758,10 +5738,7 @@ impl<'a> Parser<'a> {
keywords::Invalid.ident() // no special identifier keywords::Invalid.ident() // no special identifier
}; };
// eat a matched-delimiter token tree: // eat a matched-delimiter token tree:
let delim = self.expect_open_delim()?; let (delim, tts) = self.expect_delimited_token_tree()?;
let tts = self.parse_seq_to_end(&token::CloseDelim(delim),
SeqSep::none(),
|p| p.parse_token_tree())?;
if delim != token::Brace { if delim != token::Brace {
if !self.eat(&token::Semi) { if !self.eat(&token::Semi) {
let prev_span = self.prev_span; let prev_span = self.prev_span;