]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/clippy_lints/src/methods/expect_used.rs
Rollup merge of #105161 - cassaundra:numeric-literal-error, r=nnethercote
[rust.git] / src / tools / clippy / clippy_lints / src / methods / expect_used.rs
1 use clippy_utils::diagnostics::span_lint_and_help;
2 use clippy_utils::is_in_cfg_test;
3 use clippy_utils::ty::is_type_diagnostic_item;
4 use rustc_hir as hir;
5 use rustc_lint::LateContext;
6 use rustc_span::sym;
7
8 use super::EXPECT_USED;
9
10 /// lint use of `expect()` or `expect_err` for `Result` and `expect()` for `Option`.
11 pub(super) fn check(
12     cx: &LateContext<'_>,
13     expr: &hir::Expr<'_>,
14     recv: &hir::Expr<'_>,
15     is_err: bool,
16     allow_expect_in_tests: bool,
17 ) {
18     let obj_ty = cx.typeck_results().expr_ty(recv).peel_refs();
19
20     let mess = if is_type_diagnostic_item(cx, obj_ty, sym::Option) && !is_err {
21         Some((EXPECT_USED, "an `Option`", "None", ""))
22     } else if is_type_diagnostic_item(cx, obj_ty, sym::Result) {
23         Some((EXPECT_USED, "a `Result`", if is_err { "Ok" } else { "Err" }, "an "))
24     } else {
25         None
26     };
27
28     let method = if is_err { "expect_err" } else { "expect" };
29
30     if allow_expect_in_tests && is_in_cfg_test(cx.tcx, expr.hir_id) {
31         return;
32     }
33
34     if let Some((lint, kind, none_value, none_prefix)) = mess {
35         span_lint_and_help(
36             cx,
37             lint,
38             expr.span,
39             &format!("used `{method}()` on {kind} value"),
40             None,
41             &format!("if this value is {none_prefix}`{none_value}`, it will panic"),
42         );
43     }
44 }