Skip to content

Commit d08c0f0

Browse files
committed
Make ast::pat_bindings an iterator
And use it to get rid of some repetetive code
1 parent 948f809 commit d08c0f0

File tree

9 files changed

+48
-74
lines changed

9 files changed

+48
-74
lines changed

src/comp/middle/alias.rs

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -310,22 +310,7 @@ fn check_alt(cx: &ctx, input: &@ast::expr, arms: &ast::arm[], sc: &scope,
310310
}
311311

312312
fn arm_defnums(arm: &ast::arm) -> node_id[] {
313-
let dnums = ~[];
314-
fn walk_pat(found: &mutable node_id[], p: &@ast::pat) {
315-
alt p.node {
316-
ast::pat_bind(_) { found += ~[p.id]; }
317-
ast::pat_tag(_, children) {
318-
for child: @ast::pat in children { walk_pat(found, child); }
319-
}
320-
ast::pat_rec(fields, _) {
321-
for f: ast::field_pat in fields { walk_pat(found, f.pat); }
322-
}
323-
ast::pat_box(inner) { walk_pat(found, inner); }
324-
_ { }
325-
}
326-
}
327-
walk_pat(dnums, arm.pats.(0));
328-
ret dnums;
313+
ret ast::pat_binding_ids(arm.pats.(0));
329314
}
330315

331316
fn check_for_each(cx: &ctx, local: &@ast::local, call: &@ast::expr,
@@ -334,10 +319,7 @@ fn check_for_each(cx: &ctx, local: &@ast::local, call: &@ast::expr,
334319
alt call.node {
335320
ast::expr_call(f, args) {
336321
let data = check_call(cx, f, args, sc);
337-
let bindings = ~[];
338-
for p: @ast::pat in ast::pat_bindings(local.node.pat) {
339-
bindings += ~[p.id];
340-
}
322+
let bindings = ast::pat_binding_ids(local.node.pat);
341323
let new_sc = @{root_vars: data.root_vars,
342324
block_defnum: bindings.(ivec::len(bindings) - 1u),
343325
bindings: bindings,
@@ -370,10 +352,7 @@ fn check_for(cx: &ctx, local: &@ast::local, seq: &@ast::expr, blk: &ast::blk,
370352
util::ppaux::ty_to_str(cx.tcx, seq_t));
371353
}
372354
}
373-
let bindings = ~[];
374-
for p: @ast::pat in ast::pat_bindings(local.node.pat) {
375-
bindings += ~[p.id];
376-
}
355+
let bindings = ast::pat_binding_ids(local.node.pat);
377356
let new_sc = @{root_vars: root_def,
378357
block_defnum: bindings.(ivec::len(bindings) - 1u),
379358
bindings: bindings,

src/comp/middle/freevars.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ fn collect_freevars(def_map: &resolve::def_map, sess: &session::session,
6969
}
7070
}
7171
fn walk_local(e: env, local: &@ast::local) {
72-
for b: @ast::pat in ast::pat_bindings(local.node.pat) {
72+
for each b: @ast::pat in ast::pat_bindings(local.node.pat) {
7373
set_add(e.decls, b.id);
7474
}
7575
}
@@ -133,10 +133,7 @@ fn annotate_freevars(sess: &session::session, def_map: &resolve::def_map,
133133
fn start_walk(b: &ast::blk, v: &visit::vt[()]) {
134134
v.visit_block(b, (), v);
135135
}
136-
let bound = ~[];
137-
for b: @ast::pat in ast::pat_bindings(local.node.pat){
138-
bound += ~[b.id];
139-
}
136+
let bound = ast::pat_binding_ids(local.node.pat);
140137
let vars =
141138
collect_freevars(e.def_map, e.sess, bind start_walk(body, _),
142139
bound);

src/comp/middle/resolve.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,16 +1241,9 @@ fn check_item(e: &@env, i: &@ast::item, x: &(), v: &vt[()]) {
12411241
}
12421242

12431243
fn check_pat(ch: checker, p: &@ast::pat) {
1244-
alt p.node {
1245-
ast::pat_bind(name) { add_name(ch, p.span, name); }
1246-
ast::pat_tag(_, children) {
1247-
for child: @ast::pat in children { check_pat(ch, child); }
1248-
}
1249-
ast::pat_rec(fields, _) {
1250-
for f: ast::field_pat in fields { check_pat(ch, f.pat); }
1251-
}
1252-
ast::pat_box(inner) { check_pat(ch, inner); }
1253-
_ { }
1244+
for each p in ast::pat_bindings(p) {
1245+
let ident = alt p.node { pat_bind(n) { n } };
1246+
add_name(ch, p.span, ident);
12541247
}
12551248
}
12561249

src/comp/middle/tstate/annotate.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ fn collect_ids_stmt(s: &@stmt, rs: @mutable node_id[]) {
4444
}
4545

4646
fn collect_ids_local(l: &@local, rs: @mutable node_id[]) {
47-
for p: @pat in pat_bindings(l.node.pat) {
48-
*rs += ~[p.id];
49-
}
47+
*rs += pat_binding_ids(l.node.pat);
5048
}
5149

5250
fn node_ids_in_fn(f: &_fn, tps: &ty_param[], sp: &span, i: &fn_ident,

src/comp/middle/tstate/auxiliary.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1081,7 +1081,7 @@ type binding = {lhs: inst[], rhs: option::t[initializer]};
10811081

10821082
fn local_to_bindings(loc : &@local) -> binding {
10831083
let lhs = ~[];
1084-
for p: @pat in pat_bindings(loc.node.pat) {
1084+
for each p: @pat in pat_bindings(loc.node.pat) {
10851085
let ident = alt p.node { pat_bind(name) { name } };
10861086
lhs += ~[{ident: ident, node: p.id}];
10871087
}

src/comp/middle/tstate/collect_locals.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import syntax::ast::respan;
1414
type ctxt = {cs: @mutable sp_constr[], tcx: ty::ctxt};
1515

1616
fn collect_local(loc: &@local, cx: &ctxt, v: &visit::vt[ctxt]) {
17-
for p: @pat in pat_bindings(loc.node.pat) {
17+
for each p: @pat in pat_bindings(loc.node.pat) {
1818
let ident = alt p.node { pat_bind(id) { id } };
1919
log "collect_local: pushing " + ident;
2020
*cx.cs += ~[respan(loc.span, ninit(p.id, ident))];

src/comp/middle/tstate/pre_post_conditions.rs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ fn find_pre_post_loop(fcx: &fn_ctxt, l: &@local, index: &@expr, body: &blk,
136136
id: node_id) {
137137
find_pre_post_expr(fcx, index);
138138
find_pre_post_block(fcx, body);
139-
for p: @pat in pat_bindings(l.node.pat) {
139+
for each p: @pat in pat_bindings(l.node.pat) {
140140
let ident = alt p.node { pat_bind(id) { id } };
141141
let v_init = ninit(p.id, ident);
142142
relax_precond_block(fcx, bit_num(fcx, v_init) as node_id, body);
@@ -578,45 +578,46 @@ fn find_pre_post_stmt(fcx: &fn_ctxt, s: &stmt) {
578578
alt adecl.node {
579579
decl_local(alocals) {
580580
for alocal: @local in alocals {
581-
let bindings = pat_bindings(alocal.node.pat);
582581
alt alocal.node.init {
583582
some(an_init) {
584583
/* LHS always becomes initialized,
585584
whether or not this is a move */
586585
find_pre_post_expr(fcx, an_init.expr);
587-
for p: @pat in bindings {
586+
for each p: @pat in pat_bindings(alocal.node.pat) {
588587
copy_pre_post(fcx.ccx, p.id, an_init.expr);
589588
}
590589
/* Inherit ann from initializer, and add var being
591590
initialized to the postcondition */
592591
copy_pre_post(fcx.ccx, id, an_init.expr);
593592

593+
let p = none;
594594
alt an_init.expr.node {
595-
expr_path(p) {
596-
for pat: @pat in bindings {
597-
let ident = alt pat.node { pat_bind(n) { n } };
595+
expr_path(_p) { p = some(_p); }
596+
_ { }
597+
}
598+
599+
for each pat: @pat in pat_bindings(alocal.node.pat) {
600+
let ident = alt pat.node { pat_bind(n) { n } };
601+
alt p {
602+
some(p) {
598603
copy_in_postcond(fcx, id,
599604
{ident: ident, node: pat.id},
600605
{ident:
601606
path_to_ident(fcx.ccx.tcx, p),
602607
node: an_init.expr.id},
603608
op_to_oper_ty(an_init.op));
609+
}
610+
none. {}
604611
}
605-
}
606-
_ { }
607-
}
608-
609-
for p: @pat in bindings {
610-
let ident = alt p.node { pat_bind(name) { name } };
611-
gen(fcx, id, ninit(p.id, ident));
612+
gen(fcx, id, ninit(pat.id, ident));
612613
}
613614

614615
if an_init.op == init_move && is_path(an_init.expr) {
615616
forget_in_postcond(fcx, id, an_init.expr.id);
616617
}
617618
}
618619
none. {
619-
for p: @pat in bindings {
620+
for each p: @pat in pat_bindings(alocal.node.pat) {
620621
clear_pp(node_id_to_ts_ann(fcx.ccx, p.id).conditions);
621622
}
622623
clear_pp(node_id_to_ts_ann(fcx.ccx, id).conditions);

src/comp/middle/tstate/states.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ fn find_pre_post_state_loop(fcx: &fn_ctxt, pres: prestate, l: &@local,
195195
// Make sure the index vars are considered initialized
196196
// in the body
197197
let index_post = tritv_clone(expr_poststate(fcx.ccx, index));
198-
for p: @pat in pat_bindings(l.node.pat) {
198+
for each p: @pat in pat_bindings(l.node.pat) {
199199
let ident = alt p.node { pat_bind(name) { name } };
200200
set_in_poststate_ident(fcx, p.id, ident, index_post);
201201
}

src/comp/syntax/ast.rs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -154,23 +154,29 @@ fn pat_id_map(pat: &@pat) -> pat_id_map {
154154
ret map;
155155
}
156156

157-
// FIXME This wanted to be an iter, but bug #791 got in the way.
158-
fn pat_bindings(pat: &@pat) -> (@pat)[] {
159-
let found = ~[];
160-
fn recur(found: &mutable (@pat)[], pat: &@pat) {
161-
alt pat.node {
162-
pat_bind(_) { found += ~[pat]; }
163-
pat_tag(_, sub) {
164-
for p in sub { recur(found, p); }
165-
}
166-
pat_rec(fields, _) {
167-
for f: field_pat in fields { recur(found, f.pat); }
168-
}
169-
pat_box(sub) { recur(found, sub); }
170-
pat_wild. | pat_lit(_) {}
157+
iter pat_bindings(pat: &@pat) -> @pat {
158+
alt pat.node {
159+
pat_bind(_) { put pat; }
160+
pat_tag(_, sub) {
161+
for p in sub {
162+
for each b in pat_bindings(p) { put b; }
163+
}
164+
}
165+
pat_rec(fields, _) {
166+
for f in fields {
167+
for each b in pat_bindings(f.pat) { put b; }
171168
}
169+
}
170+
pat_box(sub) {
171+
for each b in pat_bindings(sub) { put b; }
172+
}
173+
pat_wild. | pat_lit(_) {}
172174
}
173-
recur(found, pat);
175+
}
176+
177+
fn pat_binding_ids(pat: &@pat) -> node_id[] {
178+
let found = ~[];
179+
for each b in pat_bindings(pat) { found += ~[b.id]; }
174180
ret found;
175181
}
176182

0 commit comments

Comments
 (0)