@@ -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