Skip to content

Commit f0bbc78

Browse files
committed
Avoid producing NoDelim values in TokenCursorFrame.
1 parent 18b53ce commit f0bbc78

File tree

2 files changed

+15
-22
lines changed

2 files changed

+15
-22
lines changed

compiler/rustc_parse/src/parser/expr.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2043,7 +2043,8 @@ impl<'a> Parser<'a> {
20432043
self.sess.gated_spans.gate(sym::async_closure, span);
20442044
}
20452045

2046-
if self.token.kind == TokenKind::Semi && self.token_cursor.frame.delim == DelimToken::Paren
2046+
if self.token.kind == TokenKind::Semi
2047+
&& matches!(self.token_cursor.frame.delim_sp, Some((DelimToken::Paren, _)))
20472048
{
20482049
// It is likely that the closure body is a block but where the
20492050
// braces have been removed. We will recover and eat the next

compiler/rustc_parse/src/parser/mod.rs

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -244,14 +244,13 @@ struct TokenCursor {
244244

245245
#[derive(Clone)]
246246
struct TokenCursorFrame {
247-
delim: token::DelimToken,
248-
span: DelimSpan,
247+
delim_sp: Option<(DelimToken, DelimSpan)>,
249248
tree_cursor: tokenstream::Cursor,
250249
}
251250

252251
impl TokenCursorFrame {
253-
fn new(span: DelimSpan, delim: DelimToken, tts: TokenStream) -> Self {
254-
TokenCursorFrame { delim, span, tree_cursor: tts.into_trees() }
252+
fn new(delim_sp: Option<(DelimToken, DelimSpan)>, tts: TokenStream) -> Self {
253+
TokenCursorFrame { delim_sp, tree_cursor: tts.into_trees() }
255254
}
256255
}
257256

@@ -266,7 +265,7 @@ impl TokenCursor {
266265
loop {
267266
// FIXME: we currently don't return `NoDelim` open/close delims. To fix #67062 we will
268267
// need to, whereupon the `delim != DelimToken::NoDelim` conditions below can be
269-
// removed, as well as the loop.
268+
// removed.
270269
if let Some((tree, spacing)) = self.frame.tree_cursor.next_with_spacing_ref() {
271270
match tree {
272271
&TokenTree::Token(ref token) => match (desugar_doc_comments, token) {
@@ -277,7 +276,7 @@ impl TokenCursor {
277276
},
278277
&TokenTree::Delimited(sp, delim, ref tts) => {
279278
// Set `open_delim` to true here because we deal with it immediately.
280-
let frame = TokenCursorFrame::new(sp, delim, tts.clone());
279+
let frame = TokenCursorFrame::new(Some((delim, sp)), tts.clone());
281280
self.stack.push(mem::replace(&mut self.frame, frame));
282281
if delim != DelimToken::NoDelim {
283282
return (Token::new(token::OpenDelim(delim), sp.open), Spacing::Alone);
@@ -286,12 +285,11 @@ impl TokenCursor {
286285
}
287286
};
288287
} else if let Some(frame) = self.stack.pop() {
289-
let delim = self.frame.delim;
290-
let span = self.frame.span;
291-
self.frame = frame;
292-
if delim != DelimToken::NoDelim {
288+
if let Some((delim, span)) = self.frame.delim_sp && delim != DelimToken::NoDelim {
289+
self.frame = frame;
293290
return (Token::new(token::CloseDelim(delim), span.close), Spacing::Alone);
294291
}
292+
self.frame = frame;
295293
// No close delimiter to return; continue on to the next iteration.
296294
} else {
297295
return (Token::new(token::Eof, DUMMY_SP), Spacing::Alone);
@@ -330,8 +328,7 @@ impl TokenCursor {
330328
self.stack.push(mem::replace(
331329
&mut self.frame,
332330
TokenCursorFrame::new(
333-
delim_span,
334-
token::NoDelim,
331+
None,
335332
if attr_style == AttrStyle::Inner {
336333
[TokenTree::token(token::Pound, span), TokenTree::token(token::Not, span), body]
337334
.iter()
@@ -431,10 +428,6 @@ impl<'a> Parser<'a> {
431428
desugar_doc_comments: bool,
432429
subparser_name: Option<&'static str>,
433430
) -> Self {
434-
// Note: because of the way `TokenCursor::inlined_next` is structured, the `span` and
435-
// `delim` arguments here are never used.
436-
let start_frame = TokenCursorFrame::new(DelimSpan::dummy(), token::NoDelim, tokens);
437-
438431
let mut parser = Parser {
439432
sess,
440433
token: Token::dummy(),
@@ -444,7 +437,7 @@ impl<'a> Parser<'a> {
444437
restrictions: Restrictions::empty(),
445438
expected_tokens: Vec::new(),
446439
token_cursor: TokenCursor {
447-
frame: start_frame,
440+
frame: TokenCursorFrame::new(None, tokens),
448441
stack: Vec::new(),
449442
num_next_calls: 0,
450443
desugar_doc_comments,
@@ -1025,7 +1018,7 @@ impl<'a> Parser<'a> {
10251018
}
10261019

10271020
let frame = &self.token_cursor.frame;
1028-
if frame.delim != DelimToken::NoDelim {
1021+
if let Some((delim, span)) = frame.delim_sp && delim != DelimToken::NoDelim {
10291022
let all_normal = (0..dist).all(|i| {
10301023
let token = frame.tree_cursor.look_ahead(i);
10311024
!matches!(token, Some(TokenTree::Delimited(_, DelimToken::NoDelim, _)))
@@ -1038,7 +1031,7 @@ impl<'a> Parser<'a> {
10381031
looker(&Token::new(token::OpenDelim(*delim), dspan.open))
10391032
}
10401033
},
1041-
None => looker(&Token::new(token::CloseDelim(frame.delim), frame.span.close)),
1034+
None => looker(&Token::new(token::CloseDelim(delim), span.close)),
10421035
};
10431036
}
10441037
}
@@ -1198,8 +1191,7 @@ impl<'a> Parser<'a> {
11981191
// Grab the tokens from this frame.
11991192
let frame = &self.token_cursor.frame;
12001193
let stream = frame.tree_cursor.stream.clone();
1201-
let span = frame.span;
1202-
let delim = frame.delim;
1194+
let (delim, span) = frame.delim_sp.unwrap();
12031195

12041196
// Advance the token cursor through the entire delimited
12051197
// sequence. After getting the `OpenDelim` we are *within* the

0 commit comments

Comments
 (0)