diff options
| author | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-06-14 12:24:56 -0700 |
|---|---|---|
| committer | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-06-14 12:24:56 -0700 |
| commit | fcab11da47daa6461a3b5895a1dc16e582f7cae3 (patch) | |
| tree | 69c3b94bfcd4f3e47f2c49c8eec5e0e4ea02dc24 | |
| parent | 24f9f45ac68f4b29997a20b63de7997536f89dd1 (diff) | |
| download | rust-fcab11da47daa6461a3b5895a1dc16e582f7cae3.tar.gz rust-fcab11da47daa6461a3b5895a1dc16e582f7cae3.zip | |
Refactor; annotate a FIXME
| -rw-r--r-- | src/rustc/util/common.rs | 42 |
1 files changed, 17 insertions, 25 deletions
diff --git a/src/rustc/util/common.rs b/src/rustc/util/common.rs index e382e3835ba..845bd8b1fb4 100644 --- a/src/rustc/util/common.rs +++ b/src/rustc/util/common.rs @@ -33,36 +33,28 @@ fn field_exprs(fields: [ast::field]) -> [@ast::expr] { ret es; } -fn has_nonlocal_exits(b: ast::blk) -> bool { - let has_exits = @mut false; - fn visit_expr(flag: @mut bool, e: @ast::expr) { - alt e.node { - ast::expr_break { *flag = true; } - ast::expr_cont { *flag = true; } - _ { } - } - } +// Takes a predicate p, returns true iff p is true for any subexpressions +// of b +fn block_expr_query(b: ast::blk, p: fn@(ast::expr_) -> bool) -> bool { + let rs = @mut false; + let visit_expr = {|flag: @mut bool, e: @ast::expr| *flag |= p(e.node)}; let v = - visit::mk_simple_visitor(@{visit_expr: bind visit_expr(has_exits, _) + visit::mk_simple_visitor(@{visit_expr: bind visit_expr(rs, _) with *visit::default_simple_visitor()}); visit::visit_block(b, (), v); - ret *has_exits; + ret *rs; +} + +fn has_nonlocal_exits(b: ast::blk) -> bool { + block_expr_query(b) {|e| alt e { + ast::expr_break | ast::expr_cont { true } + _ { false }}} } -/* FIXME: copy/paste, yuck */ fn may_break(b: ast::blk) -> bool { - let has_exits = @mut false; - fn visit_expr(flag: @mut bool, e: @ast::expr) { - alt e.node { - ast::expr_break { *flag = true; } - _ { } - } - } - let v = - visit::mk_simple_visitor(@{visit_expr: bind visit_expr(has_exits, _) - with *visit::default_simple_visitor()}); - visit::visit_block(b, (), v); - ret *has_exits; + block_expr_query(b) {|e| alt e { + ast::expr_break { true } + _ { false }}} } fn local_rhs_span(l: @ast::local, def: span) -> span { @@ -71,7 +63,7 @@ fn local_rhs_span(l: @ast::local, def: span) -> span { fn is_main_name(path: syntax::ast_map::path) -> bool { // FIXME: path should be a constrained type, so we know - // the call to last doesn't fail + // the call to last doesn't fail (#34) vec::last(path) == syntax::ast_map::path_name(@"main") } |
