@@ -25,27 +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
- TokenStream { subtree }
37
+ if subtree. delimiter . is_some ( ) {
38
+ TokenStream { token_trees : vec ! [ TokenTree :: Subtree ( subtree) ] }
39
+ } else {
40
+ TokenStream { token_trees : subtree. token_trees }
41
+ }
42
+ }
43
+
44
+ pub fn into_subtree ( self ) -> tt:: Subtree {
45
+ tt:: Subtree { delimiter : None , token_trees : self . token_trees }
38
46
}
39
47
40
48
pub fn is_empty ( & self ) -> bool {
41
- self . subtree . token_trees . is_empty ( )
49
+ self . token_trees . is_empty ( )
42
50
}
43
51
}
44
52
45
53
/// Creates a token stream containing a single token tree.
46
54
impl From < TokenTree > for TokenStream {
47
55
fn from ( tree : TokenTree ) -> TokenStream {
48
- TokenStream { subtree : tt :: Subtree { delimiter : None , token_trees : vec ! [ tree] } }
56
+ TokenStream { token_trees : vec ! [ tree] }
49
57
}
50
58
}
51
59
@@ -78,10 +86,10 @@ impl Extend<TokenStream> for TokenStream {
78
86
for tkn in item {
79
87
match tkn {
80
88
tt:: TokenTree :: Subtree ( subtree) if subtree. delimiter . is_none ( ) => {
81
- self . subtree . token_trees . extend ( subtree. token_trees ) ;
89
+ self . token_trees . extend ( subtree. token_trees ) ;
82
90
}
83
91
_ => {
84
- self . subtree . token_trees . push ( tkn) ;
92
+ self . token_trees . push ( tkn) ;
85
93
}
86
94
}
87
95
}
@@ -164,7 +172,7 @@ pub mod token_stream {
164
172
type IntoIter = super :: IntoIter < TokenTree > ;
165
173
166
174
fn into_iter ( self ) -> Self :: IntoIter {
167
- self . subtree . token_trees . into_iter ( )
175
+ self . token_trees . into_iter ( )
168
176
}
169
177
}
170
178
@@ -185,28 +193,22 @@ pub mod token_stream {
185
193
mbe:: parse_to_token_tree ( src) . ok_or ( "Failed to parse from mbe" ) ?;
186
194
187
195
let subtree = subtree_replace_token_ids_with_unspecified ( subtree) ;
188
- Ok ( TokenStream { subtree } )
196
+ Ok ( TokenStream :: with_subtree ( subtree) )
189
197
}
190
198
}
191
199
192
200
impl ToString for TokenStream {
193
201
fn to_string ( & self ) -> String {
194
- let tt = self . subtree . clone ( ) . into ( ) ;
195
- to_text ( & tt)
196
- }
197
- }
202
+ return tokentrees_to_text ( & self . token_trees [ ..] ) ;
198
203
199
- fn to_text ( tkn : & tt:: TokenTree ) -> String {
200
- match tkn {
201
- tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( ident) ) => ident. text . clone ( ) . into ( ) ,
202
- tt:: TokenTree :: Leaf ( tt:: Leaf :: Literal ( literal) ) => literal. text . clone ( ) . into ( ) ,
203
- tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) => format ! ( "{}" , punct. char ) ,
204
- tt:: TokenTree :: Subtree ( subtree) => {
205
- let content = subtree
206
- . token_trees
207
- . iter ( )
204
+ fn tokentrees_to_text ( tkns : & [ tt:: TokenTree ] ) -> String {
205
+ tkns. iter ( )
208
206
. fold ( ( String :: new ( ) , true ) , |( last, last_to_joint) , tkn| {
209
- let s = [ last, to_text ( tkn) ] . join ( if last_to_joint { "" } else { " " } ) ;
207
+ let s = [ last, tokentree_to_text ( tkn) ] . join ( if last_to_joint {
208
+ ""
209
+ } else {
210
+ " "
211
+ } ) ;
210
212
let mut is_joint = false ;
211
213
if let tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) = tkn {
212
214
if punct. spacing == tt:: Spacing :: Joint {
@@ -215,15 +217,25 @@ pub mod token_stream {
215
217
}
216
218
( s, is_joint)
217
219
} )
218
- . 0 ;
219
-
220
- let ( open, close) = match subtree. delimiter . map ( |it| it. kind ) {
221
- None => ( "" , "" ) ,
222
- Some ( tt:: DelimiterKind :: Brace ) => ( "{" , "}" ) ,
223
- Some ( tt:: DelimiterKind :: Parenthesis ) => ( "(" , ")" ) ,
224
- Some ( tt:: DelimiterKind :: Bracket ) => ( "[" , "]" ) ,
225
- } ;
226
- format ! ( "{}{}{}" , open, content, close)
220
+ . 0
221
+ }
222
+
223
+ fn tokentree_to_text ( tkn : & tt:: TokenTree ) -> String {
224
+ match tkn {
225
+ tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( ident) ) => ident. text . clone ( ) . into ( ) ,
226
+ tt:: TokenTree :: Leaf ( tt:: Leaf :: Literal ( literal) ) => literal. text . clone ( ) . into ( ) ,
227
+ tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) => format ! ( "{}" , punct. char ) ,
228
+ tt:: TokenTree :: Subtree ( subtree) => {
229
+ let content = tokentrees_to_text ( & subtree. token_trees ) ;
230
+ let ( open, close) = match subtree. delimiter . map ( |it| it. kind ) {
231
+ None => ( "" , "" ) ,
232
+ Some ( tt:: DelimiterKind :: Brace ) => ( "{" , "}" ) ,
233
+ Some ( tt:: DelimiterKind :: Parenthesis ) => ( "(" , ")" ) ,
234
+ Some ( tt:: DelimiterKind :: Bracket ) => ( "[" , "]" ) ,
235
+ } ;
236
+ format ! ( "{}{}{}" , open, content, close)
237
+ }
238
+ }
227
239
}
228
240
}
229
241
}
@@ -433,20 +445,15 @@ fn spacing_to_external(spacing: Spacing) -> bridge::Spacing {
433
445
434
446
impl server:: Group for Rustc {
435
447
fn new ( & mut self , delimiter : bridge:: Delimiter , stream : Self :: TokenStream ) -> Self :: Group {
436
- Self :: Group {
437
- delimiter : delim_to_internal ( delimiter) ,
438
- token_trees : stream. subtree . token_trees ,
439
- }
448
+ Self :: Group { delimiter : delim_to_internal ( delimiter) , token_trees : stream. token_trees }
440
449
}
441
450
fn delimiter ( & mut self , group : & Self :: Group ) -> bridge:: Delimiter {
442
451
delim_to_external ( group. delimiter )
443
452
}
444
453
445
454
// NOTE: Return value of do not include delimiter
446
455
fn stream ( & mut self , group : & Self :: Group ) -> Self :: TokenStream {
447
- TokenStream {
448
- subtree : tt:: Subtree { delimiter : None , token_trees : group. token_trees . clone ( ) } ,
449
- }
456
+ TokenStream { token_trees : group. token_trees . clone ( ) }
450
457
}
451
458
452
459
fn span ( & mut self , group : & Self :: Group ) -> Self :: Span {
@@ -755,28 +762,48 @@ mod tests {
755
762
#[ test]
756
763
fn test_rustc_server_to_string ( ) {
757
764
let s = TokenStream {
758
- subtree : tt:: Subtree {
759
- delimiter : None ,
760
- token_trees : vec ! [
761
- tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( tt:: Ident {
762
- text: "struct" . into( ) ,
763
- id: tt:: TokenId :: unspecified( ) ,
764
- } ) ) ,
765
- tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( tt:: Ident {
766
- text: "T" . into( ) ,
765
+ token_trees : vec ! [
766
+ tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( tt:: Ident {
767
+ text: "struct" . into( ) ,
768
+ id: tt:: TokenId :: unspecified( ) ,
769
+ } ) ) ,
770
+ tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( tt:: Ident {
771
+ text: "T" . into( ) ,
772
+ id: tt:: TokenId :: unspecified( ) ,
773
+ } ) ) ,
774
+ tt:: TokenTree :: Subtree ( tt:: Subtree {
775
+ delimiter: Some ( tt:: Delimiter {
767
776
id: tt:: TokenId :: unspecified( ) ,
768
- } ) ) ,
769
- tt:: TokenTree :: Subtree ( tt:: Subtree {
770
- delimiter: Some ( tt:: Delimiter {
771
- id: tt:: TokenId :: unspecified( ) ,
772
- kind: tt:: DelimiterKind :: Brace ,
773
- } ) ,
774
- token_trees: vec![ ] ,
777
+ kind: tt:: DelimiterKind :: Brace ,
775
778
} ) ,
776
- ] ,
777
- } ,
779
+ token_trees: vec![ ] ,
780
+ } ) ,
781
+ ] ,
778
782
} ;
779
783
780
784
assert_eq ! ( s. to_string( ) , "struct T {}" ) ;
781
785
}
786
+
787
+ #[ test]
788
+ fn test_rustc_server_from_str ( ) {
789
+ use std:: str:: FromStr ;
790
+ let subtree_paren_a = tt:: TokenTree :: Subtree ( tt:: Subtree {
791
+ delimiter : Some ( tt:: Delimiter {
792
+ id : tt:: TokenId :: unspecified ( ) ,
793
+ kind : tt:: DelimiterKind :: Parenthesis ,
794
+ } ) ,
795
+ token_trees : vec ! [ tt:: TokenTree :: Leaf ( tt:: Leaf :: Ident ( tt:: Ident {
796
+ text: "a" . into( ) ,
797
+ id: tt:: TokenId :: unspecified( ) ,
798
+ } ) ) ] ,
799
+ } ) ;
800
+
801
+ let t1 = TokenStream :: from_str ( "(a)" ) . unwrap ( ) ;
802
+ assert_eq ! ( t1. token_trees. len( ) , 1 ) ;
803
+ assert_eq ! ( t1. token_trees[ 0 ] , subtree_paren_a) ;
804
+
805
+ let t2 = TokenStream :: from_str ( "(a);" ) . unwrap ( ) ;
806
+ assert_eq ! ( t2. token_trees. len( ) , 2 ) ;
807
+ assert_eq ! ( t2. token_trees[ 0 ] , subtree_paren_a) ;
808
+ }
782
809
}
0 commit comments