diff options
| author | bors <bors@rust-lang.org> | 2021-04-14 20:45:23 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-04-14 20:45:23 +0000 |
| commit | 16bf626a31cb5b121d0bca2baa969b4f67eb0dab (patch) | |
| tree | 977714bcfe9e7976656fddb84ca5a9ef7efd0b08 /compiler/rustc_parse/src | |
| parent | 7537b20626100e7e7fc8c4ad3079d38c05338121 (diff) | |
| parent | c6d67f83170adf586abc93adedc8048e325611e1 (diff) | |
| download | rust-16bf626a31cb5b121d0bca2baa969b4f67eb0dab.tar.gz rust-16bf626a31cb5b121d0bca2baa969b4f67eb0dab.zip | |
Auto merge of #84130 - Aaron1011:fix/none-delim-lookahead, r=petrochenkov
Fix lookahead with None-delimited group Fixes https://github.com/rust-lang/rust/issues/84162, a regression introduced by https://github.com/rust-lang/rust/pull/82608.
Diffstat (limited to 'compiler/rustc_parse/src')
| -rw-r--r-- | compiler/rustc_parse/src/parser/mod.rs | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/compiler/rustc_parse/src/parser/mod.rs b/compiler/rustc_parse/src/parser/mod.rs index 4b97c8b0a81..ed95a5661b1 100644 --- a/compiler/rustc_parse/src/parser/mod.rs +++ b/compiler/rustc_parse/src/parser/mod.rs @@ -930,15 +930,38 @@ impl<'a> Parser<'a> { } let frame = &self.token_cursor.frame; - match frame.tree_cursor.look_ahead(dist - 1) { - Some(tree) => match tree { - TokenTree::Token(token) => looker(token), - TokenTree::Delimited(dspan, delim, _) => { - looker(&Token::new(token::OpenDelim(*delim), dspan.open)) - } - }, - None => looker(&Token::new(token::CloseDelim(frame.delim), frame.span.close)), + if frame.delim != DelimToken::NoDelim { + let all_normal = (0..dist).all(|i| { + let token = frame.tree_cursor.look_ahead(i); + !matches!(token, Some(TokenTree::Delimited(_, DelimToken::NoDelim, _))) + }); + if all_normal { + return match frame.tree_cursor.look_ahead(dist - 1) { + Some(tree) => match tree { + TokenTree::Token(token) => looker(token), + TokenTree::Delimited(dspan, delim, _) => { + looker(&Token::new(token::OpenDelim(*delim), dspan.open)) + } + }, + None => looker(&Token::new(token::CloseDelim(frame.delim), frame.span.close)), + }; + } + } + + let mut cursor = self.token_cursor.clone(); + let mut i = 0; + let mut token = Token::dummy(); + while i < dist { + token = cursor.next().0; + if matches!( + token.kind, + token::OpenDelim(token::NoDelim) | token::CloseDelim(token::NoDelim) + ) { + continue; + } + i += 1; } + return looker(&token); } /// Returns whether any of the given keywords are `dist` tokens ahead of the current one. |
