use rustc::mir::{Local, Location}; use rustc::mir::Mir; use rustc::mir::visit::PlaceContext; use rustc::mir::visit::Visitor; crate trait FindAssignments { // Finds all statements that assign directly to local (i.e., X = ...) // and returns their locations. fn find_assignments(&self, local: Local) -> Vec; } impl<'tcx> FindAssignments for Mir<'tcx>{ fn find_assignments(&self, local: Local) -> Vec{ let mut visitor = FindLocalAssignmentVisitor{ needle: local, locations: vec![]}; visitor.visit_mir(self); visitor.locations } } // The Visitor walks the MIR to return the assignment statements corresponding // to a Local. struct FindLocalAssignmentVisitor { needle: Local, locations: Vec, } impl<'tcx> Visitor<'tcx> for FindLocalAssignmentVisitor { fn visit_local(&mut self, local: &Local, place_context: PlaceContext<'tcx>, location: Location) { if self.needle != *local { return; } if place_context.is_place_assignment() { self.locations.push(location); } } }