Skip to content

Commit b7cf571

Browse files
committed
---
yaml --- r: 15838 b: refs/heads/try c: 69eca26 h: refs/heads/master v: v3
1 parent f10711f commit b7cf571

File tree

3 files changed

+1092
-1
lines changed

3 files changed

+1092
-1
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
refs/heads/master: 61b1875c16de39c166b0f4d54bba19f9c6777d1a
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
5-
refs/heads/try: 21fc3af0315202718a16acee35b56710407e3a05
5+
refs/heads/try: 69eca2677552e22c77905ac0fb5ff55fb1742176
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/try/src/librustsyntax/ast_util.rs

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,157 @@ fn dtor_dec() -> fn_decl {
370370
output: nil_t, purity: impure_fn, cf: return_val, constraints: []}
371371
}
372372

373+
// ______________________________________________________________________
374+
// Enumerating the IDs which appear in an AST
375+
376+
#[auto_serialize]
377+
type id_range = {min: node_id, max: node_id};
378+
379+
fn empty(range: id_range) -> bool {
380+
range.min >= range.max
381+
}
382+
383+
fn id_visitor(vfn: fn@(node_id)) -> visit::vt<()> {
384+
visit::mk_simple_visitor(@{
385+
visit_mod: fn@(_m: _mod, _sp: span, id: node_id) {
386+
vfn(id)
387+
},
388+
389+
visit_view_item: fn@(vi: @view_item) {
390+
alt vi.node {
391+
view_item_use(_, _, id) { vfn(id) }
392+
view_item_import(vps) | view_item_export(vps) {
393+
vec::iter(vps) {|vp|
394+
alt vp.node {
395+
view_path_simple(_, _, id) { vfn(id) }
396+
view_path_glob(_, id) { vfn(id) }
397+
view_path_list(_, _, id) { vfn(id) }
398+
}
399+
}
400+
}
401+
}
402+
},
403+
404+
visit_native_item: fn@(ni: @native_item) {
405+
vfn(ni.id)
406+
},
407+
408+
visit_item: fn@(i: @item) {
409+
vfn(i.id);
410+
alt i.node {
411+
item_res(_, _, _, d_id, c_id, _) { vfn(d_id); vfn(c_id); }
412+
item_enum(vs, _, _) { for vs.each {|v| vfn(v.node.id); } }
413+
_ {}
414+
}
415+
},
416+
417+
visit_local: fn@(l: @local) {
418+
vfn(l.node.id);
419+
},
420+
421+
visit_block: fn@(b: blk) {
422+
vfn(b.node.id);
423+
},
424+
425+
visit_stmt: fn@(s: @stmt) {
426+
vfn(ast_util::stmt_id(*s));
427+
},
428+
429+
visit_arm: fn@(_a: arm) { },
430+
431+
visit_pat: fn@(p: @pat) {
432+
vfn(p.id)
433+
},
434+
435+
visit_decl: fn@(_d: @decl) {
436+
},
437+
438+
visit_expr: fn@(e: @expr) {
439+
vfn(e.id);
440+
alt e.node {
441+
expr_unary(_, _) | expr_binary(_, _, _) {
442+
vfn(ast_util::op_expr_callee_id(e));
443+
}
444+
_ { /* fallthrough */ }
445+
}
446+
},
447+
448+
visit_ty: fn@(t: @ty) {
449+
alt t.node {
450+
ty_path(_, id) {
451+
vfn(id)
452+
}
453+
_ { /* fall through */ }
454+
}
455+
},
456+
457+
visit_ty_params: fn@(ps: [ty_param]) {
458+
vec::iter(ps) {|p| vfn(p.id) }
459+
},
460+
461+
visit_constr: fn@(_p: @path, _sp: span, id: node_id) {
462+
vfn(id);
463+
},
464+
465+
visit_fn: fn@(fk: visit::fn_kind, d: fn_decl,
466+
_b: blk, _sp: span, id: node_id) {
467+
vfn(id);
468+
469+
alt fk {
470+
visit::fk_ctor(_, tps, self_id, parent_id) |
471+
visit::fk_dtor(tps, self_id, parent_id) {
472+
vec::iter(tps) {|tp| vfn(tp.id)}
473+
vfn(id);
474+
vfn(self_id);
475+
vfn(parent_id.node);
476+
}
477+
visit::fk_item_fn(_, tps) |
478+
visit::fk_res(_, tps, _) {
479+
vec::iter(tps) {|tp| vfn(tp.id)}
480+
}
481+
visit::fk_method(_, tps, m) {
482+
vfn(m.self_id);
483+
vec::iter(tps) {|tp| vfn(tp.id)}
484+
}
485+
visit::fk_anon(*) | visit::fk_fn_block(*) {
486+
}
487+
}
488+
489+
vec::iter(d.inputs) {|arg|
490+
vfn(arg.id)
491+
}
492+
},
493+
494+
visit_class_item: fn@(c: @class_member) {
495+
alt c.node {
496+
instance_var(_, _, _, id,_) {
497+
vfn(id)
498+
}
499+
class_method(_) {
500+
}
501+
}
502+
}
503+
})
504+
}
505+
506+
fn visit_ids_for_inlined_item(item: inlined_item, vfn: fn@(node_id)) {
507+
item.accept((), id_visitor(vfn));
508+
}
509+
510+
fn compute_id_range(visit_ids_fn: fn(fn@(node_id))) -> id_range {
511+
let min = @mut int::max_value;
512+
let max = @mut int::min_value;
513+
visit_ids_fn { |id|
514+
*min = int::min(*min, id);
515+
*max = int::max(*max, id + 1);
516+
}
517+
ret {min:*min, max:*max};
518+
}
519+
520+
fn compute_id_range_for_inlined_item(item: inlined_item) -> id_range {
521+
compute_id_range { |f| visit_ids_for_inlined_item(item, f) }
522+
}
523+
373524
// Local Variables:
374525
// mode: rust
375526
// fill-column: 78;

0 commit comments

Comments
 (0)