diff options
| author | dswij <dswijj@gmail.com> | 2022-06-02 20:16:46 +0800 |
|---|---|---|
| committer | dswij <dswijj@gmail.com> | 2022-06-02 20:22:15 +0800 |
| commit | b885035ef7c5d9e4824944e2c50035afdb2fd2f5 (patch) | |
| tree | db5ab778a947deb5f7217abad743513f2ca4b600 | |
| parent | 0d5ace3ed22fdd6ee25ee1dda42139d36c0aeec4 (diff) | |
| download | rust-b885035ef7c5d9e4824944e2c50035afdb2fd2f5.tar.gz rust-b885035ef7c5d9e4824944e2c50035afdb2fd2f5.zip | |
`needless_return` checks for macro expr in return stmts
| -rw-r--r-- | clippy_lints/src/returns.rs | 14 | ||||
| -rw-r--r-- | tests/ui/needless_return.fixed | 10 | ||||
| -rw-r--r-- | tests/ui/needless_return.rs | 6 | ||||
| -rw-r--r-- | tests/ui/needless_return.stderr | 20 |
4 files changed, 38 insertions, 12 deletions
diff --git a/clippy_lints/src/returns.rs b/clippy_lints/src/returns.rs index 8068fa22d9c..e525eba53e2 100644 --- a/clippy_lints/src/returns.rs +++ b/clippy_lints/src/returns.rs @@ -1,5 +1,5 @@ use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_and_then}; -use clippy_utils::source::snippet_opt; +use clippy_utils::source::{snippet_opt, snippet_with_context}; use clippy_utils::{fn_def_id, path_to_local_id}; use if_chain::if_chain; use rustc_ast::ast::Attribute; @@ -226,14 +226,10 @@ fn emit_return_lint(cx: &LateContext<'_>, ret_span: Span, inner_span: Option<Spa } match inner_span { Some(inner_span) => { - if in_external_macro(cx.tcx.sess, inner_span) || inner_span.from_expansion() { - return; - } - + let mut applicability = Applicability::MachineApplicable; span_lint_and_then(cx, NEEDLESS_RETURN, ret_span, "unneeded `return` statement", |diag| { - if let Some(snippet) = snippet_opt(cx, inner_span) { - diag.span_suggestion(ret_span, "remove `return`", snippet, Applicability::MachineApplicable); - } + let (snippet, _) = snippet_with_context(cx, inner_span, ret_span.ctxt(), "..", &mut applicability); + diag.span_suggestion(ret_span, "remove `return`", snippet, applicability); }); }, None => match replacement { @@ -287,7 +283,7 @@ struct BorrowVisitor<'a, 'tcx> { impl<'tcx> Visitor<'tcx> for BorrowVisitor<'_, 'tcx> { fn visit_expr(&mut self, expr: &'tcx Expr<'_>) { - if self.borrows { + if self.borrows || expr.span.from_expansion() { return; } diff --git a/tests/ui/needless_return.fixed b/tests/ui/needless_return.fixed index 603d438d558..7c828430b78 100644 --- a/tests/ui/needless_return.fixed +++ b/tests/ui/needless_return.fixed @@ -53,7 +53,7 @@ fn test_closure() { } fn test_macro_call() -> i32 { - return the_answer!(); + the_answer!() } fn test_void_fun() { @@ -175,7 +175,7 @@ async fn async_test_closure() { } async fn async_test_macro_call() -> i32 { - return the_answer!(); + the_answer!() } async fn async_test_void_fun() { @@ -223,4 +223,10 @@ fn let_else() { let Some(1) = Some(1) else { return }; } +fn needless_return_macro() -> String { + let _ = "foo"; + let _ = "bar"; + format!("Hello {}", "world!") +} + fn main() {} diff --git a/tests/ui/needless_return.rs b/tests/ui/needless_return.rs index c6c8cb9ec15..fe82af00e67 100644 --- a/tests/ui/needless_return.rs +++ b/tests/ui/needless_return.rs @@ -223,4 +223,10 @@ fn let_else() { let Some(1) = Some(1) else { return }; } +fn needless_return_macro() -> String { + let _ = "foo"; + let _ = "bar"; + return format!("Hello {}", "world!"); +} + fn main() {} diff --git a/tests/ui/needless_return.stderr b/tests/ui/needless_return.stderr index 5bc787c56a6..4c8be47b025 100644 --- a/tests/ui/needless_return.stderr +++ b/tests/ui/needless_return.stderr @@ -49,6 +49,12 @@ LL | let _ = || return true; | ^^^^^^^^^^^ help: remove `return`: `true` error: unneeded `return` statement + --> $DIR/needless_return.rs:56:5 + | +LL | return the_answer!(); + | ^^^^^^^^^^^^^^^^^^^^^ help: remove `return`: `the_answer!()` + +error: unneeded `return` statement --> $DIR/needless_return.rs:60:5 | LL | return; @@ -169,6 +175,12 @@ LL | let _ = || return true; | ^^^^^^^^^^^ help: remove `return`: `true` error: unneeded `return` statement + --> $DIR/needless_return.rs:178:5 + | +LL | return the_answer!(); + | ^^^^^^^^^^^^^^^^^^^^^ help: remove `return`: `the_answer!()` + +error: unneeded `return` statement --> $DIR/needless_return.rs:182:5 | LL | return; @@ -204,5 +216,11 @@ error: unneeded `return` statement LL | return String::new(); | ^^^^^^^^^^^^^^^^^^^^^ help: remove `return`: `String::new()` -error: aborting due to 34 previous errors +error: unneeded `return` statement + --> $DIR/needless_return.rs:229:5 + | +LL | return format!("Hello {}", "world!"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return`: `format!("Hello {}", "world!")` + +error: aborting due to 37 previous errors |
