From c0bad8bcab1cb3365e813de97c1f122e64b04510 Mon Sep 17 00:00:00 2001 From: Dharma Saputra Wijaya Date: Thu, 25 Nov 2021 09:10:50 +0800 Subject: [PATCH] Add more descriptive help info for `needless_question_mark` --- clippy_lints/src/needless_question_mark.rs | 33 +++++++++++++--------- tests/ui/needless_question_mark.stderr | 24 ++++++++-------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/clippy_lints/src/needless_question_mark.rs b/clippy_lints/src/needless_question_mark.rs index 3ca933ea8fb..1ffed6a0524 100644 --- a/clippy_lints/src/needless_question_mark.rs +++ b/clippy_lints/src/needless_question_mark.rs @@ -93,10 +93,16 @@ impl LateLintPass<'_> for NeedlessQuestionMark { } fn check(cx: &LateContext<'_>, expr: &Expr<'_>) { - let inner_expr = if_chain! { + if_chain! { if let ExprKind::Call(path, [arg]) = &expr.kind; if let ExprKind::Path(ref qpath) = &path.kind; - if is_lang_ctor(cx, qpath, OptionSome) || is_lang_ctor(cx, qpath, ResultOk); + let sugg_remove = if is_lang_ctor(cx, qpath, OptionSome) { + "Some()" + } else if is_lang_ctor(cx, qpath, ResultOk) { + "Ok()" + } else { + return; + }; if let ExprKind::Match(inner_expr_with_q, _, MatchSource::TryDesugar) = &arg.kind; if let ExprKind::Call(called, [inner_expr]) = &inner_expr_with_q.kind; if let ExprKind::Path(QPath::LangItem(LangItem::TryTraitBranch, _)) = &called.kind; @@ -104,15 +110,16 @@ fn check(cx: &LateContext<'_>, expr: &Expr<'_>) { let expr_ty = cx.typeck_results().expr_ty(expr); let inner_ty = cx.typeck_results().expr_ty(inner_expr); if TyS::same_type(expr_ty, inner_ty); - then { inner_expr } else { return; } - }; - span_lint_and_sugg( - cx, - NEEDLESS_QUESTION_MARK, - expr.span, - "question mark operator is useless here", - "try", - format!("{}", snippet(cx, inner_expr.span, r#""...""#)), - Applicability::MachineApplicable, - ); + then { + span_lint_and_sugg( + cx, + NEEDLESS_QUESTION_MARK, + expr.span, + "question mark operator is useless here", + &format!("try removing question mark and `{}`", sugg_remove), + format!("{}", snippet(cx, inner_expr.span, r#""...""#)), + Applicability::MachineApplicable, + ); + } + } } diff --git a/tests/ui/needless_question_mark.stderr b/tests/ui/needless_question_mark.stderr index 02bf50d077a..57c3d48c761 100644 --- a/tests/ui/needless_question_mark.stderr +++ b/tests/ui/needless_question_mark.stderr @@ -2,7 +2,7 @@ error: question mark operator is useless here --> $DIR/needless_question_mark.rs:23:12 | LL | return Some(to.magic?); - | ^^^^^^^^^^^^^^^ help: try: `to.magic` + | ^^^^^^^^^^^^^^^ help: try removing question mark and `Some()`: `to.magic` | = note: `-D clippy::needless-question-mark` implied by `-D warnings` @@ -10,67 +10,67 @@ error: question mark operator is useless here --> $DIR/needless_question_mark.rs:31:12 | LL | return Some(to.magic?) - | ^^^^^^^^^^^^^^^ help: try: `to.magic` + | ^^^^^^^^^^^^^^^ help: try removing question mark and `Some()`: `to.magic` error: question mark operator is useless here --> $DIR/needless_question_mark.rs:36:5 | LL | Some(to.magic?) - | ^^^^^^^^^^^^^^^ help: try: `to.magic` + | ^^^^^^^^^^^^^^^ help: try removing question mark and `Some()`: `to.magic` error: question mark operator is useless here --> $DIR/needless_question_mark.rs:41:21 | LL | to.and_then(|t| Some(t.magic?)) - | ^^^^^^^^^^^^^^ help: try: `t.magic` + | ^^^^^^^^^^^^^^ help: try removing question mark and `Some()`: `t.magic` error: question mark operator is useless here --> $DIR/needless_question_mark.rs:50:9 | LL | Some(t.magic?) - | ^^^^^^^^^^^^^^ help: try: `t.magic` + | ^^^^^^^^^^^^^^ help: try removing question mark and `Some()`: `t.magic` error: question mark operator is useless here --> $DIR/needless_question_mark.rs:55:12 | LL | return Ok(tr.magic?); - | ^^^^^^^^^^^^^ help: try: `tr.magic` + | ^^^^^^^^^^^^^ help: try removing question mark and `Ok()`: `tr.magic` error: question mark operator is useless here --> $DIR/needless_question_mark.rs:62:12 | LL | return Ok(tr.magic?) - | ^^^^^^^^^^^^^ help: try: `tr.magic` + | ^^^^^^^^^^^^^ help: try removing question mark and `Ok()`: `tr.magic` error: question mark operator is useless here --> $DIR/needless_question_mark.rs:66:5 | LL | Ok(tr.magic?) - | ^^^^^^^^^^^^^ help: try: `tr.magic` + | ^^^^^^^^^^^^^ help: try removing question mark and `Ok()`: `tr.magic` error: question mark operator is useless here --> $DIR/needless_question_mark.rs:70:21 | LL | tr.and_then(|t| Ok(t.magic?)) - | ^^^^^^^^^^^^ help: try: `t.magic` + | ^^^^^^^^^^^^ help: try removing question mark and `Ok()`: `t.magic` error: question mark operator is useless here --> $DIR/needless_question_mark.rs:78:9 | LL | Ok(t.magic?) - | ^^^^^^^^^^^^ help: try: `t.magic` + | ^^^^^^^^^^^^ help: try removing question mark and `Ok()`: `t.magic` error: question mark operator is useless here --> $DIR/needless_question_mark.rs:85:16 | LL | return Ok(t.magic?); - | ^^^^^^^^^^^^ help: try: `t.magic` + | ^^^^^^^^^^^^ help: try removing question mark and `Ok()`: `t.magic` error: question mark operator is useless here --> $DIR/needless_question_mark.rs:120:27 | LL | || -> Option<_> { Some(Some($expr)?) }() - | ^^^^^^^^^^^^^^^^^^ help: try: `Some($expr)` + | ^^^^^^^^^^^^^^^^^^ help: try removing question mark and `Some()`: `Some($expr)` ... LL | let _x = some_and_qmark_in_macro!(x?); | ---------------------------- in this macro invocation