Rollup merge of #67010 - estebank:raw-idents, r=Centril
Accurately portray raw identifiers in error messages When refering to or suggesting raw identifiers, refer to them with `r#`. Fix #65634.
This commit is contained in:
commit
8e6cf861e5
@ -1282,6 +1282,9 @@ fn path_append(
|
||||
if !self.empty_path {
|
||||
write!(self, "::")?;
|
||||
}
|
||||
if ast::Ident::from_str(&name).is_raw_guess() {
|
||||
write!(self, "r#")?;
|
||||
}
|
||||
write!(self, "{}", name)?;
|
||||
|
||||
// FIXME(eddyb) this will print e.g. `{{closure}}#3`, but it
|
||||
|
@ -212,13 +212,13 @@ pub(super) fn default_submod_path(
|
||||
// `./<id>.rs` and `./<id>/mod.rs`.
|
||||
let relative_prefix_string;
|
||||
let relative_prefix = if let Some(ident) = relative {
|
||||
relative_prefix_string = format!("{}{}", ident, path::MAIN_SEPARATOR);
|
||||
relative_prefix_string = format!("{}{}", ident.name, path::MAIN_SEPARATOR);
|
||||
&relative_prefix_string
|
||||
} else {
|
||||
""
|
||||
};
|
||||
|
||||
let mod_name = id.to_string();
|
||||
let mod_name = id.name.to_string();
|
||||
let default_path_str = format!("{}{}.rs", relative_prefix, mod_name);
|
||||
let secondary_path_str = format!("{}{}{}mod.rs",
|
||||
relative_prefix, mod_name, path::MAIN_SEPARATOR);
|
||||
|
@ -869,12 +869,18 @@ fn hash<H: Hasher>(&self, state: &mut H) {
|
||||
|
||||
impl fmt::Debug for Ident {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
if self.is_raw_guess() {
|
||||
write!(f, "r#")?;
|
||||
}
|
||||
write!(f, "{}{:?}", self.name, self.span.ctxt())
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for Ident {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
if self.is_raw_guess() {
|
||||
write!(f, "r#")?;
|
||||
}
|
||||
fmt::Display::fmt(&self.name, f)
|
||||
}
|
||||
}
|
||||
|
22
src/test/ui/issues/issue-65634-raw-ident-suggestion.rs
Normal file
22
src/test/ui/issues/issue-65634-raw-ident-suggestion.rs
Normal file
@ -0,0 +1,22 @@
|
||||
#![allow(non_camel_case_types)]
|
||||
|
||||
trait r#async {
|
||||
fn r#struct(&self) {
|
||||
println!("async");
|
||||
}
|
||||
}
|
||||
|
||||
trait r#await {
|
||||
fn r#struct(&self) {
|
||||
println!("await");
|
||||
}
|
||||
}
|
||||
|
||||
struct r#fn {}
|
||||
|
||||
impl r#async for r#fn {}
|
||||
impl r#await for r#fn {}
|
||||
|
||||
fn main() {
|
||||
r#fn {}.r#struct(); //~ ERROR multiple applicable items in scope
|
||||
}
|
22
src/test/ui/issues/issue-65634-raw-ident-suggestion.stderr
Normal file
22
src/test/ui/issues/issue-65634-raw-ident-suggestion.stderr
Normal file
@ -0,0 +1,22 @@
|
||||
error[E0034]: multiple applicable items in scope
|
||||
--> $DIR/issue-65634-raw-ident-suggestion.rs:21:13
|
||||
|
|
||||
LL | r#fn {}.r#struct();
|
||||
| ^^^^^^^^ multiple `r#struct` found
|
||||
|
|
||||
note: candidate #1 is defined in an impl of the trait `async` for the type `r#fn`
|
||||
--> $DIR/issue-65634-raw-ident-suggestion.rs:4:5
|
||||
|
|
||||
LL | fn r#struct(&self) {
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
= help: to disambiguate the method call, write `async::r#struct(r#fn {})` instead
|
||||
note: candidate #2 is defined in an impl of the trait `await` for the type `r#fn`
|
||||
--> $DIR/issue-65634-raw-ident-suggestion.rs:10:5
|
||||
|
|
||||
LL | fn r#struct(&self) {
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
= help: to disambiguate the method call, write `await::r#struct(r#fn {})` instead
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0034`.
|
@ -11,11 +11,11 @@ fn test_union() {
|
||||
}
|
||||
|
||||
fn test_if_2() {
|
||||
let _ = r#if; //~ ERROR cannot find value `if` in this scope
|
||||
let _ = r#if; //~ ERROR cannot find value `r#if` in this scope
|
||||
}
|
||||
|
||||
fn test_struct_2() {
|
||||
let _ = r#struct; //~ ERROR cannot find value `struct` in this scope
|
||||
let _ = r#struct; //~ ERROR cannot find value `r#struct` in this scope
|
||||
}
|
||||
|
||||
fn test_union_2() {
|
||||
|
@ -16,13 +16,13 @@ error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found
|
||||
LL | r#union Test;
|
||||
| ^^^^ expected one of 8 possible tokens
|
||||
|
||||
error[E0425]: cannot find value `if` in this scope
|
||||
error[E0425]: cannot find value `r#if` in this scope
|
||||
--> $DIR/raw-literal-keywords.rs:14:13
|
||||
|
|
||||
LL | let _ = r#if;
|
||||
| ^^^^ not found in this scope
|
||||
|
||||
error[E0425]: cannot find value `struct` in this scope
|
||||
error[E0425]: cannot find value `r#struct` in this scope
|
||||
--> $DIR/raw-literal-keywords.rs:18:13
|
||||
|
|
||||
LL | let _ = r#struct;
|
||||
|
@ -5,5 +5,5 @@ pub fn break() {} //~ ERROR expected identifier, found keyword `break`
|
||||
|
||||
fn main() {
|
||||
foo::let(); //~ ERROR expected identifier, found keyword `let`
|
||||
r#break(); //~ ERROR cannot find function `break` in this scope
|
||||
r#break(); //~ ERROR cannot find function `r#break` in this scope
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ help: you can escape reserved keywords to use them as identifiers
|
||||
LL | foo::r#let();
|
||||
| ^^^^^
|
||||
|
||||
error[E0425]: cannot find function `break` in this scope
|
||||
error[E0425]: cannot find function `r#break` in this scope
|
||||
--> $DIR/raw-name-use-suggestion.rs:8:5
|
||||
|
|
||||
LL | r#break();
|
||||
|
Loading…
Reference in New Issue
Block a user