1 use rustc::mir::visit::PlaceContext;
2 use rustc::mir::visit::Visitor;
3 use rustc::mir::ReadOnlyBodyAndCache;
4 use rustc::mir::{Local, Location};
6 crate trait FindAssignments {
7 // Finds all statements that assign directly to local (i.e., X = ...)
8 // and returns their locations.
9 fn find_assignments(&self, local: Local) -> Vec<Location>;
12 impl<'a, 'tcx> FindAssignments for ReadOnlyBodyAndCache<'a, 'tcx> {
13 fn find_assignments(&self, local: Local) -> Vec<Location> {
14 let mut visitor = FindLocalAssignmentVisitor { needle: local, locations: vec![] };
15 visitor.visit_body(*self);
20 // The Visitor walks the MIR to return the assignment statements corresponding
22 struct FindLocalAssignmentVisitor {
24 locations: Vec<Location>,
27 impl<'tcx> Visitor<'tcx> for FindLocalAssignmentVisitor {
28 fn visit_local(&mut self, local: &Local, place_context: PlaceContext, location: Location) {
29 if self.needle != *local {
33 if place_context.is_place_assignment() {
34 self.locations.push(location);