Add help message for missing IndexMut impl

Before this change it simply says "cannot assign to immutable indexed
content". This might be confusing for Rust beginners, as implementing
two traits for "one operator" is not intuitive.
This commit is contained in:
Lukas Kalbertodt 2018-07-27 20:44:09 +02:00
parent 45b48b9b6d
commit 9d59c6b76e
No known key found for this signature in database
GPG Key ID: 3CBAF4153F818627

View File

@ -881,6 +881,29 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
} }
} }
} }
// We add a special note about `IndexMut`, if the source of this error
// is the fact that `Index` is implemented, but `IndexMut` is not. Needing
// to implement two traits for "one operator" is not very intuitive for
// many programmers.
if err.cmt.note == mc::NoteIndex {
let node_id = self.tcx.hir.hir_to_node_id(err.cmt.hir_id);
let node = self.tcx.hir.get(node_id);
// This pattern probably always matches.
if let hir_map::NodeExpr(
hir::Expr { node: hir::ExprKind::Index(lhs, _), ..}
) = node {
let ty = self.tables.expr_ty(lhs);
db.help(&format!(
"trait `IndexMut` is required to modify indexed content, but \
it is not implemented for {}",
ty
));
}
}
db db
} }
BorrowViolation(euv::ClosureCapture(_)) => { BorrowViolation(euv::ClosureCapture(_)) => {