Skip to content

Commit 266bb1f

Browse files
committed
Auto merge of #17994 - Veykril:proc-macro-srv-from-str-panic, r=Veykril
fix: Fix TokenStream::to_string implementation dropping quotation marks Fixes rust-lang/rust-analyzer#17986 We might wanna consider backporting this to beta if that's simple enough to do
2 parents 3a14e30 + 03d6745 commit 266bb1f

File tree

4 files changed

+23
-6
lines changed

4 files changed

+23
-6
lines changed

src/tools/rust-analyzer/crates/proc-macro-srv/src/server_impl/rust_analyzer_span.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,13 @@ impl server::TokenStream for RaSpanServer {
142142
stream.is_empty()
143143
}
144144
fn from_str(&mut self, src: &str) -> Self::TokenStream {
145-
Self::TokenStream::from_str(src, self.call_site).expect("cannot parse string")
145+
Self::TokenStream::from_str(src, self.call_site).unwrap_or_else(|e| {
146+
Self::TokenStream::from_str(
147+
&format!("compile_error!(\"failed to parse str to token stream: {e}\")"),
148+
self.call_site,
149+
)
150+
.unwrap()
151+
})
146152
}
147153
fn to_string(&mut self, stream: &Self::TokenStream) -> String {
148154
stream.to_string()
@@ -501,12 +507,17 @@ mod tests {
501507
close: span,
502508
kind: tt::DelimiterKind::Brace,
503509
},
504-
token_trees: Box::new([]),
510+
token_trees: Box::new([tt::TokenTree::Leaf(tt::Leaf::Literal(tt::Literal {
511+
kind: tt::LitKind::Str,
512+
symbol: Symbol::intern("string"),
513+
suffix: None,
514+
span,
515+
}))]),
505516
}),
506517
],
507518
};
508519

509-
assert_eq!(s.to_string(), "struct T {}");
520+
assert_eq!(s.to_string(), "struct T {\"string\"}");
510521
}
511522

512523
#[test]

src/tools/rust-analyzer/crates/proc-macro-srv/src/server_impl/token_id.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,13 @@ impl server::TokenStream for TokenIdServer {
131131
stream.is_empty()
132132
}
133133
fn from_str(&mut self, src: &str) -> Self::TokenStream {
134-
Self::TokenStream::from_str(src, self.call_site).expect("cannot parse string")
134+
Self::TokenStream::from_str(src, self.call_site).unwrap_or_else(|e| {
135+
Self::TokenStream::from_str(
136+
&format!("compile_error!(\"failed to parse str to token stream: {e}\")"),
137+
self.call_site,
138+
)
139+
.unwrap()
140+
})
135141
}
136142
fn to_string(&mut self, stream: &Self::TokenStream) -> String {
137143
stream.to_string()

src/tools/rust-analyzer/crates/proc-macro-srv/src/server_impl/token_stream.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ pub(super) mod token_stream {
131131
call_site,
132132
src,
133133
)
134-
.ok_or("lexing error")?;
134+
.ok_or_else(|| format!("lexing error: {src}"))?;
135135

136136
Ok(TokenStream::with_subtree(subtree))
137137
}

src/tools/rust-analyzer/crates/tt/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ pub fn pretty<S>(tkns: &[TokenTree<S>]) -> String {
603603
TokenTree::Leaf(Leaf::Ident(ident)) => {
604604
format!("{}{}", ident.is_raw.as_str(), ident.sym)
605605
}
606-
TokenTree::Leaf(Leaf::Literal(literal)) => literal.symbol.as_str().to_owned(),
606+
TokenTree::Leaf(Leaf::Literal(literal)) => format!("{literal}"),
607607
TokenTree::Leaf(Leaf::Punct(punct)) => format!("{}", punct.char),
608608
TokenTree::Subtree(subtree) => {
609609
let content = pretty(&subtree.token_trees);

0 commit comments

Comments
 (0)