@@ -39,29 +39,29 @@ struct TokenTreesReader<'a> {
39
39
impl < ' a > TokenTreesReader < ' a > {
40
40
// Parse a stream of tokens into a list of `TokenTree`s, up to an `Eof`.
41
41
fn parse_all_token_trees ( & mut self ) -> PResult < ' a , TokenStream > {
42
- let mut tts = Vec :: new ( ) ;
42
+ let mut buf = TokenStreamBuilder :: default ( ) ;
43
43
44
44
self . real_token ( ) ;
45
45
while self . token != token:: Eof {
46
- tts . push ( self . parse_token_tree ( ) ?) ;
46
+ buf . push ( self . parse_token_tree ( ) ?) ;
47
47
}
48
48
49
- Ok ( TokenStream :: new ( tts ) )
49
+ Ok ( buf . into_token_stream ( ) )
50
50
}
51
51
52
52
// Parse a stream of tokens into a list of `TokenTree`s, up to a `CloseDelim`.
53
53
fn parse_token_trees_until_close_delim ( & mut self ) -> TokenStream {
54
- let mut tts = vec ! [ ] ;
54
+ let mut buf = TokenStreamBuilder :: default ( ) ;
55
55
loop {
56
56
if let token:: CloseDelim ( ..) = self . token . kind {
57
- return TokenStream :: new ( tts ) ;
57
+ return buf . into_token_stream ( ) ;
58
58
}
59
59
60
60
match self . parse_token_tree ( ) {
61
- Ok ( tree) => tts . push ( tree) ,
61
+ Ok ( tree) => buf . push ( tree) ,
62
62
Err ( mut e) => {
63
63
e. emit ( ) ;
64
- return TokenStream :: new ( tts ) ;
64
+ return buf . into_token_stream ( ) ;
65
65
}
66
66
}
67
67
}
@@ -223,8 +223,32 @@ impl<'a> TokenTreesReader<'a> {
223
223
_ => {
224
224
self . token = token;
225
225
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
+ }
227
246
}
228
247
}
248
+ self . buf . push ( ( tree, joint) )
249
+ }
250
+
251
+ fn into_token_stream ( self ) -> TokenStream {
252
+ TokenStream :: new ( self . buf )
229
253
}
230
254
}
0 commit comments