Move the linearly-updated flag state into the Visitor.

This commit is contained in:
Felix S. Klock II 2013-09-25 10:55:04 +02:00
parent 6ed338caa7
commit eac429cc9e
1 changed files with 18 additions and 16 deletions

View File

@ -61,17 +61,18 @@ pub fn field_exprs(fields: ~[ast::Field]) -> ~[@ast::Expr] {
}
struct LoopQueryVisitor<'self> {
p: &'self fn(&ast::Expr_) -> bool
p: &'self fn(&ast::Expr_) -> bool,
flag: bool,
}
impl<'self> Visitor<@mut bool> for LoopQueryVisitor<'self> {
fn visit_expr(&mut self, e: @ast::Expr, flag: @mut bool) {
*flag |= (self.p)(&e.node);
impl<'self> Visitor<()> for LoopQueryVisitor<'self> {
fn visit_expr(&mut self, e: @ast::Expr, _: ()) {
self.flag |= (self.p)(&e.node);
match e.node {
// Skip inner loops, since a break in the inner loop isn't a
// break inside the outer loop
ast::ExprLoop(*) | ast::ExprWhile(*) => {}
_ => visit::walk_expr(self, e, flag)
_ => visit::walk_expr(self, e, ())
}
}
}
@ -79,34 +80,35 @@ impl<'self> Visitor<@mut bool> for LoopQueryVisitor<'self> {
// Takes a predicate p, returns true iff p is true for any subexpressions
// of b -- skipping any inner loops (loop, while, loop_body)
pub fn loop_query(b: &ast::Block, p: &fn(&ast::Expr_) -> bool) -> bool {
let rs = @mut false;
let mut v = LoopQueryVisitor {
p: p,
flag: false,
};
visit::walk_block(&mut v, b, rs);
return *rs;
visit::walk_block(&mut v, b, ());
return v.flag;
}
struct BlockQueryVisitor<'self> {
p: &'self fn(@ast::Expr) -> bool
p: &'self fn(@ast::Expr) -> bool,
flag: bool,
}
impl<'self> Visitor<@mut bool> for BlockQueryVisitor<'self> {
fn visit_expr(&mut self, e: @ast::Expr, flag: @mut bool) {
*flag |= (self.p)(e);
visit::walk_expr(self, e, flag)
impl<'self> Visitor<()> for BlockQueryVisitor<'self> {
fn visit_expr(&mut self, e: @ast::Expr, _:()) {
self.flag |= (self.p)(e);
visit::walk_expr(self, e, ())
}
}
// Takes a predicate p, returns true iff p is true for any subexpressions
// of b -- skipping any inner loops (loop, while, loop_body)
pub fn block_query(b: &ast::Block, p: &fn(@ast::Expr) -> bool) -> bool {
let rs = @mut false;
let mut v = BlockQueryVisitor {
p: p,
flag: false,
};
visit::walk_block(&mut v, b, rs);
return *rs;
visit::walk_block(&mut v, b, ());
return v.flag;
}
pub fn local_rhs_span(l: @ast::Local, def: Span) -> Span {