Skip to content

Commit d781d02

Browse files
Escape raw names in labels properly
1 parent 5ff4ba3 commit d781d02

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

crates/hir-expand/src/name.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ impl Name {
191191
// FIXME: Remove this in favor of `display`, see fixme on `as_str`
192192
#[doc(hidden)]
193193
pub fn display_no_db(&self, edition: Edition) -> impl fmt::Display + '_ {
194-
Display { name: self, needs_escaping: is_raw_identifier(self.symbol.as_str(), edition) }
194+
Display { name: self, edition }
195195
}
196196

197197
pub fn symbol(&self) -> &Symbol {
@@ -201,15 +201,20 @@ impl Name {
201201

202202
struct Display<'a> {
203203
name: &'a Name,
204-
needs_escaping: bool,
204+
edition: Edition,
205205
}
206206

207207
impl fmt::Display for Display<'_> {
208208
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
209-
if self.needs_escaping {
210-
write!(f, "r#")?;
209+
let mut symbol = self.name.symbol.as_str();
210+
if let Some(s) = symbol.strip_prefix('\'') {
211+
f.write_str("'")?;
212+
symbol = s;
211213
}
212-
fmt::Display::fmt(self.name.symbol.as_str(), f)
214+
if is_raw_identifier(symbol, self.edition) {
215+
f.write_str("r#")?;
216+
}
217+
f.write_str(symbol)
213218
}
214219
}
215220

crates/ide-completion/src/tests/expression.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2110,3 +2110,19 @@ fn foo() {
21102110
"#]],
21112111
);
21122112
}
2113+
2114+
#[test]
2115+
fn escaped_label() {
2116+
check(
2117+
r#"
2118+
fn main() {
2119+
'r#break: {
2120+
break '$0;
2121+
}
2122+
}
2123+
"#,
2124+
expect![[r#"
2125+
lb 'r#break
2126+
"#]],
2127+
);
2128+
}

0 commit comments

Comments
 (0)