This commit is contained in:
Jeffrey Seyfried 2017-03-06 06:45:28 +00:00
parent d9cf601ae8
commit 460bf55f8a
2 changed files with 11 additions and 12 deletions

View file

@ -488,7 +488,7 @@ pub fn parse(sess: &ParseSess, tts: TokenStream, ms: &[TokenTree], directory: Op
fn parse_nt<'a>(p: &mut Parser<'a>, sp: Span, name: &str) -> Nonterminal { fn parse_nt<'a>(p: &mut Parser<'a>, sp: Span, name: &str) -> Nonterminal {
match name { match name {
"tt" => { "tt" => {
return token::NtTT(panictry!(p.parse_token_tree())); return token::NtTT(p.parse_token_tree());
} }
_ => {} _ => {}
} }

View file

@ -891,7 +891,7 @@ impl<'a> Parser<'a> {
self.parse_seq_to_before_tokens(kets, self.parse_seq_to_before_tokens(kets,
SeqSep::none(), SeqSep::none(),
|p| p.parse_token_tree(), |p| Ok(p.parse_token_tree()),
|mut e| handler.cancel(&mut e)); |mut e| handler.cancel(&mut e));
} }
@ -1267,7 +1267,7 @@ impl<'a> Parser<'a> {
break; break;
} }
token::OpenDelim(token::Brace) => { token::OpenDelim(token::Brace) => {
self.parse_token_tree()?; self.parse_token_tree();
break; break;
} }
_ => self.bump(), _ => self.bump(),
@ -2101,10 +2101,10 @@ impl<'a> Parser<'a> {
fn expect_delimited_token_tree(&mut self) -> PResult<'a, (token::DelimToken, ThinTokenStream)> { fn expect_delimited_token_tree(&mut self) -> PResult<'a, (token::DelimToken, ThinTokenStream)> {
match self.token { match self.token {
token::OpenDelim(delim) => self.parse_token_tree().map(|tree| match tree { token::OpenDelim(delim) => match self.parse_token_tree() {
TokenTree::Delimited(_, delimited) => (delim, delimited.stream().into()), TokenTree::Delimited(_, delimited) => Ok((delim, delimited.stream().into())),
_ => unreachable!(), _ => unreachable!(),
}), },
_ => Err(self.fatal("expected open delimiter")), _ => Err(self.fatal("expected open delimiter")),
} }
} }
@ -2643,24 +2643,23 @@ impl<'a> Parser<'a> {
} }
/// parse a single token tree from the input. /// parse a single token tree from the input.
pub fn parse_token_tree(&mut self) -> PResult<'a, TokenTree> { pub fn parse_token_tree(&mut self) -> TokenTree {
match self.token { match self.token {
token::OpenDelim(..) => { token::OpenDelim(..) => {
let frame = mem::replace(&mut self.token_cursor.frame, let frame = mem::replace(&mut self.token_cursor.frame,
self.token_cursor.stack.pop().unwrap()); self.token_cursor.stack.pop().unwrap());
self.span = frame.span; self.span = frame.span;
self.bump(); self.bump();
return Ok(TokenTree::Delimited(frame.span, Delimited { TokenTree::Delimited(frame.span, Delimited {
delim: frame.delim, delim: frame.delim,
tts: frame.tree_cursor.original_stream().into(), tts: frame.tree_cursor.original_stream().into(),
})); })
}, },
token::CloseDelim(_) | token::Eof => unreachable!(), token::CloseDelim(_) | token::Eof => unreachable!(),
_ => { _ => {
let token = mem::replace(&mut self.token, token::Underscore); let token = mem::replace(&mut self.token, token::Underscore);
let res = Ok(TokenTree::Token(self.span, token));
self.bump(); self.bump();
res TokenTree::Token(self.prev_span, token)
} }
} }
} }
@ -2670,7 +2669,7 @@ impl<'a> Parser<'a> {
pub fn parse_all_token_trees(&mut self) -> PResult<'a, Vec<TokenTree>> { pub fn parse_all_token_trees(&mut self) -> PResult<'a, Vec<TokenTree>> {
let mut tts = Vec::new(); let mut tts = Vec::new();
while self.token != token::Eof { while self.token != token::Eof {
tts.push(self.parse_token_tree()?); tts.push(self.parse_token_tree());
} }
Ok(tts) Ok(tts)
} }