Refactor out parser.expect_delimited_token_tree()
.
This commit is contained in:
parent
752413005e
commit
7f822c800d
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user