@@ -27,7 +27,7 @@ pub(super) struct TokenTreesReader<'a> {
2727}
2828
2929impl < ' 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