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:
parent
45b48b9b6d
commit
9d59c6b76e
@ -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(_)) => {
|
||||||
|
Loading…
Reference in New Issue
Block a user