Unnamed repository; edit this file 'description' to name the repository.
Escape raw names in labels properly
Chayim Refael Friedman 2025-04-27
parent 5ff4ba3 · commit d781d02
-rw-r--r--crates/hir-expand/src/name.rs15
-rw-r--r--crates/ide-completion/src/tests/expression.rs16
2 files changed, 26 insertions, 5 deletions
diff --git a/crates/hir-expand/src/name.rs b/crates/hir-expand/src/name.rs
index d43ef38f29..37290edae4 100644
--- a/crates/hir-expand/src/name.rs
+++ b/crates/hir-expand/src/name.rs
@@ -191,7 +191,7 @@ impl Name {
// FIXME: Remove this in favor of `display`, see fixme on `as_str`
#[doc(hidden)]
pub fn display_no_db(&self, edition: Edition) -> impl fmt::Display + '_ {
- Display { name: self, needs_escaping: is_raw_identifier(self.symbol.as_str(), edition) }
+ Display { name: self, edition }
}
pub fn symbol(&self) -> &Symbol {
@@ -201,15 +201,20 @@ impl Name {
struct Display<'a> {
name: &'a Name,
- needs_escaping: bool,
+ edition: Edition,
}
impl fmt::Display for Display<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- if self.needs_escaping {
- write!(f, "r#")?;
+ let mut symbol = self.name.symbol.as_str();
+ if let Some(s) = symbol.strip_prefix('\'') {
+ f.write_str("'")?;
+ symbol = s;
}
- fmt::Display::fmt(self.name.symbol.as_str(), f)
+ if is_raw_identifier(symbol, self.edition) {
+ f.write_str("r#")?;
+ }
+ f.write_str(symbol)
}
}
diff --git a/crates/ide-completion/src/tests/expression.rs b/crates/ide-completion/src/tests/expression.rs
index b30ac43bf8..27d6bc7b14 100644
--- a/crates/ide-completion/src/tests/expression.rs
+++ b/crates/ide-completion/src/tests/expression.rs
@@ -2110,3 +2110,19 @@ fn foo() {
"#]],
);
}
+
+#[test]
+fn escaped_label() {
+ check(
+ r#"
+fn main() {
+ 'r#break: {
+ break '$0;
+ }
+}
+ "#,
+ expect![[r#"
+ lb 'r#break
+ "#]],
+ );
+}