Skip to content

Commit

Permalink
Rollup merge of rust-lang#46349 - estebank:highlight-ref, r=arielb1
Browse files Browse the repository at this point in the history
On type mismatch error highlight `&` when type matches

When the only difference between the two types in a type error is that
one is a reference to the other type (`T` vs `&T`) or both are
references differing only in their mutability (`&T` vs `&mut T`), don't
highlight the type (`T`).
  • Loading branch information
Ariel Ben-Yehuda authored Nov 30, 2017
2 parents 69ebdd6 + 02808f1 commit 34bd545
Showing 1 changed file with 56 additions and 0 deletions.
56 changes: 56 additions & 0 deletions src/librustc/infer/error_reporting/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,39 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
fn cmp(&self, t1: Ty<'tcx>, t2: Ty<'tcx>)
-> (DiagnosticStyledString, DiagnosticStyledString)
{
fn equals<'tcx>(a: &Ty<'tcx>, b: &Ty<'tcx>) -> bool {
match (&a.sty, &b.sty) {
(a, b) if *a == *b => true,
(&ty::TyInt(_), &ty::TyInfer(ty::InferTy::IntVar(_))) |
(&ty::TyInfer(ty::InferTy::IntVar(_)), &ty::TyInt(_)) |
(&ty::TyInfer(ty::InferTy::IntVar(_)), &ty::TyInfer(ty::InferTy::IntVar(_))) |
(&ty::TyFloat(_), &ty::TyInfer(ty::InferTy::FloatVar(_))) |
(&ty::TyInfer(ty::InferTy::FloatVar(_)), &ty::TyFloat(_)) |
(&ty::TyInfer(ty::InferTy::FloatVar(_)),
&ty::TyInfer(ty::InferTy::FloatVar(_))) => true,
_ => false,
}
}

fn push_ty_ref<'tcx>(r: &ty::Region<'tcx>,
tnm: &ty::TypeAndMut<'tcx>,
s: &mut DiagnosticStyledString) {
let r = &format!("{}", r);
s.push_highlighted(format!("&{}{}{}",
r,
if r == "" {
""
} else {
" "
},
if tnm.mutbl == hir::MutMutable {
"mut "
} else {
""
}));
s.push_normal(format!("{}", tnm.ty));
}

match (&t1.sty, &t2.sty) {
(&ty::TyAdt(def1, sub1), &ty::TyAdt(def2, sub2)) => {
let mut values = (DiagnosticStyledString::new(), DiagnosticStyledString::new());
Expand Down Expand Up @@ -672,6 +705,29 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
DiagnosticStyledString::highlighted(format!("{}", t2)))
}
}

// When finding T != &T, hightlight only the borrow
(&ty::TyRef(r1, ref tnm1), _) if equals(&tnm1.ty, &t2) => {
let mut values = (DiagnosticStyledString::new(), DiagnosticStyledString::new());
push_ty_ref(&r1, tnm1, &mut values.0);
values.1.push_normal(format!("{}", t2));
values
}
(_, &ty::TyRef(r2, ref tnm2)) if equals(&t1, &tnm2.ty) => {
let mut values = (DiagnosticStyledString::new(), DiagnosticStyledString::new());
values.0.push_normal(format!("{}", t1));
push_ty_ref(&r2, tnm2, &mut values.1);
values
}

// When encountering &T != &mut T, highlight only the borrow
(&ty::TyRef(r1, ref tnm1), &ty::TyRef(r2, ref tnm2)) if equals(&tnm1.ty, &tnm2.ty) => {
let mut values = (DiagnosticStyledString::new(), DiagnosticStyledString::new());
push_ty_ref(&r1, tnm1, &mut values.0);
push_ty_ref(&r2, tnm2, &mut values.1);
values
}

_ => {
if t1 == t2 {
// The two types are the same, elide and don't highlight.
Expand Down

0 comments on commit 34bd545

Please sign in to comment.