]> git.lizzy.rs Git - rust.git/blobdiff - clippy_lints/src/trait_bounds.rs
Auto merge of #4551 - mikerite:fix-ice-reporting, r=llogiq
[rust.git] / clippy_lints / src / trait_bounds.rs
index f5ca3793dbc04618f860f5b32c7b683032320466..edb91d617ee45e00b18916797342fddc7c05a4b2 100644 (file)
@@ -1,8 +1,8 @@
 use crate::utils::{in_macro, snippet, span_help_and_lint, SpanlessHash};
+use rustc::hir::*;
 use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass};
 use rustc::{declare_tool_lint, impl_lint_pass};
 use rustc_data_structures::fx::FxHashMap;
-use rustc::hir::*;
 
 #[derive(Copy, Clone)]
 pub struct TraitBounds;
 declare_clippy_lint! {
     /// **What it does:** This lint warns about unnecessary type repetitions in trait bounds
     ///
-    /// **Why is this bad?** Complexity
+    /// **Why is this bad?** Repeating the type for every bound makes the code
+    /// less readable than combining the bounds
     ///
     /// **Example:**
     /// ```rust
-    /// pub fn foo<T>(t: T) where T: Copy, T: Clone 
+    /// pub fn foo<T>(t: T) where T: Copy, T: Clone {}
     /// ```
     ///
     /// Could be written as:
     ///
     /// ```rust
-    /// pub fn foo<T>(t: T) where T: Copy + Clone
+    /// pub fn foo<T>(t: T) where T: Copy + Clone {}
     /// ```
     pub TYPE_REPETITION_IN_BOUNDS,
-    complexity,
+    pedantic,
     "Types are repeated unnecessary in trait bounds use `+` instead of using `T: _, T: _`"
 }
 
@@ -34,7 +35,7 @@ fn check_generics(&mut self, cx: &LateContext<'a, 'tcx>, gen: &'tcx Generics) {
         if in_macro(gen.span) {
             return;
         }
-        let hash = | ty | -> u64 {
+        let hash = |ty| -> u64 {
             let mut hasher = SpanlessHash::new(cx, cx.tables);
             hasher.hash_ty(ty);
             hasher.finish()
@@ -44,17 +45,20 @@ fn check_generics(&mut self, cx: &LateContext<'a, 'tcx>, gen: &'tcx Generics) {
             if let WherePredicate::BoundPredicate(ref p) = bound {
                 let h = hash(&p.bounded_ty);
                 if let Some(ref v) = map.insert(h, p.bounds.iter().collect::<Vec<_>>()) {
-                    let mut hint_string = format!("consider combining the bounds: `{}: ", snippet(cx, p.bounded_ty.span, "_"));
+                    let mut hint_string = format!(
+                        "consider combining the bounds: `{}:",
+                        snippet(cx, p.bounded_ty.span, "_")
+                    );
                     for b in v.iter() {
                         if let GenericBound::Trait(ref poly_trait_ref, _) = b {
                             let path = &poly_trait_ref.trait_ref.path;
-                            hint_string.push_str(&format!("{}, ", path));
+                            hint_string.push_str(&format!(" {} +", path));
                         }
                     }
                     for b in p.bounds.iter() {
                         if let GenericBound::Trait(ref poly_trait_ref, _) = b {
                             let path = &poly_trait_ref.trait_ref.path;
-                            hint_string.push_str(&format!("{}, ", path));
+                            hint_string.push_str(&format!(" {} +", path));
                         }
                     }
                     hint_string.truncate(hint_string.len() - 2);