]> git.lizzy.rs Git - rust.git/commitdiff
Refactored with high-order functions.
authorYukio Siraichi <yukio.siraichi@gmail.com>
Sun, 11 Mar 2018 05:21:38 +0000 (02:21 -0300)
committerYukio Siraichi <yukio.siraichi@gmail.com>
Sun, 18 Mar 2018 23:46:24 +0000 (20:46 -0300)
src/librustc/traits/error_reporting.rs

index c90a6d0709db65dd4f56fcadecc1760e8fdb4362..5bfeff89e355a8335725e3bc6d9fbf5f4a4f8044 100644 (file)
@@ -888,28 +888,22 @@ fn suggest_remove_reference(&self,
                                 err: &mut DiagnosticBuilder<'tcx>,
                                 trait_ref: &ty::Binder<ty::TraitRef<'tcx>>) {
         let ty::Binder(trait_ref) = trait_ref;
-
         let span = obligation.cause.span;
-        let mut snippet = match self.tcx.sess.codemap().span_to_snippet(span) {
-            Ok(s) => s,
-            Err(_) => String::from(""),
-        };
 
-        let mut refs_number = 0;
+        if let Ok(snippet) = self.tcx.sess.codemap().span_to_snippet(span) {
+            let refs_number = snippet.chars()
+                .filter(|c| !c.is_whitespace())
+                .take_while(|c| *c == '&')
+                .count();
 
-        for c in snippet.chars() {
-            if c == '&' {
-                refs_number += 1;
-            }
-        }
+            let mut refs_remaining = refs_number;
+            let mut trait_type = trait_ref.self_ty();
+            let mut selcx = SelectionContext::new(self);
 
-        let mut refs_remaining = refs_number;
-        let mut trait_type = trait_ref.self_ty();
-        let mut selcx = SelectionContext::new(self);
+            while refs_remaining > 0 {
+                if let ty::TypeVariants::TyRef(_, ty::TypeAndMut{ ty: t_type, mutbl: _ }) =
+                    trait_type.sty {
 
-        while refs_remaining > 0 {
-            if let ty::TypeVariants::TyRef(_, ty::TypeAndMut{ ty: t_type, mutbl: _ }) =
-                trait_type.sty {
                     trait_type = t_type;
                     refs_remaining -= 1;
 
@@ -920,14 +914,20 @@ fn suggest_remove_reference(&self,
                                                          new_trait_ref.to_predicate());
 
                     if selcx.evaluate_obligation(&new_obligation) {
-                        for i in 0..refs_number {
-                            snippet.remove(i);
-                        }
-                        err.span_suggestion(span, "consider removing `&`s like", format!("{}", snippet));
+                        let suggest_snippet = snippet.chars()
+                            .skip(refs_number)
+                            .collect::<String>();
+
+                        err.span_suggestion(span,
+                                            "consider removing `&`s like",
+                                            format!("{}", suggest_snippet));
+
+                        break;
                     }
                 } else {
                     break;
                 }
+            }
         }
     }