提交 e14562d5 编写于 作者: N Niko Matsakis

Rework the `IdVisitor` so that it only visits item contents (and doesn't

visit nested items). This is what all clients wanted anyhow.
上级 25727d70
...@@ -555,7 +555,6 @@ fn visit_ids<F>(&mut self, f: F) ...@@ -555,7 +555,6 @@ fn visit_ids<F>(&mut self, f: F)
{ {
let mut v = ast_util::IdVisitor { let mut v = ast_util::IdVisitor {
operation: self, operation: self,
pass_through_items: false,
visited_outermost: false, visited_outermost: false,
}; };
f(&mut v); f(&mut v);
...@@ -583,11 +582,7 @@ fn new(tcx: &'a ty::ctxt<'tcx>, ...@@ -583,11 +582,7 @@ fn new(tcx: &'a ty::ctxt<'tcx>,
fn visit_ids<F>(&mut self, f: F) fn visit_ids<F>(&mut self, f: F)
where F: FnOnce(&mut util::IdVisitor<LateContext>) where F: FnOnce(&mut util::IdVisitor<LateContext>)
{ {
let mut v = util::IdVisitor { let mut v = util::IdVisitor::new(self);
operation: self,
pass_through_items: false,
visited_outermost: false,
};
f(&mut v); f(&mut v);
} }
} }
......
...@@ -48,11 +48,7 @@ pub fn visit<'ast,V>(&'ast self, visitor: &mut V) ...@@ -48,11 +48,7 @@ pub fn visit<'ast,V>(&'ast self, visitor: &mut V)
} }
pub fn visit_ids<O: IdVisitingOperation>(&self, operation: &mut O) { pub fn visit_ids<O: IdVisitingOperation>(&self, operation: &mut O) {
let mut id_visitor = IdVisitor { let mut id_visitor = IdVisitor::new(operation);
operation: operation,
pass_through_items: true,
visited_outermost: false,
};
self.visit(&mut id_visitor); self.visit(&mut id_visitor);
} }
......
...@@ -485,11 +485,7 @@ fn record_renamings(const_expr: &hir::Expr, ...@@ -485,11 +485,7 @@ fn record_renamings(const_expr: &hir::Expr,
renaming_map: renaming_map, renaming_map: renaming_map,
}; };
let mut id_visitor = front_util::IdVisitor { let mut id_visitor = front_util::IdVisitor::new(&mut renaming_recorder);
operation: &mut renaming_recorder,
pass_through_items: true,
visited_outermost: false,
};
id_visitor.visit_expr(const_expr); id_visitor.visit_expr(const_expr);
} }
......
...@@ -289,7 +289,6 @@ pub trait IdVisitingOperation { ...@@ -289,7 +289,6 @@ pub trait IdVisitingOperation {
pub struct IdVisitor<'a, O:'a> { pub struct IdVisitor<'a, O:'a> {
pub operation: &'a mut O, pub operation: &'a mut O,
pub pass_through_items: bool,
pub visited_outermost: bool, pub visited_outermost: bool,
} }
...@@ -319,12 +318,10 @@ fn visit_foreign_item(&mut self, foreign_item: &ForeignItem) { ...@@ -319,12 +318,10 @@ fn visit_foreign_item(&mut self, foreign_item: &ForeignItem) {
} }
fn visit_item(&mut self, item: &Item) { fn visit_item(&mut self, item: &Item) {
if !self.pass_through_items { if self.visited_outermost {
if self.visited_outermost { return
return } else {
} else { self.visited_outermost = true
self.visited_outermost = true
}
} }
self.operation.visit_id(item.id); self.operation.visit_id(item.id);
...@@ -390,12 +387,10 @@ fn visit_fn(&mut self, ...@@ -390,12 +387,10 @@ fn visit_fn(&mut self,
block: &'v Block, block: &'v Block,
span: Span, span: Span,
node_id: NodeId) { node_id: NodeId) {
if !self.pass_through_items { match function_kind {
match function_kind { FnKind::Method(..) if self.visited_outermost => return,
FnKind::Method(..) if self.visited_outermost => return, FnKind::Method(..) => self.visited_outermost = true,
FnKind::Method(..) => self.visited_outermost = true, _ => {}
_ => {}
}
} }
self.operation.visit_id(node_id); self.operation.visit_id(node_id);
...@@ -420,10 +415,8 @@ fn visit_fn(&mut self, ...@@ -420,10 +415,8 @@ fn visit_fn(&mut self,
block, block,
span); span);
if !self.pass_through_items { if let FnKind::Method(..) = function_kind {
if let FnKind::Method(..) = function_kind { self.visited_outermost = false;
self.visited_outermost = false;
}
} }
} }
...@@ -497,7 +490,6 @@ pub fn compute_id_range_for_fn_body(fk: FnKind, ...@@ -497,7 +490,6 @@ pub fn compute_id_range_for_fn_body(fk: FnKind,
let mut visitor = IdRangeComputingVisitor::new(); let mut visitor = IdRangeComputingVisitor::new();
let mut id_visitor = IdVisitor { let mut id_visitor = IdVisitor {
operation: &mut visitor, operation: &mut visitor,
pass_through_items: false,
visited_outermost: false, visited_outermost: false,
}; };
id_visitor.visit_fn(fk, decl, body, sp, id); id_visitor.visit_fn(fk, decl, body, sp, id);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册