Rollup merge of #90803 - TaKO8Ki:suggest-chars-on-attempt-to-iter, r=estebank
Suggest `&str.chars()` on attempt to `&str.iter()` closes #90786
This commit is contained in:
commit
b17de50a41
3 changed files with 75 additions and 0 deletions
|
@ -478,6 +478,26 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
let mut label_span_not_found = || {
|
let mut label_span_not_found = || {
|
||||||
if unsatisfied_predicates.is_empty() {
|
if unsatisfied_predicates.is_empty() {
|
||||||
err.span_label(span, format!("{item_kind} not found in `{ty_str}`"));
|
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() {
|
if let ty::Adt(adt, _) = rcvr_ty.kind() {
|
||||||
let mut inherent_impls_candidate = self
|
let mut inherent_impls_candidate = self
|
||||||
.tcx
|
.tcx
|
||||||
|
|
7
src/test/ui/suggest-using-chars.rs
Normal file
7
src/test/ui/suggest-using-chars.rs
Normal file
|
@ -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
src/test/ui/suggest-using-chars.stderr
Normal file
48
src/test/ui/suggest-using-chars.stderr
Normal file
|
@ -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`.
|
Loading…
Add table
Add a link
Reference in a new issue