//! Def-use analysis.
-use rustc::mir::{Local, Location, Body};
+use rustc::mir::{Body, Local, Location, PlaceElem};
use rustc::mir::visit::{PlaceContext, MutVisitor, Visitor};
use rustc_index::vec::IndexVec;
use std::mem;
&self.info[local]
}
- fn mutate_defs_and_uses<F>(&self, local: Local, body: &mut Body<'_>, mut callback: F)
- where F: for<'a> FnMut(&'a mut Local,
- PlaceContext,
- Location) {
+ fn mutate_defs_and_uses(&self, local: Local, body: &mut Body<'_>, new_local: Local) {
for place_use in &self.info[local].defs_and_uses {
MutateUseVisitor::new(local,
- &mut callback,
+ new_local,
body).visit_location(body, place_use.location)
}
}
local: Local,
body: &mut Body<'_>,
new_local: Local) {
- self.mutate_defs_and_uses(local, body, |local, _, _| *local = new_local)
+ self.mutate_defs_and_uses(local, body, new_local)
}
}
}
}
-struct MutateUseVisitor<F> {
+struct MutateUseVisitor {
query: Local,
- callback: F,
+ new_local: Local,
}
-impl<F> MutateUseVisitor<F> {
- fn new(query: Local, callback: F, _: &Body<'_>)
- -> MutateUseVisitor<F>
- where F: for<'a> FnMut(&'a mut Local, PlaceContext, Location) {
+impl MutateUseVisitor {
+ fn new(query: Local, new_local: Local, _: &Body<'_>) -> MutateUseVisitor {
MutateUseVisitor {
query,
- callback,
+ new_local,
}
}
}
-impl<F> MutVisitor<'_> for MutateUseVisitor<F>
- where F: for<'a> FnMut(&'a mut Local, PlaceContext, Location) {
+impl MutVisitor<'_> for MutateUseVisitor {
fn visit_local(&mut self,
local: &mut Local,
- context: PlaceContext,
- location: Location) {
+ _context: PlaceContext,
+ _location: Location) {
if *local == self.query {
- (self.callback)(local, context, location)
+ *local = self.new_local;
+ }
+ }
+
+ fn process_projection_elem(
+ &mut self,
+ elem: &PlaceElem<'tcx>,
+ ) -> Option<PlaceElem<'tcx>> {
+ match elem {
+ PlaceElem::Index(local) if *local == self.query => {
+ Some(PlaceElem::Index(self.new_local))
+ }
+ _ => None,
}
}
}