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:
Mazdak Farrokhzad 2019-12-05 19:03:15 +01:00 committed by GitHub
commit 8e6cf861e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 61 additions and 8 deletions

View File

@ -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

View File

@ -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);

View File

@ -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)
}
}

View 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
}

View 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`.

View File

@ -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() {

View File

@ -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;

View File

@ -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
}

View File

@ -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();