1 use super::FOR_LOOPS_OVER_FALLIBLES;
2 use clippy_utils::diagnostics::span_lint_and_help;
3 use clippy_utils::source::snippet;
4 use clippy_utils::ty::is_type_diagnostic_item;
5 use rustc_hir::{Expr, Pat};
6 use rustc_lint::LateContext;
7 use rustc_span::symbol::sym;
9 /// Checks for `for` loops over `Option`s and `Result`s.
10 pub(super) fn check(cx: &LateContext<'_>, pat: &Pat<'_>, arg: &Expr<'_>, method_name: Option<&str>) {
11 let ty = cx.typeck_results().expr_ty(arg);
12 if is_type_diagnostic_item(cx, ty, sym::Option) {
13 let help_string = if let Some(method_name) = method_name {
15 "consider replacing `for {0} in {1}.{method_name}()` with `if let Some({0}) = {1}`",
16 snippet(cx, pat.span, "_"),
17 snippet(cx, arg.span, "_")
21 "consider replacing `for {0} in {1}` with `if let Some({0}) = {1}`",
22 snippet(cx, pat.span, "_"),
23 snippet(cx, arg.span, "_")
28 FOR_LOOPS_OVER_FALLIBLES,
31 "for loop over `{0}`, which is an `Option`. This is more readably written as an \
33 snippet(cx, arg.span, "_")
38 } else if is_type_diagnostic_item(cx, ty, sym::Result) {
39 let help_string = if let Some(method_name) = method_name {
41 "consider replacing `for {0} in {1}.{method_name}()` with `if let Ok({0}) = {1}`",
42 snippet(cx, pat.span, "_"),
43 snippet(cx, arg.span, "_")
47 "consider replacing `for {0} in {1}` with `if let Ok({0}) = {1}`",
48 snippet(cx, pat.span, "_"),
49 snippet(cx, arg.span, "_")
54 FOR_LOOPS_OVER_FALLIBLES,
57 "for loop over `{0}`, which is a `Result`. This is more readably written as an \
59 snippet(cx, arg.span, "_")