Auto merge of #17994 - Veykril:proc-macro-srv-from-str-panic, r=Veykril

fix: Fix TokenStream::to_string implementation dropping quotation marks

Fixes https://github.com/rust-lang/rust-analyzer/issues/17986
We might wanna consider backporting this to beta if that's simple enough to do
This commit is contained in:
bors 2024-08-29 06:46:16 +00:00
commit 266bb1fd96
4 changed files with 23 additions and 6 deletions

View File

@ -142,7 +142,13 @@ fn is_empty(&mut self, stream: &Self::TokenStream) -> bool {
stream.is_empty() stream.is_empty()
} }
fn from_str(&mut self, src: &str) -> Self::TokenStream { fn from_str(&mut self, src: &str) -> Self::TokenStream {
Self::TokenStream::from_str(src, self.call_site).expect("cannot parse string") Self::TokenStream::from_str(src, self.call_site).unwrap_or_else(|e| {
Self::TokenStream::from_str(
&format!("compile_error!(\"failed to parse str to token stream: {e}\")"),
self.call_site,
)
.unwrap()
})
} }
fn to_string(&mut self, stream: &Self::TokenStream) -> String { fn to_string(&mut self, stream: &Self::TokenStream) -> String {
stream.to_string() stream.to_string()
@ -501,12 +507,17 @@ fn test_ra_server_to_string() {
close: span, close: span,
kind: tt::DelimiterKind::Brace, kind: tt::DelimiterKind::Brace,
}, },
token_trees: Box::new([]), token_trees: Box::new([tt::TokenTree::Leaf(tt::Leaf::Literal(tt::Literal {
kind: tt::LitKind::Str,
symbol: Symbol::intern("string"),
suffix: None,
span,
}))]),
}), }),
], ],
}; };
assert_eq!(s.to_string(), "struct T {}"); assert_eq!(s.to_string(), "struct T {\"string\"}");
} }
#[test] #[test]

View File

@ -131,7 +131,13 @@ fn is_empty(&mut self, stream: &Self::TokenStream) -> bool {
stream.is_empty() stream.is_empty()
} }
fn from_str(&mut self, src: &str) -> Self::TokenStream { fn from_str(&mut self, src: &str) -> Self::TokenStream {
Self::TokenStream::from_str(src, self.call_site).expect("cannot parse string") Self::TokenStream::from_str(src, self.call_site).unwrap_or_else(|e| {
Self::TokenStream::from_str(
&format!("compile_error!(\"failed to parse str to token stream: {e}\")"),
self.call_site,
)
.unwrap()
})
} }
fn to_string(&mut self, stream: &Self::TokenStream) -> String { fn to_string(&mut self, stream: &Self::TokenStream) -> String {
stream.to_string() stream.to_string()

View File

@ -131,7 +131,7 @@ pub(crate) fn from_str(src: &str, call_site: S) -> Result<TokenStream<S>, String
call_site, call_site,
src, src,
) )
.ok_or("lexing error")?; .ok_or_else(|| format!("lexing error: {src}"))?;
Ok(TokenStream::with_subtree(subtree)) Ok(TokenStream::with_subtree(subtree))
} }

View File

@ -603,7 +603,7 @@ fn tokentree_to_text<S>(tkn: &TokenTree<S>) -> String {
TokenTree::Leaf(Leaf::Ident(ident)) => { TokenTree::Leaf(Leaf::Ident(ident)) => {
format!("{}{}", ident.is_raw.as_str(), ident.sym) format!("{}{}", ident.is_raw.as_str(), ident.sym)
} }
TokenTree::Leaf(Leaf::Literal(literal)) => literal.symbol.as_str().to_owned(), TokenTree::Leaf(Leaf::Literal(literal)) => format!("{literal}"),
TokenTree::Leaf(Leaf::Punct(punct)) => format!("{}", punct.char), TokenTree::Leaf(Leaf::Punct(punct)) => format!("{}", punct.char),
TokenTree::Subtree(subtree) => { TokenTree::Subtree(subtree) => {
let content = pretty(&subtree.token_trees); let content = pretty(&subtree.token_trees);