Rollup merge of #50946 - alexcrichton:fix-parse-lifetime, r=petrochenkov
rustc: Fix procedural macros generating lifetime tokens This commit fixes an accidental regression from #50473 where lifetime tokens produced by procedural macros ended up getting lost in translation in the compiler and not actually producing parseable code. The issue lies in the fact that a lifetime's `Ident` is prefixed with `'`. The `glue` implementation for gluing joint tokens together forgot to take this into account so the lifetime inside of `Ident` was missing the leading tick! The `glue` implementation here is updated to create a new `Symbol` in these situations to manufacture a new `Ident` with a leading tick to ensure it parses correctly. Closes #50942
This commit is contained in:
commit
aa63dce256
3 changed files with 65 additions and 1 deletions
|
@ -22,6 +22,7 @@ use serialize::{Decodable, Decoder, Encodable, Encoder};
|
|||
use symbol::keywords;
|
||||
use syntax::parse::parse_stream_from_source_str;
|
||||
use syntax_pos::{self, Span, FileName};
|
||||
use syntax_pos::symbol::{self, Symbol};
|
||||
use tokenstream::{TokenStream, TokenTree};
|
||||
use tokenstream;
|
||||
|
||||
|
@ -478,7 +479,13 @@ impl Token {
|
|||
_ => return None,
|
||||
},
|
||||
SingleQuote => match joint {
|
||||
Ident(ident, false) => Lifetime(ident),
|
||||
Ident(ident, false) => {
|
||||
let name = Symbol::intern(&format!("'{}", ident));
|
||||
Lifetime(symbol::Ident {
|
||||
name,
|
||||
span: ident.span,
|
||||
})
|
||||
}
|
||||
_ => return None,
|
||||
},
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue