Skip to content

Commit 9665da3

Browse files
committed
Avoid producing NoDelim values in FrameData.
1 parent a8e862c commit 9665da3

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

compiler/rustc_parse/src/parser/attr_wrapper.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustc_ast::tokenstream::{AttrAnnotatedTokenTree, DelimSpan, LazyTokenStream,
55
use rustc_ast::{self as ast};
66
use rustc_ast::{AstLike, AttrVec, Attribute};
77
use rustc_errors::PResult;
8-
use rustc_span::{sym, Span, DUMMY_SP};
8+
use rustc_span::{sym, Span};
99

1010
use std::convert::TryInto;
1111
use std::ops::Range;
@@ -400,24 +400,26 @@ fn make_token_stream(
400400
) -> AttrAnnotatedTokenStream {
401401
#[derive(Debug)]
402402
struct FrameData {
403-
open: Span,
404-
open_delim: DelimToken,
403+
// This is `None` for the first frame, `Some` for all others.
404+
open_delim_sp: Option<(DelimToken, Span)>,
405405
inner: Vec<(AttrAnnotatedTokenTree, Spacing)>,
406406
}
407-
let mut stack =
408-
vec![FrameData { open: DUMMY_SP, open_delim: DelimToken::NoDelim, inner: vec![] }];
407+
let mut stack = vec![FrameData { open_delim_sp: None, inner: vec![] }];
409408
let mut token_and_spacing = iter.next();
410409
while let Some((token, spacing)) = token_and_spacing {
411410
match token {
412411
FlatToken::Token(Token { kind: TokenKind::OpenDelim(delim), span }) => {
413-
stack.push(FrameData { open: span, open_delim: delim, inner: vec![] });
412+
stack.push(FrameData { open_delim_sp: Some((delim, span)), inner: vec![] });
414413
}
415414
FlatToken::Token(Token { kind: TokenKind::CloseDelim(delim), span }) => {
416415
// HACK: If we encounter a mismatched `None` delimiter at the top
417416
// level, just ignore it.
418417
if matches!(delim, DelimToken::NoDelim)
419418
&& (stack.len() == 1
420-
|| !matches!(stack.last_mut().unwrap().open_delim, DelimToken::NoDelim))
419+
|| !matches!(
420+
stack.last_mut().unwrap().open_delim_sp.unwrap().0,
421+
DelimToken::NoDelim
422+
))
421423
{
422424
token_and_spacing = iter.next();
423425
continue;
@@ -430,7 +432,7 @@ fn make_token_stream(
430432
// merge our current frame with the one above it. That is, transform
431433
// `[ { < first second } third ]` into `[ { first second } third ]`
432434
if !matches!(delim, DelimToken::NoDelim)
433-
&& matches!(frame_data.open_delim, DelimToken::NoDelim)
435+
&& matches!(frame_data.open_delim_sp.unwrap().0, DelimToken::NoDelim)
434436
{
435437
stack.last_mut().unwrap().inner.extend(frame_data.inner);
436438
// Process our closing delimiter again, this time at the previous
@@ -439,12 +441,13 @@ fn make_token_stream(
439441
continue;
440442
}
441443

444+
let (open_delim, open_sp) = frame_data.open_delim_sp.unwrap();
442445
assert_eq!(
443-
frame_data.open_delim, delim,
446+
open_delim, delim,
444447
"Mismatched open/close delims: open={:?} close={:?}",
445-
frame_data.open, span
448+
open_delim, span
446449
);
447-
let dspan = DelimSpan::from_pair(frame_data.open, span);
450+
let dspan = DelimSpan::from_pair(open_sp, span);
448451
let stream = AttrAnnotatedTokenStream::new(frame_data.inner);
449452
let delimited = AttrAnnotatedTokenTree::Delimited(dspan, delim, stream);
450453
stack
@@ -472,7 +475,7 @@ fn make_token_stream(
472475
// HACK: If we don't have a closing `None` delimiter for our last
473476
// frame, merge the frame with the top-level frame. That is,
474477
// turn `< first second` into `first second`
475-
if stack.len() == 2 && stack[1].open_delim == DelimToken::NoDelim {
478+
if stack.len() == 2 && stack[1].open_delim_sp.unwrap().0 == DelimToken::NoDelim {
476479
let temp_buf = stack.pop().unwrap();
477480
stack.last_mut().unwrap().inner.extend(temp_buf.inner);
478481
}

0 commit comments

Comments
 (0)