about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYukio Siraichi <yukio.siraichi@gmail.com>2018-03-13 01:06:04 -0300
committerYukio Siraichi <yukio.siraichi@gmail.com>2018-03-18 20:46:27 -0300
commit97b66d2987522d28bb69994e8908a5bb789bff37 (patch)
treec272a7c12c39db02f7b895f21f2d9baec16e4ec2
parentf44b945e0ed73c6d108a40655d3bed14133ec7db (diff)
downloadrust-97b66d2987522d28bb69994e8908a5bb789bff37.tar.gz
rust-97b66d2987522d28bb69994e8908a5bb789bff37.zip
Review fixes.
- `suggest_snippet` handling space between refs;
- Suggest message changing according to the number of refs that should
be removed.
-rw-r--r--src/librustc/traits/error_reporting.rs14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs
index 5bfeff89e35..31c8cb25c52 100644
--- a/src/librustc/traits/error_reporting.rs
+++ b/src/librustc/traits/error_reporting.rs
@@ -883,6 +883,8 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
         }
     }
 
+    /// Whenever references are used by mistake, like `for (i, e) in &vec.iter().enumerate()`,
+    /// suggest removing these references until we reach a type that implements the trait.
     fn suggest_remove_reference(&self,
                                 obligation: &PredicateObligation<'tcx>,
                                 err: &mut DiagnosticBuilder<'tcx>,
@@ -896,16 +898,14 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
                 .take_while(|c| *c == '&')
                 .count();
 
-            let mut refs_remaining = refs_number;
             let mut trait_type = trait_ref.self_ty();
             let mut selcx = SelectionContext::new(self);
 
-            while refs_remaining > 0 {
+            for refs_remaining in 0..refs_number {
                 if let ty::TypeVariants::TyRef(_, ty::TypeAndMut{ ty: t_type, mutbl: _ }) =
                     trait_type.sty {
 
                     trait_type = t_type;
-                    refs_remaining -= 1;
 
                     let substs = self.tcx.mk_substs_trait(trait_type, &[]);
                     let new_trait_ref = ty::TraitRef::new(trait_ref.def_id, substs);
@@ -914,12 +914,16 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
                                                          new_trait_ref.to_predicate());
 
                     if selcx.evaluate_obligation(&new_obligation) {
+                        let remove_refs = refs_remaining + 1;
+
                         let suggest_snippet = snippet.chars()
-                            .skip(refs_number)
+                            .filter(|c| !c.is_whitespace())
+                            .skip(remove_refs)
                             .collect::<String>();
 
                         err.span_suggestion(span,
-                                            "consider removing `&`s like",
+                                            &format!("consider removing {} references `&`",
+                                                    remove_refs),
                                             format!("{}", suggest_snippet));
 
                         break;