diff options
| author | Yukio Siraichi <yukio.siraichi@gmail.com> | 2018-03-13 01:06:04 -0300 |
|---|---|---|
| committer | Yukio Siraichi <yukio.siraichi@gmail.com> | 2018-03-18 20:46:27 -0300 |
| commit | 97b66d2987522d28bb69994e8908a5bb789bff37 (patch) | |
| tree | c272a7c12c39db02f7b895f21f2d9baec16e4ec2 | |
| parent | f44b945e0ed73c6d108a40655d3bed14133ec7db (diff) | |
| download | rust-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.rs | 14 |
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; |
