]> git.lizzy.rs Git - rust.git/blob - clippy_lints/src/loops/for_loops_over_fallibles.rs
Replace `is_lang_ctor` with `is_res_lang_ctor`
[rust.git] / clippy_lints / src / loops / for_loops_over_fallibles.rs
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;
8
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 {
14             format!(
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, "_")
18             )
19         } else {
20             format!(
21                 "consider replacing `for {0} in {1}` with `if let Some({0}) = {1}`",
22                 snippet(cx, pat.span, "_"),
23                 snippet(cx, arg.span, "_")
24             )
25         };
26         span_lint_and_help(
27             cx,
28             FOR_LOOPS_OVER_FALLIBLES,
29             arg.span,
30             &format!(
31                 "for loop over `{0}`, which is an `Option`. This is more readably written as an \
32                 `if let` statement",
33                 snippet(cx, arg.span, "_")
34             ),
35             None,
36             &help_string,
37         );
38     } else if is_type_diagnostic_item(cx, ty, sym::Result) {
39         let help_string = if let Some(method_name) = method_name {
40             format!(
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, "_")
44             )
45         } else {
46             format!(
47                 "consider replacing `for {0} in {1}` with `if let Ok({0}) = {1}`",
48                 snippet(cx, pat.span, "_"),
49                 snippet(cx, arg.span, "_")
50             )
51         };
52         span_lint_and_help(
53             cx,
54             FOR_LOOPS_OVER_FALLIBLES,
55             arg.span,
56             &format!(
57                 "for loop over `{0}`, which is a `Result`. This is more readably written as an \
58                 `if let` statement",
59                 snippet(cx, arg.span, "_")
60             ),
61             None,
62             &help_string,
63         );
64     }
65 }