Fix handling of raw idents in proc-macro2 shim

This commit is contained in:
David Tolnay
2023-07-18 18:28:28 -07:00
parent eb3f2329af
commit 1ddb6c2fdb
2 changed files with 15 additions and 4 deletions
+10 -3
View File
@@ -76,8 +76,13 @@ pub fn load(buf: &mut InputBuffer) -> TokenStream {
Kind::Ident => { Kind::Ident => {
let len = buf.read_u16(); let len = buf.read_u16();
let repr = buf.read_str(len as usize); let repr = buf.read_str(len as usize);
let ident = if let Some(repr) = repr.strip_prefix("r#") {
proc_macro2::Ident::new_raw(repr, proc_macro2::Span::call_site())
} else {
proc_macro2::Ident::new(repr, proc_macro2::Span::call_site())
};
trees.push(TokenTree::Ident(Ident { trees.push(TokenTree::Ident(Ident {
fallback: proc_macro2::Ident::new(repr, proc_macro2::Span::call_site()), fallback: ident,
span: next_span(), span: next_span(),
identity: next_ident(), identity: next_ident(),
})); }));
@@ -85,8 +90,9 @@ pub fn load(buf: &mut InputBuffer) -> TokenStream {
Kind::Punct(spacing) => { Kind::Punct(spacing) => {
let ch = buf.read_u8(); let ch = buf.read_u8();
assert!(ch.is_ascii()); assert!(ch.is_ascii());
let punct = proc_macro2::Punct::new(ch as char, spacing);
trees.push(TokenTree::Punct(Punct { trees.push(TokenTree::Punct(Punct {
fallback: proc_macro2::Punct::new(ch as char, spacing), fallback: punct,
span: next_span(), span: next_span(),
identity: next_punct(), identity: next_punct(),
})); }));
@@ -94,8 +100,9 @@ pub fn load(buf: &mut InputBuffer) -> TokenStream {
Kind::Literal => { Kind::Literal => {
let len = buf.read_u16(); let len = buf.read_u16();
let repr = buf.read_str(len as usize); let repr = buf.read_str(len as usize);
let literal = proc_macro2::Literal::from_str(repr).unwrap();
trees.push(TokenTree::Literal(Literal { trees.push(TokenTree::Literal(Literal {
fallback: proc_macro2::Literal::from_str(repr).unwrap(), fallback: literal,
span: next_span(), span: next_span(),
identity: next_literal(), identity: next_literal(),
})); }));
@@ -177,7 +177,11 @@ impl TokenMemory {
let len = buf.read_u16(); let len = buf.read_u16();
let repr = buf.read_str(len as usize); let repr = buf.read_str(len as usize);
let span = self.read_span(buf); let span = self.read_span(buf);
let ident = Ident::new(repr, span); let ident = if let Some(repr) = repr.strip_prefix("r#") {
Ident::new_raw(repr, span)
} else {
Ident::new(repr, span)
};
trees.push(TokenTree::Ident(ident)); trees.push(TokenTree::Ident(ident));
} }
Kind::Punct(spacing) => { Kind::Punct(spacing) => {