@@ -39,29 +39,29 @@ struct TokenTreesReader<'a> {
3939impl < ' a > TokenTreesReader < ' a > {
4040 // Parse a stream of tokens into a list of `TokenTree`s, up to an `Eof`.
4141 fn parse_all_token_trees ( & mut self ) -> PResult < ' a , TokenStream > {
42- let mut tts = Vec :: new ( ) ;
42+ let mut buf = TokenStreamBuilder :: default ( ) ;
4343
4444 self . real_token ( ) ;
4545 while self . token != token:: Eof {
46- tts . push ( self . parse_token_tree ( ) ?) ;
46+ buf . push ( self . parse_token_tree ( ) ?) ;
4747 }
4848
49- Ok ( TokenStream :: new ( tts ) )
49+ Ok ( buf . into_token_stream ( ) )
5050 }
5151
5252 // Parse a stream of tokens into a list of `TokenTree`s, up to a `CloseDelim`.
5353 fn parse_token_trees_until_close_delim ( & mut self ) -> TokenStream {
54- let mut tts = vec ! [ ] ;
54+ let mut buf = TokenStreamBuilder :: default ( ) ;
5555 loop {
5656 if let token:: CloseDelim ( ..) = self . token . kind {
57- return TokenStream :: new ( tts ) ;
57+ return buf . into_token_stream ( ) ;
5858 }
5959
6060 match self . parse_token_tree ( ) {
61- Ok ( tree) => tts . push ( tree) ,
61+ Ok ( tree) => buf . push ( tree) ,
6262 Err ( mut e) => {
6363 e. emit ( ) ;
64- return TokenStream :: new ( tts ) ;
64+ return buf . into_token_stream ( ) ;
6565 }
6666 }
6767 }
@@ -223,8 +223,32 @@ impl<'a> TokenTreesReader<'a> {
223223 _ => {
224224 self . token = token;
225225 return ;
226- } ,
226+ }
227+ }
228+ }
229+ }
230+ }
231+
232+ #[ derive( Default ) ]
233+ struct TokenStreamBuilder {
234+ buf : Vec < TreeAndJoint > ,
235+ }
236+
237+ impl TokenStreamBuilder {
238+ fn push ( & mut self , ( tree, joint) : TreeAndJoint ) {
239+ if let Some ( ( TokenTree :: Token ( prev_token) , Joint ) ) = self . buf . last ( ) {
240+ if let TokenTree :: Token ( token) = & tree {
241+ if let Some ( glued) = prev_token. glue ( token) {
242+ self . buf . pop ( ) ;
243+ self . buf . push ( ( TokenTree :: Token ( glued) , joint) ) ;
244+ return ;
245+ }
227246 }
228247 }
248+ self . buf . push ( ( tree, joint) )
249+ }
250+
251+ fn into_token_stream ( self ) -> TokenStream {
252+ TokenStream :: new ( self . buf )
229253 }
230254}
0 commit comments