@@ -148,7 +148,7 @@ use crate::doc::{do_paste_doc, is_pasted_doc};
148
148
use crate :: error:: { Error , Result } ;
149
149
use crate :: segment:: Segment ;
150
150
use proc_macro:: { Delimiter , Group , Ident , Punct , Spacing , Span , TokenStream , TokenTree } ;
151
- use std:: iter:: { self , FromIterator } ;
151
+ use std:: iter;
152
152
use std:: panic;
153
153
154
154
#[ proc_macro]
@@ -199,8 +199,9 @@ fn expand(input: TokenStream, contains_paste: &mut bool) -> Result<TokenStream>
199
199
let span = group. span ( ) ;
200
200
if delimiter == Delimiter :: Bracket && is_paste_operation ( & content) {
201
201
let segments = parse_bracket_as_segments ( content, span) ?;
202
- let pasted = paste_segments ( span, & segments) ?;
203
- expanded. extend ( pasted) ;
202
+ let pasted = paste_segments ( & segments) ?;
203
+ let tokens = pasted_to_tokens ( pasted, span) ?;
204
+ expanded. extend ( tokens) ;
204
205
* contains_paste = true ;
205
206
} else if delimiter == Delimiter :: None && is_flat_group ( & content) {
206
207
expanded. extend ( content) ;
@@ -348,7 +349,7 @@ fn parse_bracket_as_segments(input: TokenStream, scope: Span) -> Result<Vec<Segm
348
349
}
349
350
}
350
351
351
- fn paste_segments ( span : Span , segments : & [ Segment ] ) -> Result < TokenStream > {
352
+ fn paste_segments ( segments : & [ Segment ] ) -> Result < String > {
352
353
let mut evaluated = Vec :: new ( ) ;
353
354
let mut is_lifetime = false ;
354
355
@@ -435,7 +436,23 @@ fn paste_segments(span: Span, segments: &[Segment]) -> Result<TokenStream> {
435
436
}
436
437
}
437
438
438
- let pasted = evaluated. into_iter ( ) . collect :: < String > ( ) ;
439
+ let mut pasted = evaluated. into_iter ( ) . collect :: < String > ( ) ;
440
+ if is_lifetime {
441
+ pasted. insert ( 0 , '\'' ) ;
442
+ }
443
+ Ok ( pasted)
444
+ }
445
+
446
+ fn pasted_to_tokens ( mut pasted : String , span : Span ) -> Result < TokenStream > {
447
+ let mut tokens = TokenStream :: new ( ) ;
448
+
449
+ if pasted. starts_with ( '\'' ) {
450
+ let mut apostrophe = TokenTree :: Punct ( Punct :: new ( '\'' , Spacing :: Joint ) ) ;
451
+ apostrophe. set_span ( span) ;
452
+ tokens. extend ( iter:: once ( apostrophe) ) ;
453
+ pasted. remove ( 0 ) ;
454
+ }
455
+
439
456
let ident = match panic:: catch_unwind ( || Ident :: new ( & pasted, span) ) {
440
457
Ok ( ident) => TokenTree :: Ident ( ident) ,
441
458
Err ( _) => {
@@ -445,11 +462,7 @@ fn paste_segments(span: Span, segments: &[Segment]) -> Result<TokenStream> {
445
462
) ) ;
446
463
}
447
464
} ;
448
- let tokens = if is_lifetime {
449
- let apostrophe = TokenTree :: Punct ( Punct :: new ( '\'' , Spacing :: Joint ) ) ;
450
- vec ! [ apostrophe, ident]
451
- } else {
452
- vec ! [ ident]
453
- } ;
454
- Ok ( TokenStream :: from_iter ( tokens) )
465
+
466
+ tokens. extend ( iter:: once ( ident) ) ;
467
+ Ok ( tokens)
455
468
}
0 commit comments