]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/clippy_lints/src/methods/needless_option_as_deref.rs
Merge commit 'c4416f20dcaec5d93077f72470e83e150fb923b1' into sync-rustfmt
[rust.git] / src / tools / clippy / clippy_lints / src / methods / needless_option_as_deref.rs
1 use clippy_utils::diagnostics::span_lint_and_sugg;
2 use clippy_utils::path_res;
3 use clippy_utils::source::snippet_opt;
4 use clippy_utils::ty::is_type_diagnostic_item;
5 use clippy_utils::usage::local_used_after_expr;
6 use rustc_errors::Applicability;
7 use rustc_hir::def::Res;
8 use rustc_hir::Expr;
9 use rustc_lint::LateContext;
10 use rustc_span::sym;
11
12 use super::NEEDLESS_OPTION_AS_DEREF;
13
14 pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, recv: &Expr<'_>, name: &str) {
15     let typeck = cx.typeck_results();
16     let outer_ty = typeck.expr_ty(expr);
17
18     if is_type_diagnostic_item(cx, outer_ty, sym::Option) && outer_ty == typeck.expr_ty(recv) {
19         if name == "as_deref_mut" && recv.is_syntactic_place_expr() {
20             let Res::Local(binding_id) = path_res(cx, recv) else { return };
21
22             if local_used_after_expr(cx, binding_id, recv) {
23                 return;
24             }
25         }
26
27         span_lint_and_sugg(
28             cx,
29             NEEDLESS_OPTION_AS_DEREF,
30             expr.span,
31             "derefed type is same as origin",
32             "try this",
33             snippet_opt(cx, recv.span).unwrap(),
34             Applicability::MachineApplicable,
35         );
36     }
37 }