Track init and unwrap of expr

This commit is contained in:
rsdy 2023-02-16 15:30:09 +00:00 committed by Pavan Kumar Sunkara
parent 7ed7283e0f
commit 6e0e09c8f7
3 changed files with 40 additions and 3 deletions

View file

@ -6,7 +6,9 @@ use rustc_lint::LateContext;
use super::UNNECESSARY_LITERAL_UNWRAP;
pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>, name: &str) {
if let hir::ExprKind::Call(call, [arg]) = recv.kind {
let init = clippy_utils::expr_or_init(cx, recv);
if let hir::ExprKind::Call(call, [arg]) = init.kind {
let mess = if is_res_lang_ctor(cx, path_res(cx, call), hir::LangItem::OptionSome) {
Some("Some")
} else if is_res_lang_ctor(cx, path_res(cx, call), hir::LangItem::ResultOk) {
@ -15,7 +17,11 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr
None
};
if let Some(constructor) = mess {
let Some(constructor) = mess else {
return;
};
if init.span == recv.span {
span_lint_and_then(
cx,
UNNECESSARY_LITERAL_UNWRAP,
@ -23,7 +29,7 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr
&format!("used `{name}()` on `{constructor}` value"),
|diag| {
let suggestions = vec![
(call.span.with_hi(arg.span.lo()), String::new()),
(recv.span.with_hi(arg.span.lo()), String::new()),
(expr.span.with_lo(arg.span.hi()), String::new()),
];
@ -34,6 +40,16 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr
);
},
);
} else {
span_lint_and_then(
cx,
UNNECESSARY_LITERAL_UNWRAP,
expr.span,
&format!("used `{name}()` on `{constructor}` value"),
|diag| {
diag.span_help(init.span, format!("remove the `{constructor}` and `{name}()`"));
},
);
}
}
}