Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions clippy_lints/src/unnecessary_wraps.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::borrow::Cow;

use clippy_config::Conf;
use clippy_utils::diagnostics::span_lint_and_then;
use clippy_utils::source::snippet;
Expand Down Expand Up @@ -78,7 +80,7 @@ impl<'tcx> LateLintPass<'tcx> for UnnecessaryWraps {
fn_kind: FnKind<'tcx>,
fn_decl: &FnDecl<'tcx>,
body: &Body<'tcx>,
span: Span,
_span: Span,
def_id: LocalDefId,
) {
// Abort if public function/method or closure.
Expand Down Expand Up @@ -147,19 +149,22 @@ impl<'tcx> LateLintPass<'tcx> for UnnecessaryWraps {
"remove the return type...".to_string(),
// FIXME: we should instead get the span including the `->` and suggest an
// empty string for this case.
"()".to_string(),
"...and then remove returned values",
Cow::Borrowed("()"),
Cow::Borrowed("...and then remove returned values"),
)
} else {
let wrapper = if lang_item == OptionSome { "Some" } else { "Ok" };
(
format!("this function's return value is unnecessarily wrapped by `{return_type_label}`"),
format!("remove `{return_type_label}` from the return type..."),
inner_type.to_string(),
"...and then change returning expressions",
Cow::Owned(inner_type.to_string()),
Cow::Owned(format!(
"...and then remove the surrounding `{wrapper}()` from returning expressions"
)),
)
};

span_lint_and_then(cx, UNNECESSARY_WRAPS, span, lint_msg, |diag| {
span_lint_and_then(cx, UNNECESSARY_WRAPS, cx.tcx.def_span(def_id), lint_msg, |diag| {
diag.span_suggestion(
fn_decl.output.span(),
return_type_sugg_msg,
Expand Down
71 changes: 19 additions & 52 deletions tests/ui/unnecessary_wraps.stderr
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
error: this function's return value is unnecessarily wrapped by `Option`
--> tests/ui/unnecessary_wraps.rs:9:1
|
LL | / fn func1(a: bool, b: bool) -> Option<i32> {
LL | |
LL | |
LL | | if a && b {
... |
LL | | }
| |_^
LL | fn func1(a: bool, b: bool) -> Option<i32> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `-D clippy::unnecessary-wraps` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::unnecessary_wraps)]`
Expand All @@ -16,7 +11,7 @@ help: remove `Option` from the return type...
LL - fn func1(a: bool, b: bool) -> Option<i32> {
LL + fn func1(a: bool, b: bool) -> i32 {
|
help: ...and then change returning expressions
help: ...and then remove the surrounding `Some()` from returning expressions
|
LL ~ return 42;
LL | }
Expand All @@ -30,21 +25,15 @@ LL ~ return 1337;
error: this function's return value is unnecessarily wrapped by `Option`
--> tests/ui/unnecessary_wraps.rs:24:1
|
LL | / fn func2(a: bool, b: bool) -> Option<i32> {
LL | |
LL | |
LL | | if a && b {
... |
LL | | if a { Some(20) } else { Some(30) }
LL | | }
| |_^
LL | fn func2(a: bool, b: bool) -> Option<i32> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: remove `Option` from the return type...
|
LL - fn func2(a: bool, b: bool) -> Option<i32> {
LL + fn func2(a: bool, b: bool) -> i32 {
|
help: ...and then change returning expressions
help: ...and then remove the surrounding `Some()` from returning expressions
|
LL ~ return 10;
LL | }
Expand All @@ -54,19 +43,15 @@ LL ~ if a { 20 } else { 30 }
error: this function's return value is unnecessarily wrapped by `Option`
--> tests/ui/unnecessary_wraps.rs:44:1
|
LL | / fn func5() -> Option<i32> {
LL | |
LL | |
LL | | Some(1)
LL | | }
| |_^
LL | fn func5() -> Option<i32> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: remove `Option` from the return type...
|
LL - fn func5() -> Option<i32> {
LL + fn func5() -> i32 {
|
help: ...and then change returning expressions
help: ...and then remove the surrounding `Some()` from returning expressions
|
LL - Some(1)
LL + 1
Expand All @@ -75,19 +60,15 @@ LL + 1
error: this function's return value is unnecessarily wrapped by `Result`
--> tests/ui/unnecessary_wraps.rs:56:1
|
LL | / fn func7() -> Result<i32, ()> {
LL | |
LL | |
LL | | Ok(1)
LL | | }
| |_^
LL | fn func7() -> Result<i32, ()> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: remove `Result` from the return type...
|
LL - fn func7() -> Result<i32, ()> {
LL + fn func7() -> i32 {
|
help: ...and then change returning expressions
help: ...and then remove the surrounding `Ok()` from returning expressions
|
LL - Ok(1)
LL + 1
Expand All @@ -96,19 +77,15 @@ LL + 1
error: this function's return value is unnecessarily wrapped by `Option`
--> tests/ui/unnecessary_wraps.rs:86:5
|
LL | / fn func12() -> Option<i32> {
LL | |
LL | |
LL | | Some(1)
LL | | }
| |_____^
LL | fn func12() -> Option<i32> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: remove `Option` from the return type...
|
LL - fn func12() -> Option<i32> {
LL + fn func12() -> i32 {
|
help: ...and then change returning expressions
help: ...and then remove the surrounding `Some()` from returning expressions
|
LL - Some(1)
LL + 1
Expand All @@ -117,13 +94,8 @@ LL + 1
error: this function's return value is unnecessary
--> tests/ui/unnecessary_wraps.rs:115:1
|
LL | / fn issue_6640_1(a: bool, b: bool) -> Option<()> {
LL | |
LL | |
LL | | if a && b {
... |
LL | | }
| |_^
LL | fn issue_6640_1(a: bool, b: bool) -> Option<()> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: remove the return type...
|
Expand All @@ -144,13 +116,8 @@ LL ~ return ;
error: this function's return value is unnecessary
--> tests/ui/unnecessary_wraps.rs:130:1
|
LL | / fn issue_6640_2(a: bool, b: bool) -> Result<(), i32> {
LL | |
LL | |
LL | | if a && b {
... |
LL | | }
| |_^
LL | fn issue_6640_2(a: bool, b: bool) -> Result<(), i32> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: remove the return type...
|
Expand Down