Skip to content

Commit ce76768

Browse files
committed
Merge parse_token_trees_until_close_delim and parse_all_token_trees.
Because they're very similar, and this will allow some follow-up changes.
1 parent 9de9cf1 commit ce76768

File tree

2 files changed

+17
-24
lines changed

2 files changed

+17
-24
lines changed

compiler/rustc_parse/src/lexer/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ pub(crate) fn parse_token_trees<'a>(
5252
let cursor = Cursor::new(src);
5353
let string_reader =
5454
StringReader { sess, start_pos, pos: start_pos, src, cursor, override_span };
55-
tokentrees::TokenTreesReader::parse_token_trees(string_reader)
55+
tokentrees::TokenTreesReader::parse_all_token_trees(string_reader)
5656
}
5757

5858
struct StringReader<'a> {

compiler/rustc_parse/src/lexer/tokentrees.rs

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub(super) struct TokenTreesReader<'a> {
2727
}
2828

2929
impl<'a> TokenTreesReader<'a> {
30-
pub(super) fn parse_token_trees(
30+
pub(super) fn parse_all_token_trees(
3131
string_reader: StringReader<'a>,
3232
) -> (PResult<'a, TokenStream>, Vec<UnmatchedBrace>) {
3333
let mut tt_reader = TokenTreesReader {
@@ -40,34 +40,29 @@ impl<'a> TokenTreesReader<'a> {
4040
last_delim_empty_block_spans: FxHashMap::default(),
4141
matching_block_spans: Vec::new(),
4242
};
43-
let res = tt_reader.parse_all_token_trees();
43+
let res = tt_reader.parse_token_trees(/* is_top_level */ true);
4444
(res, tt_reader.unmatched_braces)
4545
}
4646

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> {
4949
self.token = self.string_reader.next_token().0;
5050
let mut buf = TokenStreamBuilder::default();
5151
loop {
5252
match self.token.kind {
5353
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+
}
6861
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());
7166
}
7267
_ => buf.push(self.parse_token_tree_non_delim_non_eof()),
7368
}
@@ -113,14 +108,12 @@ impl<'a> TokenTreesReader<'a> {
113108
// The span for beginning of the delimited section
114109
let pre_span = self.token.span;
115110

116-
// Move past the open delimiter.
117111
self.open_braces.push((open_delim, self.token.span));
118-
self.token = self.string_reader.next_token().0;
119112

120113
// Parse the token trees within the delimiters.
121114
// We stop at any delimiter so we can try to recover if the user
122115
// 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();
124117

125118
// Expand to cover the entire delimited token tree
126119
let delim_span = DelimSpan::from_pair(pre_span, self.token.span);

0 commit comments

Comments
 (0)