Escape raw names in labels properly

This commit is contained in:
Chayim Refael Friedman 2025-04-26 21:10:43 +03:00
parent 5ff4ba347d
commit d781d02cf4
2 changed files with 26 additions and 5 deletions

View file

@ -191,7 +191,7 @@ impl Name {
// FIXME: Remove this in favor of `display`, see fixme on `as_str` // FIXME: Remove this in favor of `display`, see fixme on `as_str`
#[doc(hidden)] #[doc(hidden)]
pub fn display_no_db(&self, edition: Edition) -> impl fmt::Display + '_ { 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 { pub fn symbol(&self) -> &Symbol {
@ -201,15 +201,20 @@ impl Name {
struct Display<'a> { struct Display<'a> {
name: &'a Name, name: &'a Name,
needs_escaping: bool, edition: Edition,
} }
impl fmt::Display for Display<'_> { impl fmt::Display for Display<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.needs_escaping { let mut symbol = self.name.symbol.as_str();
write!(f, "r#")?; 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)
} }
} }

View file

@ -2110,3 +2110,19 @@ fn foo() {
"#]], "#]],
); );
} }
#[test]
fn escaped_label() {
check(
r#"
fn main() {
'r#break: {
break '$0;
}
}
"#,
expect![[r#"
lb 'r#break
"#]],
);
}