about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGrzegorz Bartoszek <grzegorz.bartoszek@thaumatec.com>2019-01-22 12:33:47 +0100
committerGrzegorz Bartoszek <grzegorz.bartoszek@thaumatec.com>2019-01-22 14:07:53 +0100
commit0f5c43a7227f830f1c083b00d89ceb2f57ccb923 (patch)
tree78f5ea72ba0035a7b7563d4b24da9647d69c36bb
parent9d5b14864827d8b4655842b29a1bd803e15e3f17 (diff)
downloadrust-0f5c43a7227f830f1c083b00d89ceb2f57ccb923.tar.gz
rust-0f5c43a7227f830f1c083b00d89ceb2f57ccb923.zip
Added "make_return" and "blockify" convenience methods in Sugg and used them in "needless_bool".
-rw-r--r--clippy_lints/src/needless_bool.rs14
-rw-r--r--clippy_lints/src/utils/sugg.rs29
2 files changed, 35 insertions, 8 deletions
diff --git a/clippy_lints/src/needless_bool.rs b/clippy_lints/src/needless_bool.rs
index a898a740cd8..3b1fea465f5 100644
--- a/clippy_lints/src/needless_bool.rs
+++ b/clippy_lints/src/needless_bool.rs
@@ -70,16 +70,14 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessBool {
             let reduce = |ret, not| {
                 let mut applicability = Applicability::MachineApplicable;
                 let snip = Sugg::hir_with_applicability(cx, pred, "<predicate>", &mut applicability);
-                let snip = if not { !snip } else { snip };
+                let mut snip = if not { !snip } else { snip };
 
-                let mut hint = if ret {
-                    format!("return {}", snip)
-                } else {
-                    snip.to_string()
-                };
+                if ret {
+                    snip = snip.make_return();
+                }
 
                 if parent_node_is_if_expr(&e, &cx) {
-                    hint = format!("{{ {} }}", hint);
+                    snip = snip.blockify()
                 }
 
                 span_lint_and_sugg(
@@ -88,7 +86,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessBool {
                     e.span,
                     "this if-then-else expression returns a bool literal",
                     "you can reduce it to",
-                    hint,
+                    snip.to_string(),
                     applicability,
                 );
             };
diff --git a/clippy_lints/src/utils/sugg.rs b/clippy_lints/src/utils/sugg.rs
index d42af5fde3a..b95ce17ed93 100644
--- a/clippy_lints/src/utils/sugg.rs
+++ b/clippy_lints/src/utils/sugg.rs
@@ -206,6 +206,17 @@ impl<'a> Sugg<'a> {
         make_unop("&mut *", self)
     }
 
+    /// Convenience method to transform suggestion into a return call
+    pub fn make_return(self) -> Sugg<'static> {
+        Sugg::NonParen(Cow::Owned(format!("return {}", self)))
+    }
+
+    /// Convenience method to transform suggestion into a block
+    /// where the suggestion is a trailing expression
+    pub fn blockify(self) -> Sugg<'static> {
+        Sugg::NonParen(Cow::Owned(format!("{{ {} }}", self)))
+    }
+
     /// Convenience method to create the `<lhs>..<rhs>` or `<lhs>...<rhs>`
     /// suggestion.
     #[allow(dead_code)]
@@ -578,3 +589,21 @@ impl<'a, 'b, 'c, T: LintContext<'c>> DiagnosticBuilderExt<'c, T> for rustc_error
         self.span_suggestion_with_applicability(remove_span, msg, String::new(), applicability);
     }
 }
+
+#[cfg(test)]
+mod test {
+    use super::Sugg;
+    use std::borrow::Cow;
+
+    const SUGGESTION: Sugg<'static> = Sugg::NonParen(Cow::Borrowed("function_call()"));
+
+    #[test]
+    fn make_return_transform_sugg_into_a_return_call() {
+        assert_eq!("return function_call()", SUGGESTION.make_return().to_string());
+    }
+
+    #[test]
+    fn blockify_transforms_sugg_into_a_block() {
+        assert_eq!("{ function_call() }", SUGGESTION.blockify().to_string());
+    }
+}