@@ -286,12 +286,12 @@ impl TokenStream {
286
286
TokenStream :: concat ( result)
287
287
}
288
288
289
- fn first_tree ( & self ) -> Option < TokenTree > {
289
+ fn first_tree_and_joint ( & self ) -> Option < ( TokenTree , bool ) > {
290
290
match self . kind {
291
291
TokenStreamKind :: Empty => None ,
292
- TokenStreamKind :: Tree ( ref tree) |
293
- TokenStreamKind :: JointTree ( ref tree) => Some ( tree. clone ( ) ) ,
294
- TokenStreamKind :: Stream ( ref stream) => stream. first ( ) . unwrap ( ) . first_tree ( ) ,
292
+ TokenStreamKind :: Tree ( ref tree) => Some ( ( tree . clone ( ) , false ) ) ,
293
+ TokenStreamKind :: JointTree ( ref tree) => Some ( ( tree. clone ( ) , true ) ) ,
294
+ TokenStreamKind :: Stream ( ref stream) => stream. first ( ) . unwrap ( ) . first_tree_and_joint ( ) ,
295
295
}
296
296
}
297
297
@@ -315,12 +315,18 @@ impl TokenStreamBuilder {
315
315
let stream = stream. into ( ) ;
316
316
let last_tree_if_joint = self . 0 . last ( ) . and_then ( TokenStream :: last_tree_if_joint) ;
317
317
if let Some ( TokenTree :: Token ( last_span, last_tok) ) = last_tree_if_joint {
318
- if let Some ( TokenTree :: Token ( span, tok) ) = stream. first_tree ( ) {
318
+ if let Some ( ( TokenTree :: Token ( span, tok) , is_joint ) ) = stream. first_tree_and_joint ( ) {
319
319
if let Some ( glued_tok) = last_tok. glue ( tok) {
320
320
let last_stream = self . 0 . pop ( ) . unwrap ( ) ;
321
321
self . push_all_but_last_tree ( & last_stream) ;
322
322
let glued_span = last_span. to ( span) ;
323
- self . 0 . push ( TokenTree :: Token ( glued_span, glued_tok) . into ( ) ) ;
323
+ let glued_tt = TokenTree :: Token ( glued_span, glued_tok) ;
324
+ let glued_tokenstream = if is_joint {
325
+ glued_tt. joint ( )
326
+ } else {
327
+ glued_tt. into ( )
328
+ } ;
329
+ self . 0 . push ( glued_tokenstream) ;
324
330
self . push_all_but_first_tree ( & stream) ;
325
331
return
326
332
}
@@ -669,4 +675,16 @@ mod tests {
669
675
assert_eq ! ( test1. is_empty( ) , false ) ;
670
676
assert_eq ! ( test2. is_empty( ) , false ) ;
671
677
}
678
+
679
+ #[ test]
680
+ fn test_dotdotdot ( ) {
681
+ let mut builder = TokenStreamBuilder :: new ( ) ;
682
+ builder. push ( TokenTree :: Token ( sp ( 0 , 1 ) , Token :: Dot ) . joint ( ) ) ;
683
+ builder. push ( TokenTree :: Token ( sp ( 1 , 2 ) , Token :: Dot ) . joint ( ) ) ;
684
+ builder. push ( TokenTree :: Token ( sp ( 2 , 3 ) , Token :: Dot ) ) ;
685
+ let stream = builder. build ( ) ;
686
+ assert ! ( stream. eq_unspanned( & string_to_ts( "..." ) ) ) ;
687
+ assert_eq ! ( stream. trees( ) . count( ) , 1 ) ;
688
+ }
689
+
672
690
}
0 commit comments