1
1
use crate :: base:: ExtCtxt ;
2
-
2
+ use pm:: bridge:: {
3
+ server, DelimSpan , Diagnostic , ExpnGlobals , Group , Ident , LitKind , Literal , Punct , TokenTree ,
4
+ } ;
5
+ use pm:: { Delimiter , Level , LineColumn } ;
3
6
use rustc_ast as ast;
4
7
use rustc_ast:: token;
5
8
use rustc_ast:: tokenstream:: { self , Spacing :: * , TokenStream } ;
@@ -13,11 +16,7 @@ use rustc_session::parse::ParseSess;
13
16
use rustc_span:: def_id:: CrateNum ;
14
17
use rustc_span:: symbol:: { self , sym, Symbol } ;
15
18
use rustc_span:: { BytePos , FileName , Pos , SourceFile , Span } ;
16
-
17
- use pm:: bridge:: {
18
- server, DelimSpan , Diagnostic , ExpnGlobals , Group , Ident , LitKind , Literal , Punct , TokenTree ,
19
- } ;
20
- use pm:: { Delimiter , Level , LineColumn } ;
19
+ use smallvec:: { smallvec, SmallVec } ;
21
20
use std:: ops:: Bound ;
22
21
23
22
trait FromInternal < T > {
@@ -253,23 +252,57 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)> for Vec<TokenTree<TokenStre
253
252
}
254
253
}
255
254
256
- impl ToInternal < TokenStream > for ( TokenTree < TokenStream , Span , Symbol > , & mut Rustc < ' _ , ' _ > ) {
257
- fn to_internal ( self ) -> TokenStream {
255
+ // We use a `SmallVec` because the output size is always one or two `TokenTree`s.
256
+ impl ToInternal < SmallVec < [ tokenstream:: TokenTree ; 2 ] > >
257
+ for ( TokenTree < TokenStream , Span , Symbol > , & mut Rustc < ' _ , ' _ > )
258
+ {
259
+ fn to_internal ( self ) -> SmallVec < [ tokenstream:: TokenTree ; 2 ] > {
258
260
use rustc_ast:: token:: * ;
259
261
260
262
let ( tree, rustc) = self ;
261
- let ( ch, joint, span) = match tree {
262
- TokenTree :: Punct ( Punct { ch, joint, span } ) => ( ch, joint, span) ,
263
+ match tree {
264
+ TokenTree :: Punct ( Punct { ch, joint, span } ) => {
265
+ let kind = match ch {
266
+ b'=' => Eq ,
267
+ b'<' => Lt ,
268
+ b'>' => Gt ,
269
+ b'!' => Not ,
270
+ b'~' => Tilde ,
271
+ b'+' => BinOp ( Plus ) ,
272
+ b'-' => BinOp ( Minus ) ,
273
+ b'*' => BinOp ( Star ) ,
274
+ b'/' => BinOp ( Slash ) ,
275
+ b'%' => BinOp ( Percent ) ,
276
+ b'^' => BinOp ( Caret ) ,
277
+ b'&' => BinOp ( And ) ,
278
+ b'|' => BinOp ( Or ) ,
279
+ b'@' => At ,
280
+ b'.' => Dot ,
281
+ b',' => Comma ,
282
+ b';' => Semi ,
283
+ b':' => Colon ,
284
+ b'#' => Pound ,
285
+ b'$' => Dollar ,
286
+ b'?' => Question ,
287
+ b'\'' => SingleQuote ,
288
+ _ => unreachable ! ( ) ,
289
+ } ;
290
+ smallvec ! [ if joint {
291
+ tokenstream:: TokenTree :: token_joint( kind, span)
292
+ } else {
293
+ tokenstream:: TokenTree :: token_alone( kind, span)
294
+ } ]
295
+ }
263
296
TokenTree :: Group ( Group { delimiter, stream, span : DelimSpan { open, close, .. } } ) => {
264
- return tokenstream:: TokenStream :: delimited (
297
+ smallvec ! [ tokenstream:: TokenTree :: Delimited (
265
298
tokenstream:: DelimSpan { open, close } ,
266
299
delimiter. to_internal( ) ,
267
300
stream. unwrap_or_default( ) ,
268
- ) ;
301
+ ) ]
269
302
}
270
303
TokenTree :: Ident ( self :: Ident { sym, is_raw, span } ) => {
271
304
rustc. sess ( ) . symbol_gallery . insert ( sym, span) ;
272
- return tokenstream:: TokenStream :: token_alone ( Ident ( sym, is_raw) , span) ;
305
+ smallvec ! [ tokenstream:: TokenTree :: token_alone( Ident ( sym, is_raw) , span) ]
273
306
}
274
307
TokenTree :: Literal ( self :: Literal {
275
308
kind : self :: LitKind :: Integer ,
@@ -282,7 +315,7 @@ impl ToInternal<TokenStream> for (TokenTree<TokenStream, Span, Symbol>, &mut Rus
282
315
let integer = TokenKind :: lit ( token:: Integer , symbol, suffix) ;
283
316
let a = tokenstream:: TokenTree :: token_alone ( minus, span) ;
284
317
let b = tokenstream:: TokenTree :: token_alone ( integer, span) ;
285
- return [ a, b] . into_iter ( ) . collect ( ) ;
318
+ smallvec ! [ a, b]
286
319
}
287
320
TokenTree :: Literal ( self :: Literal {
288
321
kind : self :: LitKind :: Float ,
@@ -295,46 +328,14 @@ impl ToInternal<TokenStream> for (TokenTree<TokenStream, Span, Symbol>, &mut Rus
295
328
let float = TokenKind :: lit ( token:: Float , symbol, suffix) ;
296
329
let a = tokenstream:: TokenTree :: token_alone ( minus, span) ;
297
330
let b = tokenstream:: TokenTree :: token_alone ( float, span) ;
298
- return [ a, b] . into_iter ( ) . collect ( ) ;
331
+ smallvec ! [ a, b]
299
332
}
300
333
TokenTree :: Literal ( self :: Literal { kind, symbol, suffix, span } ) => {
301
- return tokenstream:: TokenStream :: token_alone (
334
+ smallvec ! [ tokenstream:: TokenTree :: token_alone(
302
335
TokenKind :: lit( kind. to_internal( ) , symbol, suffix) ,
303
336
span,
304
- ) ;
337
+ ) ]
305
338
}
306
- } ;
307
-
308
- let kind = match ch {
309
- b'=' => Eq ,
310
- b'<' => Lt ,
311
- b'>' => Gt ,
312
- b'!' => Not ,
313
- b'~' => Tilde ,
314
- b'+' => BinOp ( Plus ) ,
315
- b'-' => BinOp ( Minus ) ,
316
- b'*' => BinOp ( Star ) ,
317
- b'/' => BinOp ( Slash ) ,
318
- b'%' => BinOp ( Percent ) ,
319
- b'^' => BinOp ( Caret ) ,
320
- b'&' => BinOp ( And ) ,
321
- b'|' => BinOp ( Or ) ,
322
- b'@' => At ,
323
- b'.' => Dot ,
324
- b',' => Comma ,
325
- b';' => Semi ,
326
- b':' => Colon ,
327
- b'#' => Pound ,
328
- b'$' => Dollar ,
329
- b'?' => Question ,
330
- b'\'' => SingleQuote ,
331
- _ => unreachable ! ( ) ,
332
- } ;
333
-
334
- if joint {
335
- tokenstream:: TokenStream :: token_joint ( kind, span)
336
- } else {
337
- tokenstream:: TokenStream :: token_alone ( kind, span)
338
339
}
339
340
}
340
341
}
@@ -549,37 +550,35 @@ impl server::TokenStream for Rustc<'_, '_> {
549
550
& mut self ,
550
551
tree : TokenTree < Self :: TokenStream , Self :: Span , Self :: Symbol > ,
551
552
) -> Self :: TokenStream {
552
- ( tree, & mut * self ) . to_internal ( )
553
+ Self :: TokenStream :: new ( ( tree, & mut * self ) . to_internal ( ) . into_iter ( ) . collect :: < Vec < _ > > ( ) )
553
554
}
554
555
555
556
fn concat_trees (
556
557
& mut self ,
557
558
base : Option < Self :: TokenStream > ,
558
559
trees : Vec < TokenTree < Self :: TokenStream , Self :: Span , Self :: Symbol > > ,
559
560
) -> Self :: TokenStream {
560
- let mut builder = tokenstream:: TokenStreamBuilder :: new ( ) ;
561
- if let Some ( base) = base {
562
- builder. push ( base) ;
563
- }
561
+ let mut stream =
562
+ if let Some ( base) = base { base } else { tokenstream:: TokenStream :: default ( ) } ;
564
563
for tree in trees {
565
- builder. push ( ( tree, & mut * self ) . to_internal ( ) ) ;
564
+ for tt in ( tree, & mut * self ) . to_internal ( ) {
565
+ stream. push_tree ( tt) ;
566
+ }
566
567
}
567
- builder . build ( )
568
+ stream
568
569
}
569
570
570
571
fn concat_streams (
571
572
& mut self ,
572
573
base : Option < Self :: TokenStream > ,
573
574
streams : Vec < Self :: TokenStream > ,
574
575
) -> Self :: TokenStream {
575
- let mut builder = tokenstream:: TokenStreamBuilder :: new ( ) ;
576
- if let Some ( base) = base {
577
- builder. push ( base) ;
576
+ let mut stream =
577
+ if let Some ( base) = base { base } else { tokenstream:: TokenStream :: default ( ) } ;
578
+ for s in streams {
579
+ stream. push_stream ( s) ;
578
580
}
579
- for stream in streams {
580
- builder. push ( stream) ;
581
- }
582
- builder. build ( )
581
+ stream
583
582
}
584
583
585
584
fn into_trees (
@@ -705,6 +704,7 @@ impl server::Span for Rustc<'_, '_> {
705
704
fn source_text ( & mut self , span : Self :: Span ) -> Option < String > {
706
705
self . sess ( ) . source_map ( ) . span_to_snippet ( span) . ok ( )
707
706
}
707
+
708
708
/// Saves the provided span into the metadata of
709
709
/// *the crate we are currently compiling*, which must
710
710
/// be a proc-macro crate. This id can be passed to
0 commit comments