@@ -43,7 +43,7 @@ use std::cmp::Ordering;
43
43
use std:: ops:: RangeBounds ;
44
44
use std:: path:: PathBuf ;
45
45
use std:: str:: FromStr ;
46
- use std:: { error, fmt, iter, mem } ;
46
+ use std:: { error, fmt, iter} ;
47
47
48
48
/// Determines whether proc_macro has been made accessible to the currently
49
49
/// running program.
@@ -72,7 +72,7 @@ pub fn is_available() -> bool {
72
72
/// and `#[proc_macro_derive]` definitions.
73
73
#[ stable( feature = "proc_macro_lib" , since = "1.15.0" ) ]
74
74
#[ derive( Clone ) ]
75
- pub struct TokenStream ( bridge:: client:: TokenStream ) ;
75
+ pub struct TokenStream ( Option < bridge:: client:: TokenStream > ) ;
76
76
77
77
#[ stable( feature = "proc_macro_lib" , since = "1.15.0" ) ]
78
78
impl !Send for TokenStream { }
@@ -126,13 +126,13 @@ impl TokenStream {
126
126
/// Returns an empty `TokenStream` containing no token trees.
127
127
#[ stable( feature = "proc_macro_lib2" , since = "1.29.0" ) ]
128
128
pub fn new ( ) -> TokenStream {
129
- TokenStream ( bridge :: client :: TokenStream :: new ( ) )
129
+ TokenStream ( None )
130
130
}
131
131
132
132
/// Checks if this `TokenStream` is empty.
133
133
#[ stable( feature = "proc_macro_lib2" , since = "1.29.0" ) ]
134
134
pub fn is_empty ( & self ) -> bool {
135
- self . 0 . is_empty ( )
135
+ self . 0 . as_ref ( ) . map ( |h| h . is_empty ( ) ) . unwrap_or ( true )
136
136
}
137
137
138
138
/// Parses this `TokenStream` as an expression and attempts to expand any
@@ -147,8 +147,9 @@ impl TokenStream {
147
147
/// considered errors, is unspecified and may change in the future.
148
148
#[ unstable( feature = "proc_macro_expand" , issue = "90765" ) ]
149
149
pub fn expand_expr ( & self ) -> Result < TokenStream , ExpandError > {
150
- match bridge:: client:: TokenStream :: expand_expr ( & self . 0 ) {
151
- Ok ( stream) => Ok ( TokenStream ( stream) ) ,
150
+ let stream = self . 0 . as_ref ( ) . ok_or ( ExpandError ) ?;
151
+ match bridge:: client:: TokenStream :: expand_expr ( stream) {
152
+ Ok ( stream) => Ok ( TokenStream ( Some ( stream) ) ) ,
152
153
Err ( _) => Err ( ExpandError ) ,
153
154
}
154
155
}
@@ -166,7 +167,7 @@ impl FromStr for TokenStream {
166
167
type Err = LexError ;
167
168
168
169
fn from_str ( src : & str ) -> Result < TokenStream , LexError > {
169
- Ok ( TokenStream ( bridge:: client:: TokenStream :: from_str ( src) ) )
170
+ Ok ( TokenStream ( Some ( bridge:: client:: TokenStream :: from_str ( src) ) ) )
170
171
}
171
172
}
172
173
@@ -175,7 +176,7 @@ impl FromStr for TokenStream {
175
176
#[ stable( feature = "proc_macro_lib" , since = "1.15.0" ) ]
176
177
impl ToString for TokenStream {
177
178
fn to_string ( & self ) -> String {
178
- self . 0 . to_string ( )
179
+ self . 0 . as_ref ( ) . map ( |t| t . to_string ( ) ) . unwrap_or_default ( )
179
180
}
180
181
}
181
182
@@ -208,24 +209,38 @@ impl Default for TokenStream {
208
209
#[ unstable( feature = "proc_macro_quote" , issue = "54722" ) ]
209
210
pub use quote:: { quote, quote_span} ;
210
211
212
+ fn tree_to_bridge_tree (
213
+ tree : TokenTree ,
214
+ ) -> bridge:: TokenTree <
215
+ bridge:: client:: Group ,
216
+ bridge:: client:: Punct ,
217
+ bridge:: client:: Ident ,
218
+ bridge:: client:: Literal ,
219
+ > {
220
+ match tree {
221
+ TokenTree :: Group ( tt) => bridge:: TokenTree :: Group ( tt. 0 ) ,
222
+ TokenTree :: Punct ( tt) => bridge:: TokenTree :: Punct ( tt. 0 ) ,
223
+ TokenTree :: Ident ( tt) => bridge:: TokenTree :: Ident ( tt. 0 ) ,
224
+ TokenTree :: Literal ( tt) => bridge:: TokenTree :: Literal ( tt. 0 ) ,
225
+ }
226
+ }
227
+
211
228
/// Creates a token stream containing a single token tree.
212
229
#[ stable( feature = "proc_macro_lib2" , since = "1.29.0" ) ]
213
230
impl From < TokenTree > for TokenStream {
214
231
fn from ( tree : TokenTree ) -> TokenStream {
215
- TokenStream ( bridge:: client:: TokenStream :: from_token_tree ( match tree {
216
- TokenTree :: Group ( tt) => bridge:: TokenTree :: Group ( tt. 0 ) ,
217
- TokenTree :: Punct ( tt) => bridge:: TokenTree :: Punct ( tt. 0 ) ,
218
- TokenTree :: Ident ( tt) => bridge:: TokenTree :: Ident ( tt. 0 ) ,
219
- TokenTree :: Literal ( tt) => bridge:: TokenTree :: Literal ( tt. 0 ) ,
220
- } ) )
232
+ TokenStream ( Some ( bridge:: client:: TokenStream :: from_token_tree ( tree_to_bridge_tree ( tree) ) ) )
221
233
}
222
234
}
223
235
224
236
/// Collects a number of token trees into a single stream.
225
237
#[ stable( feature = "proc_macro_lib2" , since = "1.29.0" ) ]
226
238
impl iter:: FromIterator < TokenTree > for TokenStream {
227
239
fn from_iter < I : IntoIterator < Item = TokenTree > > ( trees : I ) -> Self {
228
- trees. into_iter ( ) . map ( TokenStream :: from) . collect ( )
240
+ TokenStream ( Some ( bridge:: client:: TokenStream :: concat_trees (
241
+ None ,
242
+ trees. into_iter ( ) . map ( tree_to_bridge_tree) . collect ( ) ,
243
+ ) ) )
229
244
}
230
245
}
231
246
@@ -234,24 +249,30 @@ impl iter::FromIterator<TokenTree> for TokenStream {
234
249
#[ stable( feature = "proc_macro_lib" , since = "1.15.0" ) ]
235
250
impl iter:: FromIterator < TokenStream > for TokenStream {
236
251
fn from_iter < I : IntoIterator < Item = TokenStream > > ( streams : I ) -> Self {
237
- let mut builder = bridge:: client:: TokenStreamBuilder :: new ( ) ;
238
- streams. into_iter ( ) . for_each ( |stream| builder. push ( stream. 0 ) ) ;
239
- TokenStream ( builder. build ( ) )
252
+ TokenStream ( Some ( bridge:: client:: TokenStream :: concat_streams (
253
+ None ,
254
+ streams. into_iter ( ) . filter_map ( |stream| stream. 0 ) . collect ( ) ,
255
+ ) ) )
240
256
}
241
257
}
242
258
243
259
#[ stable( feature = "token_stream_extend" , since = "1.30.0" ) ]
244
260
impl Extend < TokenTree > for TokenStream {
245
261
fn extend < I : IntoIterator < Item = TokenTree > > ( & mut self , trees : I ) {
246
- self . extend ( trees. into_iter ( ) . map ( TokenStream :: from) ) ;
262
+ * self = TokenStream ( Some ( bridge:: client:: TokenStream :: concat_trees (
263
+ self . 0 . take ( ) ,
264
+ trees. into_iter ( ) . map ( |tree| tree_to_bridge_tree ( tree) ) . collect ( ) ,
265
+ ) ) ) ;
247
266
}
248
267
}
249
268
250
269
#[ stable( feature = "token_stream_extend" , since = "1.30.0" ) ]
251
270
impl Extend < TokenStream > for TokenStream {
252
271
fn extend < I : IntoIterator < Item = TokenStream > > ( & mut self , streams : I ) {
253
- // FIXME(eddyb) Use an optimized implementation if/when possible.
254
- * self = iter:: once ( mem:: replace ( self , Self :: new ( ) ) ) . chain ( streams) . collect ( ) ;
272
+ * self = TokenStream ( Some ( bridge:: client:: TokenStream :: concat_streams (
273
+ self . 0 . take ( ) ,
274
+ streams. into_iter ( ) . filter_map ( |stream| stream. 0 ) . collect ( ) ,
275
+ ) ) ) ;
255
276
}
256
277
}
257
278
@@ -265,7 +286,16 @@ pub mod token_stream {
265
286
/// and returns whole groups as token trees.
266
287
#[ derive( Clone ) ]
267
288
#[ stable( feature = "proc_macro_lib2" , since = "1.29.0" ) ]
268
- pub struct IntoIter ( bridge:: client:: TokenStreamIter ) ;
289
+ pub struct IntoIter (
290
+ std:: vec:: IntoIter <
291
+ bridge:: TokenTree <
292
+ bridge:: client:: Group ,
293
+ bridge:: client:: Punct ,
294
+ bridge:: client:: Ident ,
295
+ bridge:: client:: Literal ,
296
+ > ,
297
+ > ,
298
+ ) ;
269
299
270
300
#[ stable( feature = "proc_macro_lib2" , since = "1.29.0" ) ]
271
301
impl Iterator for IntoIter {
@@ -287,7 +317,7 @@ pub mod token_stream {
287
317
type IntoIter = IntoIter ;
288
318
289
319
fn into_iter ( self ) -> IntoIter {
290
- IntoIter ( self . 0 . into_iter ( ) )
320
+ IntoIter ( self . 0 . map ( |v| v . into_iter ( ) ) . unwrap_or_default ( ) . into_iter ( ) )
291
321
}
292
322
}
293
323
}
@@ -734,7 +764,7 @@ impl Group {
734
764
/// returned above.
735
765
#[ stable( feature = "proc_macro_lib2" , since = "1.29.0" ) ]
736
766
pub fn stream ( & self ) -> TokenStream {
737
- TokenStream ( self . 0 . stream ( ) )
767
+ TokenStream ( Some ( self . 0 . stream ( ) ) )
738
768
}
739
769
740
770
/// Returns the span for the delimiters of this token stream, spanning the
0 commit comments