Skip to content

Commit 542e2f5

Browse files
committed
Handle opening delimiter in collect_tokens
1 parent 55982c2 commit 542e2f5

File tree

1 file changed

+19
-4
lines changed
  • src/librustc_parse/parser

1 file changed

+19
-4
lines changed

src/librustc_parse/parser/mod.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ struct TokenCursorFrame {
145145
tree_cursor: tokenstream::Cursor,
146146
close_delim: bool,
147147
last_token: LastToken,
148+
original_tree: Option<TokenTree>,
148149
}
149150

150151
/// This is used in `TokenCursorFrame` above to track tokens that are consumed
@@ -171,14 +172,20 @@ enum LastToken {
171172
}
172173

173174
impl TokenCursorFrame {
174-
fn new(span: DelimSpan, delim: DelimToken, tts: &TokenStream) -> Self {
175+
fn new(
176+
span: DelimSpan,
177+
delim: DelimToken,
178+
tts: &TokenStream,
179+
original_tree: Option<TokenTree>,
180+
) -> Self {
175181
TokenCursorFrame {
176182
delim,
177183
span,
178184
open_delim: delim == token::NoDelim,
179185
tree_cursor: tts.clone().into_trees(),
180186
close_delim: delim == token::NoDelim,
181187
last_token: LastToken::Was(None),
188+
original_tree,
182189
}
183190
}
184191
}
@@ -206,10 +213,10 @@ impl TokenCursor {
206213
LastToken::Was(ref mut t) => *t = Some(tree.clone().into()),
207214
}
208215

209-
match tree {
216+
match tree.clone() {
210217
TokenTree::Token(token) => return token,
211218
TokenTree::Delimited(sp, delim, tts) => {
212-
let frame = TokenCursorFrame::new(sp, delim, &tts);
219+
let frame = TokenCursorFrame::new(sp, delim, &tts, Some(tree));
213220
self.stack.push(mem::replace(&mut self.frame, frame));
214221
}
215222
}
@@ -270,6 +277,7 @@ impl TokenCursor {
270277
.cloned()
271278
.collect::<TokenStream>()
272279
},
280+
None,
273281
),
274282
));
275283

@@ -373,7 +381,7 @@ impl<'a> Parser<'a> {
373381
root_module_name: None,
374382
expected_tokens: Vec::new(),
375383
token_cursor: TokenCursor {
376-
frame: TokenCursorFrame::new(DelimSpan::dummy(), token::NoDelim, &tokens),
384+
frame: TokenCursorFrame::new(DelimSpan::dummy(), token::NoDelim, &tokens, None),
377385
stack: Vec::new(),
378386
},
379387
desugar_doc_comments,
@@ -1147,6 +1155,13 @@ impl<'a> Parser<'a> {
11471155
&mut self,
11481156
f: impl FnOnce(&mut Self) -> PResult<'a, R>,
11491157
) -> PResult<'a, (R, TokenStream)> {
1158+
if matches!(self.token.kind, TokenKind::OpenDelim(_)) {
1159+
let tokens = vec![
1160+
self.token_cursor.frame.original_tree.clone().expect("Missing token tree!").into(),
1161+
];
1162+
let ret = f(self);
1163+
return Ok((ret?, TokenStream::new(tokens)));
1164+
}
11501165
// Record all tokens we parse when parsing this item.
11511166
let mut tokens = Vec::new();
11521167
let prev_collecting = match self.token_cursor.frame.last_token {

0 commit comments

Comments
 (0)