@@ -25,36 +25,35 @@ type Span = tt::TokenId;
25
25
26
26
#[ derive( Debug , Clone ) ]
27
27
pub struct TokenStream {
28
- pub subtree : tt :: Subtree ,
28
+ pub token_trees : Vec < TokenTree > ,
29
29
}
30
30
31
31
impl TokenStream {
32
32
pub fn new ( ) -> Self {
33
- TokenStream { subtree : Default :: default ( ) }
33
+ TokenStream { token_trees : Default :: default ( ) }
34
34
}
35
35
36
36
pub fn with_subtree ( subtree : tt:: Subtree ) -> Self {
37
37
if subtree. delimiter . is_some ( ) {
38
- TokenStream {
39
- subtree : tt:: Subtree {
40
- token_trees : vec ! [ TokenTree :: Subtree ( subtree) ] ,
41
- delimiter : None ,
42
- } ,
43
- }
38
+ TokenStream { token_trees : vec ! [ TokenTree :: Subtree ( subtree) ] }
44
39
} else {
45
- TokenStream { subtree }
40
+ TokenStream { token_trees : subtree. token_trees }
46
41
}
47
42
}
48
43
44
+ pub fn into_subtree ( self ) -> tt:: Subtree {
45
+ tt:: Subtree { delimiter : None , token_trees : self . token_trees }
46
+ }
47
+
49
48
pub fn is_empty ( & self ) -> bool {
50
- self . subtree . token_trees . is_empty ( )
49
+ self . token_trees . is_empty ( )
51
50
}
52
51
}
53
52
54
53
/// Creates a token stream containing a single token tree.
55
54
impl From < TokenTree > for TokenStream {
56
55
fn from ( tree : TokenTree ) -> TokenStream {
57
- TokenStream { subtree : tt :: Subtree { delimiter : None , token_trees : vec ! [ tree] } }
56
+ TokenStream { token_trees : vec ! [ tree] }
58
57
}
59
58
}
60
59
@@ -87,10 +86,10 @@ impl Extend<TokenStream> for TokenStream {
87
86
for tkn in item {
88
87
match tkn {
89
88
tt:: TokenTree :: Subtree ( subtree) if subtree. delimiter . is_none ( ) => {
90
- self . subtree . token_trees . extend ( subtree. token_trees ) ;
89
+ self . token_trees . extend ( subtree. token_trees ) ;
91
90
}
92
91
_ => {
93
- self . subtree . token_trees . push ( tkn) ;
92
+ self . token_trees . push ( tkn) ;
94
93
}
95
94
}
96
95
}
@@ -173,7 +172,7 @@ pub mod token_stream {
173
172
type IntoIter = super :: IntoIter < TokenTree > ;
174
173
175
174
fn into_iter ( self ) -> Self :: IntoIter {
176
- self . subtree . token_trees . into_iter ( )
175
+ self . token_trees . into_iter ( )
177
176
}
178
177
}
179
178
@@ -200,32 +199,32 @@ pub mod token_stream {
200
199
201
200
impl ToString for TokenStream {
202
201
fn to_string ( & self ) -> String {
203
- let tt = self . subtree . clone ( ) . into ( ) ;
204
- to_text ( & tt)
202
+ tokentrees_to_text ( & self . token_trees [ ..] )
205
203
}
206
204
}
207
205
208
- fn to_text ( tkn : & tt:: TokenTree ) -> String {
206
+ fn tokentrees_to_text ( tkns : & [ tt:: TokenTree ] ) -> String {
207
+ tkns. iter ( )
208
+ . fold ( ( String :: new ( ) , true ) , |( last, last_to_joint) , tkn| {
209
+ let s = [ last, tokentree_to_text ( tkn) ] . join ( if last_to_joint { "" } else { " " } ) ;
210
+ let mut is_joint = false ;
211
+ if let tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) = tkn {
212
+ if punct. spacing == tt:: Spacing :: Joint {
213
+ is_joint = true ;
214
+ }
215
+ }
216
+ ( s, is_joint)
217
+ } )
218
+ . 0
219
+ }
220
+
221
+ fn tokentree_to_text ( tkn : & tt:: TokenTree ) -> String {
209
222
match tkn {
210
223
tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( ident) ) => ident. text . clone ( ) . into ( ) ,
211
224
tt:: TokenTree :: Leaf ( tt:: Leaf :: Literal ( literal) ) => literal. text . clone ( ) . into ( ) ,
212
225
tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) => format ! ( "{}" , punct. char ) ,
213
226
tt:: TokenTree :: Subtree ( subtree) => {
214
- let content = subtree
215
- . token_trees
216
- . iter ( )
217
- . fold ( ( String :: new ( ) , true ) , |( last, last_to_joint) , tkn| {
218
- let s = [ last, to_text ( tkn) ] . join ( if last_to_joint { "" } else { " " } ) ;
219
- let mut is_joint = false ;
220
- if let tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) = tkn {
221
- if punct. spacing == tt:: Spacing :: Joint {
222
- is_joint = true ;
223
- }
224
- }
225
- ( s, is_joint)
226
- } )
227
- . 0 ;
228
-
227
+ let content = tokentrees_to_text ( & subtree. token_trees ) ;
229
228
let ( open, close) = match subtree. delimiter . map ( |it| it. kind ) {
230
229
None => ( "" , "" ) ,
231
230
Some ( tt:: DelimiterKind :: Brace ) => ( "{" , "}" ) ,
@@ -442,20 +441,15 @@ fn spacing_to_external(spacing: Spacing) -> bridge::Spacing {
442
441
443
442
impl server:: Group for Rustc {
444
443
fn new ( & mut self , delimiter : bridge:: Delimiter , stream : Self :: TokenStream ) -> Self :: Group {
445
- Self :: Group {
446
- delimiter : delim_to_internal ( delimiter) ,
447
- token_trees : stream. subtree . token_trees ,
448
- }
444
+ Self :: Group { delimiter : delim_to_internal ( delimiter) , token_trees : stream. token_trees }
449
445
}
450
446
fn delimiter ( & mut self , group : & Self :: Group ) -> bridge:: Delimiter {
451
447
delim_to_external ( group. delimiter )
452
448
}
453
449
454
450
// NOTE: Return value of do not include delimiter
455
451
fn stream ( & mut self , group : & Self :: Group ) -> Self :: TokenStream {
456
- TokenStream {
457
- subtree : tt:: Subtree { delimiter : None , token_trees : group. token_trees . clone ( ) } ,
458
- }
452
+ TokenStream { token_trees : group. token_trees . clone ( ) }
459
453
}
460
454
461
455
fn span ( & mut self , group : & Self :: Group ) -> Self :: Span {
@@ -764,26 +758,23 @@ mod tests {
764
758
#[ test]
765
759
fn test_rustc_server_to_string ( ) {
766
760
let s = TokenStream {
767
- subtree : tt:: Subtree {
768
- delimiter : None ,
769
- token_trees : vec ! [
770
- tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( tt:: Ident {
771
- text: "struct" . into( ) ,
772
- id: tt:: TokenId :: unspecified( ) ,
773
- } ) ) ,
774
- tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( tt:: Ident {
775
- text: "T" . into( ) ,
761
+ token_trees : vec ! [
762
+ tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( tt:: Ident {
763
+ text: "struct" . into( ) ,
764
+ id: tt:: TokenId :: unspecified( ) ,
765
+ } ) ) ,
766
+ tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( tt:: Ident {
767
+ text: "T" . into( ) ,
768
+ id: tt:: TokenId :: unspecified( ) ,
769
+ } ) ) ,
770
+ tt:: TokenTree :: Subtree ( tt:: Subtree {
771
+ delimiter: Some ( tt:: Delimiter {
776
772
id: tt:: TokenId :: unspecified( ) ,
777
- } ) ) ,
778
- tt:: TokenTree :: Subtree ( tt:: Subtree {
779
- delimiter: Some ( tt:: Delimiter {
780
- id: tt:: TokenId :: unspecified( ) ,
781
- kind: tt:: DelimiterKind :: Brace ,
782
- } ) ,
783
- token_trees: vec![ ] ,
773
+ kind: tt:: DelimiterKind :: Brace ,
784
774
} ) ,
785
- ] ,
786
- } ,
775
+ token_trees: vec![ ] ,
776
+ } ) ,
777
+ ] ,
787
778
} ;
788
779
789
780
assert_eq ! ( s. to_string( ) , "struct T {}" ) ;
@@ -804,11 +795,11 @@ mod tests {
804
795
} ) ;
805
796
806
797
let t1 = TokenStream :: from_str ( "(a)" ) . unwrap ( ) ;
807
- assert_eq ! ( t1. subtree . token_trees. len( ) , 1 ) ;
808
- assert_eq ! ( t1. subtree . token_trees[ 0 ] , subtree_paren_a) ;
798
+ assert_eq ! ( t1. token_trees. len( ) , 1 ) ;
799
+ assert_eq ! ( t1. token_trees[ 0 ] , subtree_paren_a) ;
809
800
810
801
let t2 = TokenStream :: from_str ( "(a);" ) . unwrap ( ) ;
811
- assert_eq ! ( t2. subtree . token_trees. len( ) , 2 ) ;
812
- assert_eq ! ( t2. subtree . token_trees[ 0 ] , subtree_paren_a) ;
802
+ assert_eq ! ( t2. token_trees. len( ) , 2 ) ;
803
+ assert_eq ! ( t2. token_trees[ 0 ] , subtree_paren_a) ;
813
804
}
814
805
}
0 commit comments