about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCentri3 <114838443+Centri3@users.noreply.github.com>2023-04-17 20:57:56 -0500
committerCentri3 <114838443+Centri3@users.noreply.github.com>2023-04-17 20:57:56 -0500
commitfa1efa8b104c71721d8317ae59819f6abf2d0ac8 (patch)
tree6d41f22013bea50e5e2df2284adcbd76eeea29af
parent80707aa95faae4acf8b35abf0daf4626afdb446e (diff)
downloadrust-fa1efa8b104c71721d8317ae59819f6abf2d0ac8.tar.gz
rust-fa1efa8b104c71721d8317ae59819f6abf2d0ac8.zip
refactor
-rw-r--r--clippy_lints/src/semicolon_block.rs77
1 files changed, 22 insertions, 55 deletions
diff --git a/clippy_lints/src/semicolon_block.rs b/clippy_lints/src/semicolon_block.rs
index 8cdfbd5c495..7113f0c55d4 100644
--- a/clippy_lints/src/semicolon_block.rs
+++ b/clippy_lints/src/semicolon_block.rs
@@ -126,14 +126,12 @@ impl LateLintPass<'_> for SemicolonBlock {
                     ..
                 } = stmt else { return };
                 semicolon_outside_block(cx, block, expr, span);
-                semicolon_outside_block_if_singleline_check_outside(cx, block, expr, stmt.span);
             },
             StmtKind::Semi(Expr {
                 kind: ExprKind::Block(block @ Block { expr: Some(tail), .. }, _),
                 ..
             }) if !block.span.from_expansion() => {
                 semicolon_inside_block(cx, block, tail, stmt.span);
-                semicolon_outside_block_if_singleline_check_inside(cx, block, tail, stmt.span);
             },
             _ => (),
         }
@@ -144,6 +142,8 @@ fn semicolon_inside_block(cx: &LateContext<'_>, block: &Block<'_>, tail: &Expr<'
     let insert_span = tail.span.source_callsite().shrink_to_hi();
     let remove_span = semi_span.with_lo(block.span.hi());
 
+    semicolon_outside_block_if_singleline(cx, block, remove_span, insert_span, true, "inside");
+
     span_lint_and_then(
         cx,
         SEMICOLON_INSIDE_BLOCK,
@@ -166,6 +166,8 @@ fn semicolon_outside_block(cx: &LateContext<'_>, block: &Block<'_>, tail_stmt_ex
     let semi_span = cx.sess().source_map().stmt_span(semi_span, block.span);
     let remove_span = semi_span.with_lo(tail_stmt_expr.span.source_callsite().hi());
 
+    semicolon_outside_block_if_singleline(cx, block, remove_span, insert_span, false, "outside");
+
     span_lint_and_then(
         cx,
         SEMICOLON_OUTSIDE_BLOCK,
@@ -182,23 +184,28 @@ fn semicolon_outside_block(cx: &LateContext<'_>, block: &Block<'_>, tail_stmt_ex
     );
 }
 
-fn semicolon_outside_block_if_singleline_check_inside(
+fn semicolon_outside_block_if_singleline(
     cx: &LateContext<'_>,
     block: &Block<'_>,
-    tail: &Expr<'_>,
-    semi_span: Span,
+    remove_span: Span,
+    insert_span: Span,
+    inequality: bool,
+    ty: &str,
 ) {
-    let insert_span = tail.span.source_callsite().shrink_to_hi();
-    let remove_span = semi_span.with_lo(block.span.hi());
+    let (remove_line, insert_line) = (get_line(cx, remove_span), get_line(cx, insert_span));
 
-    let (remove_line, insert_line) = get_line(cx, remove_span, insert_span);
+    let eq = if inequality {
+        remove_line != insert_line
+    } else {
+        remove_line == insert_line
+    };
 
-    if insert_line != remove_line {
+    if eq {
         span_lint_and_then(
             cx,
             SEMICOLON_OUTSIDE_BLOCK_IF_SINGLELINE,
             block.span,
-            "consider moving the `;` inside the block for consistent formatting",
+            &format!("consider moving the `;` {ty} the block for consistent formatting"),
             |diag| {
                 multispan_sugg_with_applicability(
                     diag,
@@ -211,50 +218,10 @@ fn semicolon_outside_block_if_singleline_check_inside(
     }
 }
 
-fn semicolon_outside_block_if_singleline_check_outside(
-    cx: &LateContext<'_>,
-    block: &Block<'_>,
-    tail_stmt_expr: &Expr<'_>,
-    semi_span: Span,
-) {
-    let insert_span = block.span.with_lo(block.span.hi());
-    // account for macro calls
-    let semi_span = cx.sess().source_map().stmt_span(semi_span, block.span);
-    let remove_span = semi_span.with_lo(tail_stmt_expr.span.source_callsite().hi());
-
-    let (remove_line, insert_line) = get_line(cx, remove_span, insert_span);
-
-    if remove_line == insert_line {
-        span_lint_and_then(
-            cx,
-            SEMICOLON_OUTSIDE_BLOCK_IF_SINGLELINE,
-            block.span,
-            "consider moving the `;` outside the block for consistent formatting",
-            |diag| {
-                multispan_sugg_with_applicability(
-                    diag,
-                    "put the `;` here",
-                    Applicability::MachineApplicable,
-                    [(remove_span, String::new()), (insert_span, ";".to_owned())],
-                );
-            },
-        );
-    }
-}
-
-fn get_line(cx: &LateContext<'_>, remove_span: Span, insert_span: Span) -> (usize, usize) {
-    let remove_line = cx
-        .sess()
-        .source_map()
-        .lookup_line(remove_span.lo())
-        .expect("failed to get `remove_span`'s line")
-        .line;
-    let insert_line = cx
-        .sess()
+fn get_line(cx: &LateContext<'_>, span: Span) -> usize {
+    cx.sess()
         .source_map()
-        .lookup_line(insert_span.lo())
-        .expect("failed to get `insert_span`'s line")
-        .line;
-
-    (remove_line, insert_line)
+        .lookup_line(span.lo())
+        .expect("failed to get span's line")
+        .line
 }