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:
commit
266bb1fd96
@ -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]
|
||||||
|
@ -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()
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user