@@ -27,7 +27,7 @@ pub(super) struct TokenTreesReader<'a> {
27
27
}
28
28
29
29
impl<'a> TokenTreesReader<'a> {
30
- pub(super) fn parse_token_trees (
30
+ pub(super) fn parse_all_token_trees (
31
31
string_reader: StringReader<'a>,
32
32
) -> (PResult<'a, TokenStream>, Vec<UnmatchedBrace>) {
33
33
let mut tt_reader = TokenTreesReader {
@@ -40,34 +40,29 @@ impl<'a> TokenTreesReader<'a> {
40
40
last_delim_empty_block_spans: FxHashMap::default(),
41
41
matching_block_spans: Vec::new(),
42
42
};
43
- let res = tt_reader.parse_all_token_trees( );
43
+ let res = tt_reader.parse_token_trees(/* is_top_level */ true );
44
44
(res, tt_reader.unmatched_braces)
45
45
}
46
46
47
- // Parse a stream of tokens into a list of `TokenTree`s, up to an `Eof` .
48
- fn parse_all_token_trees (&mut self) -> PResult<'a, TokenStream> {
47
+ // Parse a stream of tokens into a list of `TokenTree`s.
48
+ fn parse_token_trees (&mut self, is_top_level: bool ) -> PResult<'a, TokenStream> {
49
49
self.token = self.string_reader.next_token().0;
50
50
let mut buf = TokenStreamBuilder::default();
51
51
loop {
52
52
match self.token.kind {
53
53
token::OpenDelim(delim) => buf.push(self.parse_token_tree_open_delim(delim)),
54
- token::CloseDelim(delim) => return Err(self.close_delim_err(delim)),
55
- token::Eof => return Ok(buf.into_token_stream()),
56
- _ => buf.push(self.parse_token_tree_non_delim_non_eof()),
57
- }
58
- }
59
- }
60
-
61
- // Parse a stream of tokens into a list of `TokenTree`s, up to a `CloseDelim`.
62
- fn parse_token_trees_until_close_delim(&mut self) -> TokenStream {
63
- let mut buf = TokenStreamBuilder::default();
64
- loop {
65
- match self.token.kind {
66
- token::OpenDelim(delim) => buf.push(self.parse_token_tree_open_delim(delim)),
67
- token::CloseDelim(..) => return buf.into_token_stream(),
54
+ token::CloseDelim(delim) => {
55
+ return if !is_top_level {
56
+ Ok(buf.into_token_stream())
57
+ } else {
58
+ Err(self.close_delim_err(delim))
59
+ };
60
+ }
68
61
token::Eof => {
69
- self.eof_err().emit();
70
- return buf.into_token_stream();
62
+ if !is_top_level {
63
+ self.eof_err().emit();
64
+ }
65
+ return Ok(buf.into_token_stream());
71
66
}
72
67
_ => buf.push(self.parse_token_tree_non_delim_non_eof()),
73
68
}
@@ -113,14 +108,12 @@ impl<'a> TokenTreesReader<'a> {
113
108
// The span for beginning of the delimited section
114
109
let pre_span = self.token.span;
115
110
116
- // Move past the open delimiter.
117
111
self.open_braces.push((open_delim, self.token.span));
118
- self.token = self.string_reader.next_token().0;
119
112
120
113
// Parse the token trees within the delimiters.
121
114
// We stop at any delimiter so we can try to recover if the user
122
115
// uses an incorrect delimiter.
123
- let tts = self.parse_token_trees_until_close_delim ();
116
+ let tts = self.parse_token_trees(/* is_top_level */ false).unwrap ();
124
117
125
118
// Expand to cover the entire delimited token tree
126
119
let delim_span = DelimSpan::from_pair(pre_span, self.token.span);
0 commit comments