11use 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 } ;
36use rustc_ast as ast;
47use rustc_ast:: token;
58use rustc_ast:: tokenstream:: { self , Spacing :: * , TokenStream } ;
@@ -13,11 +16,7 @@ use rustc_session::parse::ParseSess;
1316use rustc_span:: def_id:: CrateNum ;
1417use rustc_span:: symbol:: { self , sym, Symbol } ;
1518use 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 } ;
2120use std:: ops:: Bound ;
2221
2322trait FromInternal < T > {
@@ -253,23 +252,57 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)> for Vec<TokenTree<TokenStre
253252 }
254253}
255254
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 ] > {
258260 use rustc_ast:: token:: * ;
259261
260262 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+ }
263296 TokenTree :: Group ( Group { delimiter, stream, span : DelimSpan { open, close, .. } } ) => {
264- return tokenstream:: TokenStream :: delimited (
297+ smallvec ! [ tokenstream:: TokenTree :: Delimited (
265298 tokenstream:: DelimSpan { open, close } ,
266299 delimiter. to_internal( ) ,
267300 stream. unwrap_or_default( ) ,
268- ) ;
301+ ) ]
269302 }
270303 TokenTree :: Ident ( self :: Ident { sym, is_raw, span } ) => {
271304 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) ]
273306 }
274307 TokenTree :: Literal ( self :: Literal {
275308 kind : self :: LitKind :: Integer ,
@@ -282,7 +315,7 @@ impl ToInternal<TokenStream> for (TokenTree<TokenStream, Span, Symbol>, &mut Rus
282315 let integer = TokenKind :: lit ( token:: Integer , symbol, suffix) ;
283316 let a = tokenstream:: TokenTree :: token_alone ( minus, span) ;
284317 let b = tokenstream:: TokenTree :: token_alone ( integer, span) ;
285- return [ a, b] . into_iter ( ) . collect ( ) ;
318+ smallvec ! [ a, b]
286319 }
287320 TokenTree :: Literal ( self :: Literal {
288321 kind : self :: LitKind :: Float ,
@@ -295,46 +328,14 @@ impl ToInternal<TokenStream> for (TokenTree<TokenStream, Span, Symbol>, &mut Rus
295328 let float = TokenKind :: lit ( token:: Float , symbol, suffix) ;
296329 let a = tokenstream:: TokenTree :: token_alone ( minus, span) ;
297330 let b = tokenstream:: TokenTree :: token_alone ( float, span) ;
298- return [ a, b] . into_iter ( ) . collect ( ) ;
331+ smallvec ! [ a, b]
299332 }
300333 TokenTree :: Literal ( self :: Literal { kind, symbol, suffix, span } ) => {
301- return tokenstream:: TokenStream :: token_alone (
334+ smallvec ! [ tokenstream:: TokenTree :: token_alone(
302335 TokenKind :: lit( kind. to_internal( ) , symbol, suffix) ,
303336 span,
304- ) ;
337+ ) ]
305338 }
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)
338339 }
339340 }
340341}
@@ -549,37 +550,35 @@ impl server::TokenStream for Rustc<'_, '_> {
549550 & mut self ,
550551 tree : TokenTree < Self :: TokenStream , Self :: Span , Self :: Symbol > ,
551552 ) -> Self :: TokenStream {
552- ( tree, & mut * self ) . to_internal ( )
553+ Self :: TokenStream :: new ( ( tree, & mut * self ) . to_internal ( ) . into_iter ( ) . collect :: < Vec < _ > > ( ) )
553554 }
554555
555556 fn concat_trees (
556557 & mut self ,
557558 base : Option < Self :: TokenStream > ,
558559 trees : Vec < TokenTree < Self :: TokenStream , Self :: Span , Self :: Symbol > > ,
559560 ) -> 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 ( ) } ;
564563 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+ }
566567 }
567- builder . build ( )
568+ stream
568569 }
569570
570571 fn concat_streams (
571572 & mut self ,
572573 base : Option < Self :: TokenStream > ,
573574 streams : Vec < Self :: TokenStream > ,
574575 ) -> 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) ;
578580 }
579- for stream in streams {
580- builder. push ( stream) ;
581- }
582- builder. build ( )
581+ stream
583582 }
584583
585584 fn into_trees (
@@ -705,6 +704,7 @@ impl server::Span for Rustc<'_, '_> {
705704 fn source_text ( & mut self , span : Self :: Span ) -> Option < String > {
706705 self . sess ( ) . source_map ( ) . span_to_snippet ( span) . ok ( )
707706 }
707+
708708 /// Saves the provided span into the metadata of
709709 /// *the crate we are currently compiling*, which must
710710 /// be a proc-macro crate. This id can be passed to
0 commit comments