about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--clippy_lints/src/matches/single_match.rs24
-rw-r--r--tests/ui/single_match.fixed10
-rw-r--r--tests/ui/single_match.rs15
-rw-r--r--tests/ui/single_match.stderr33
-rw-r--r--tests/ui/single_match_else.fixed2
-rw-r--r--tests/ui/single_match_else.stderr2
6 files changed, 75 insertions, 11 deletions
diff --git a/clippy_lints/src/matches/single_match.rs b/clippy_lints/src/matches/single_match.rs
index 4bd46bced38..e7cef5bdbd7 100644
--- a/clippy_lints/src/matches/single_match.rs
+++ b/clippy_lints/src/matches/single_match.rs
@@ -1,5 +1,5 @@
 use clippy_utils::diagnostics::span_lint_and_sugg;
-use clippy_utils::source::{expr_block, snippet, SpanRangeExt};
+use clippy_utils::source::{expr_block, snippet, snippet_block_with_context, SpanRangeExt};
 use clippy_utils::ty::implements_trait;
 use clippy_utils::{
     is_lint_allowed, is_unit_expr, peel_blocks, peel_hir_pat_refs, peel_middle_ty_refs, peel_n_hir_expr_refs,
@@ -9,7 +9,7 @@ use rustc_arena::DroplessArena;
 use rustc_errors::Applicability;
 use rustc_hir::def::{DefKind, Res};
 use rustc_hir::intravisit::{walk_pat, Visitor};
-use rustc_hir::{Arm, Expr, ExprKind, HirId, Pat, PatKind, QPath};
+use rustc_hir::{Arm, Expr, ExprKind, HirId, Node, Pat, PatKind, QPath, StmtKind};
 use rustc_lint::LateContext;
 use rustc_middle::ty::{self, AdtDef, ParamEnv, TyCtxt, TypeckResults, VariantDef};
 use rustc_span::{sym, Span};
@@ -93,8 +93,24 @@ fn report_single_pattern(cx: &LateContext<'_>, ex: &Expr<'_>, arm: &Arm<'_>, exp
 
     if snippet(cx, ex.span, "..") == snippet(cx, arm.pat.span, "..") {
         let msg = "this pattern is irrefutable, `match` is useless";
-        let sugg = expr_block(cx, arm.body, ctxt, "..", Some(expr.span), &mut app);
-        span_lint_and_sugg(cx, lint, expr.span, msg, "try", sugg, app);
+        let (sugg, help) = if is_unit_expr(arm.body) {
+            (String::new(), "`match` expression can be removed")
+        } else {
+            let mut sugg = snippet_block_with_context(cx, arm.body.span, ctxt, "..", Some(expr.span), &mut app)
+                .0
+                .to_string();
+            if let Node::Stmt(stmt) = cx.tcx.parent_hir_node(expr.hir_id)
+                && let StmtKind::Expr(_) = stmt.kind
+                && match arm.body.kind {
+                    ExprKind::Block(block, _) => block.span.from_expansion(),
+                    _ => true,
+                }
+            {
+                sugg.push(';');
+            }
+            (sugg, "try")
+        };
+        span_lint_and_sugg(cx, lint, expr.span, msg, help, sugg.to_string(), app);
         return;
     }
 
diff --git a/tests/ui/single_match.fixed b/tests/ui/single_match.fixed
index 04129ec0f13..dcf5a1d33c2 100644
--- a/tests/ui/single_match.fixed
+++ b/tests/ui/single_match.fixed
@@ -304,13 +304,19 @@ const DATA: Data = Data([1, 2, 3, 4]);
 const CONST_I32: i32 = 1;
 
 fn irrefutable_match() {
-    { println!() }
+    println!();
 
-    { println!() }
+    println!();
 
     let i = 0;
     {
         let a = 1;
         let b = 2;
     }
+
+    
+
+    
+
+    println!()
 }
diff --git a/tests/ui/single_match.rs b/tests/ui/single_match.rs
index 2d51cee3fd9..3ba5eebd01b 100644
--- a/tests/ui/single_match.rs
+++ b/tests/ui/single_match.rs
@@ -386,4 +386,19 @@ fn irrefutable_match() {
         },
         _ => {},
     }
+
+    match i {
+        i => {},
+        _ => {},
+    }
+
+    match i {
+        i => (),
+        _ => (),
+    }
+
+    match CONST_I32 {
+        CONST_I32 => println!(),
+        _ => {},
+    }
 }
diff --git a/tests/ui/single_match.stderr b/tests/ui/single_match.stderr
index 9578421d2ce..9240b09c50a 100644
--- a/tests/ui/single_match.stderr
+++ b/tests/ui/single_match.stderr
@@ -223,7 +223,7 @@ LL | /     match DATA {
 LL | |         DATA => println!(),
 LL | |         _ => {},
 LL | |     }
-   | |_____^ help: try: `{ println!() }`
+   | |_____^ help: try: `println!();`
 
 error: this pattern is irrefutable, `match` is useless
   --> tests/ui/single_match.rs:376:5
@@ -232,7 +232,7 @@ LL | /     match CONST_I32 {
 LL | |         CONST_I32 => println!(),
 LL | |         _ => {},
 LL | |     }
-   | |_____^ help: try: `{ println!() }`
+   | |_____^ help: try: `println!();`
 
 error: this pattern is irrefutable, `match` is useless
   --> tests/ui/single_match.rs:382:5
@@ -254,5 +254,32 @@ LL +         let b = 2;
 LL +     }
    |
 
-error: aborting due to 23 previous errors
+error: this pattern is irrefutable, `match` is useless
+  --> tests/ui/single_match.rs:390:5
+   |
+LL | /     match i {
+LL | |         i => {},
+LL | |         _ => {},
+LL | |     }
+   | |_____^ help: `match` expression can be removed
+
+error: this pattern is irrefutable, `match` is useless
+  --> tests/ui/single_match.rs:395:5
+   |
+LL | /     match i {
+LL | |         i => (),
+LL | |         _ => (),
+LL | |     }
+   | |_____^ help: `match` expression can be removed
+
+error: this pattern is irrefutable, `match` is useless
+  --> tests/ui/single_match.rs:400:5
+   |
+LL | /     match CONST_I32 {
+LL | |         CONST_I32 => println!(),
+LL | |         _ => {},
+LL | |     }
+   | |_____^ help: try: `println!()`
+
+error: aborting due to 26 previous errors
 
diff --git a/tests/ui/single_match_else.fixed b/tests/ui/single_match_else.fixed
index fb57411aaa4..c2ca746976b 100644
--- a/tests/ui/single_match_else.fixed
+++ b/tests/ui/single_match_else.fixed
@@ -173,5 +173,5 @@ fn issue_10808(bar: Option<i32>) {
 }
 
 fn irrefutable_match() -> Option<&'static ExprNode> {
-    { Some(&NODE) }
+    Some(&NODE)
 }
diff --git a/tests/ui/single_match_else.stderr b/tests/ui/single_match_else.stderr
index 61209053fd0..a2801751a43 100644
--- a/tests/ui/single_match_else.stderr
+++ b/tests/ui/single_match_else.stderr
@@ -207,7 +207,7 @@ LL | |             let x = 5;
 LL | |             None
 LL | |         },
 LL | |     }
-   | |_____^ help: try: `{ Some(&NODE) }`
+   | |_____^ help: try: `Some(&NODE)`
 
 error: aborting due to 10 previous errors