@@ -33,36 +33,28 @@ fn field_exprs(fields: [ast::field]) -> [@ast::expr] {
33
33
ret es;
34
34
}
35
35
36
- fn has_nonlocal_exits ( b : ast:: blk ) -> bool {
37
- let has_exits = @mut false ;
38
- fn visit_expr ( flag : @mut bool , e : @ast:: expr ) {
39
- alt e. node {
40
- ast:: expr_break { * flag = true ; }
41
- ast:: expr_cont { * flag = true ; }
42
- _ { }
43
- }
44
- }
36
+ // Takes a predicate p, returns true iff p is true for any subexpressions
37
+ // of b
38
+ fn block_expr_query ( b : ast:: blk , p : fn @( ast:: expr_ ) -> bool ) -> bool {
39
+ let rs = @mut false ;
40
+ let visit_expr = { |flag : @mut bool , e : @ast:: expr | * flag |= p ( e. node ) } ;
45
41
let v =
46
- visit:: mk_simple_visitor ( @{ visit_expr: bind visit_expr ( has_exits , _)
42
+ visit:: mk_simple_visitor ( @{ visit_expr: bind visit_expr ( rs , _)
47
43
with * visit:: default_simple_visitor ( ) } ) ;
48
44
visit:: visit_block ( b, ( ) , v) ;
49
- ret * has_exits;
45
+ ret * rs;
46
+ }
47
+
48
+ fn has_nonlocal_exits ( b : ast:: blk ) -> bool {
49
+ block_expr_query ( b) { |e| alt e {
50
+ ast : : expr_break | ast:: expr_cont { true }
51
+ _ { false } } }
50
52
}
51
53
52
- /* FIXME: copy/paste, yuck */
53
54
fn may_break ( b : ast:: blk ) -> bool {
54
- let has_exits = @mut false ;
55
- fn visit_expr ( flag : @mut bool , e : @ast:: expr ) {
56
- alt e. node {
57
- ast:: expr_break { * flag = true ; }
58
- _ { }
59
- }
60
- }
61
- let v =
62
- visit:: mk_simple_visitor ( @{ visit_expr: bind visit_expr ( has_exits, _)
63
- with * visit:: default_simple_visitor ( ) } ) ;
64
- visit:: visit_block ( b, ( ) , v) ;
65
- ret * has_exits;
55
+ block_expr_query ( b) { |e| alt e {
56
+ ast : : expr_break { true }
57
+ _ { false } } }
66
58
}
67
59
68
60
fn local_rhs_span ( l : @ast:: local , def : span ) -> span {
@@ -71,7 +63,7 @@ fn local_rhs_span(l: @ast::local, def: span) -> span {
71
63
72
64
fn is_main_name ( path : syntax:: ast_map:: path ) -> bool {
73
65
// FIXME: path should be a constrained type, so we know
74
- // the call to last doesn't fail
66
+ // the call to last doesn't fail (#34)
75
67
vec:: last ( path) == syntax:: ast_map:: path_name ( @"main")
76
68
}
77
69
0 commit comments