Skip to content

Commit

Permalink
suggest &str.chars() on attempt to &str.iter()
Browse files Browse the repository at this point in the history
check if `String` or `&String` or `&str`

Update compiler/rustc_typeck/src/check/method/suggest.rs

Co-authored-by: Esteban Kuber <[email protected]>

remove some trailing whitespace
  • Loading branch information
TaKO8Ki committed Nov 15, 2021
1 parent 9dbbbb1 commit d562f48
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 0 deletions.
20 changes: 20 additions & 0 deletions compiler/rustc_typeck/src/check/method/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,26 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let mut label_span_not_found = || {
if unsatisfied_predicates.is_empty() {
err.span_label(span, format!("{item_kind} not found in `{ty_str}`"));
let is_string_or_ref_str = match actual.kind() {
ty::Ref(_, ty, _) => {
ty.is_str()
|| matches!(
ty.kind(),
ty::Adt(adt, _) if self.tcx.is_diagnostic_item(sym::String, adt.did)
)
}
ty::Adt(adt, _) => self.tcx.is_diagnostic_item(sym::String, adt.did),
_ => false,
};
if is_string_or_ref_str && item_name.name == sym::iter {
err.span_suggestion_verbose(
item_name.span,
"because of the in-memory representation of `&str`, to obtain \
an `Iterator` over each of its codepoint use method `chars`",
String::from("chars"),
Applicability::MachineApplicable,
);
}
if let ty::Adt(adt, _) = rcvr_ty.kind() {
let mut inherent_impls_candidate = self
.tcx
Expand Down
7 changes: 7 additions & 0 deletions src/test/ui/suggest-using-chars.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
pub fn main() {
let _ = "foo".iter(); //~ ERROR no method named `iter` found for reference `&'static str` in the current scope
let _ = "foo".foo(); //~ ERROR no method named `foo` found for reference `&'static str` in the current scope
let _ = String::from("bar").iter(); //~ ERROR no method named `iter` found for struct `String` in the current scope
let _ = (&String::from("bar")).iter(); //~ ERROR no method named `iter` found for reference `&String` in the current scope
let _ = 0.iter(); //~ ERROR no method named `iter` found for type `{integer}` in the current scope
}
48 changes: 48 additions & 0 deletions src/test/ui/suggest-using-chars.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
error[E0599]: no method named `iter` found for reference `&'static str` in the current scope
--> $DIR/suggest-using-chars.rs:2:19
|
LL | let _ = "foo".iter();
| ^^^^ method not found in `&'static str`
|
help: because of the in-memory representation of `&str`, to obtain an `Iterator` over each of its codepoint use method `chars`
|
LL | let _ = "foo".chars();
| ~~~~~

error[E0599]: no method named `foo` found for reference `&'static str` in the current scope
--> $DIR/suggest-using-chars.rs:3:19
|
LL | let _ = "foo".foo();
| ^^^ method not found in `&'static str`

error[E0599]: no method named `iter` found for struct `String` in the current scope
--> $DIR/suggest-using-chars.rs:4:33
|
LL | let _ = String::from("bar").iter();
| ^^^^ method not found in `String`
|
help: because of the in-memory representation of `&str`, to obtain an `Iterator` over each of its codepoint use method `chars`
|
LL | let _ = String::from("bar").chars();
| ~~~~~

error[E0599]: no method named `iter` found for reference `&String` in the current scope
--> $DIR/suggest-using-chars.rs:5:36
|
LL | let _ = (&String::from("bar")).iter();
| ^^^^ method not found in `&String`
|
help: because of the in-memory representation of `&str`, to obtain an `Iterator` over each of its codepoint use method `chars`
|
LL | let _ = (&String::from("bar")).chars();
| ~~~~~

error[E0599]: no method named `iter` found for type `{integer}` in the current scope
--> $DIR/suggest-using-chars.rs:6:15
|
LL | let _ = 0.iter();
| ^^^^ method not found in `{integer}`

error: aborting due to 5 previous errors

For more information about this error, try `rustc --explain E0599`.

0 comments on commit d562f48

Please sign in to comment.