Merge pull request #19699 from ChayimFriedman2/escape-label

fix: Escape raw names in labels properly
This commit is contained in:
David Barsky 2025-04-28 21:12:21 +00:00 committed by GitHub
commit 0b02aed854
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 36 additions and 7 deletions

View file

@ -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,28 @@ 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 symbol == "'static" {
// FIXME: '`static` can also be a label, and there it does need escaping.
// But knowing where it is will require adding a parameter to `display()`,
// and that is an infectious change.
return f.write_str(symbol);
}
fmt::Display::fmt(self.name.symbol.as_str(), f)
if let Some(s) = symbol.strip_prefix('\'') {
f.write_str("'")?;
symbol = s;
}
if is_raw_identifier(symbol, self.edition) {
f.write_str("r#")?;
}
f.write_str(symbol)
}
}

View file

@ -116,13 +116,13 @@ fn foo<'lifetime>(foo: &'a$0) {}
check(
r#"
struct Foo;
impl<'impl> Foo {
impl<'r#impl> Foo {
fn foo<'func>(&'a$0 self) {}
}
"#,
expect![[r#"
lt 'func
lt 'impl
lt 'r#impl
lt 'static
"#]],
);

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
"#]],
);
}