Add ident as an argument to visit_fn (typestate wants it)
This commit is contained in:
parent
ef5473deb1
commit
2cd769e358
3 changed files with 24 additions and 28 deletions
|
|
@ -73,8 +73,6 @@ import front::ast::block;
|
|||
import front::ast::block_;
|
||||
import front::ast::method;
|
||||
|
||||
import middle::fold;
|
||||
import middle::fold::respan;
|
||||
import middle::ty::expr_ann;
|
||||
|
||||
import util::common::uistr;
|
||||
|
|
@ -129,14 +127,14 @@ fn collect_ids_decl(&@decl d, @vec[uint] res) -> () {
|
|||
}
|
||||
}
|
||||
|
||||
fn node_ids_in_fn(&_fn f, &def_id d, @vec[uint] res) -> () {
|
||||
fn node_ids_in_fn(&_fn f, &ident i, &def_id d, @vec[uint] res) -> () {
|
||||
auto collect_ids = walk::default_visitor();
|
||||
collect_ids = rec(visit_expr_pre = bind collect_ids_expr(_,res),
|
||||
visit_block_pre = bind collect_ids_block(_,res),
|
||||
visit_stmt_pre = bind collect_ids_stmt(_,res),
|
||||
visit_decl_pre = bind collect_ids_decl(_,res)
|
||||
with collect_ids);
|
||||
walk::walk_fn(collect_ids, f, d);
|
||||
walk::walk_fn(collect_ids, f, i, d);
|
||||
}
|
||||
|
||||
fn init_vecs(&crate_ctxt ccx, @vec[uint] node_ids, uint len) -> () {
|
||||
|
|
@ -146,22 +144,22 @@ fn init_vecs(&crate_ctxt ccx, @vec[uint] node_ids, uint len) -> () {
|
|||
}
|
||||
}
|
||||
|
||||
fn visit_fn(&crate_ctxt ccx, uint num_locals, &_fn f, &def_id d) -> () {
|
||||
|
||||
fn visit_fn(&crate_ctxt ccx, uint num_locals, &_fn f, &ident i,
|
||||
&def_id d) -> () {
|
||||
let vec[uint] node_ids_ = [];
|
||||
let @vec[uint] node_ids = @node_ids_;
|
||||
node_ids_in_fn(f, d, node_ids);
|
||||
node_ids_in_fn(f, i, d, node_ids);
|
||||
init_vecs(ccx, node_ids, num_locals);
|
||||
}
|
||||
|
||||
fn annotate_in_fn(&crate_ctxt ccx, &_fn f, &def_id f_id) -> () {
|
||||
fn annotate_in_fn(&crate_ctxt ccx, &_fn f, &ident i, &def_id f_id) -> () {
|
||||
auto f_info = get_fn_info(ccx, f_id);
|
||||
visit_fn(ccx, num_locals(f_info), f, f_id);
|
||||
visit_fn(ccx, num_locals(f_info), f, i, f_id);
|
||||
}
|
||||
|
||||
fn annotate_crate(&crate_ctxt ccx, &crate crate) -> () {
|
||||
auto do_ann = walk::default_visitor();
|
||||
do_ann = rec(visit_fn_pre = bind annotate_in_fn(ccx, _, _)
|
||||
do_ann = rec(visit_fn_pre = bind annotate_in_fn(ccx, _, _, _)
|
||||
with do_ann);
|
||||
walk::walk_crate(do_ann, crate);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,8 +20,6 @@ import front::ast::decl_local;
|
|||
import front::ast::def_id;
|
||||
import front::ast::ident;
|
||||
|
||||
import middle::fold::span;
|
||||
import middle::fold::respan;
|
||||
import middle::walk::walk_crate;
|
||||
import middle::walk::walk_fn;
|
||||
import middle::walk::ast_visitor;
|
||||
|
|
@ -47,13 +45,11 @@ fn collect_local(&@vec[tup(ident, def_id)] vars, &@decl d) -> () {
|
|||
}
|
||||
}
|
||||
|
||||
fn find_locals(_fn f, def_id d) -> @vec[tup(ident,def_id)] {
|
||||
fn find_locals(&_fn f, &ident i, &def_id d) -> @vec[tup(ident,def_id)] {
|
||||
auto res = @vec::alloc[tup(ident,def_id)](0u);
|
||||
|
||||
auto visitor = walk::default_visitor();
|
||||
visitor = rec(visit_decl_pre=bind collect_local(res,_) with visitor);
|
||||
walk_fn(visitor, f, d);
|
||||
|
||||
walk_fn(visitor, f, i, d);
|
||||
ret res;
|
||||
}
|
||||
|
||||
|
|
@ -66,7 +62,7 @@ fn add_var(def_id v, ident nm, uint next, fn_info tbl) -> uint {
|
|||
|
||||
/* builds a table mapping each local var defined in f
|
||||
to a bit number in the precondition/postcondition vectors */
|
||||
fn mk_fn_info(_fn f, def_id f_id, ident f_name) -> fn_info {
|
||||
fn mk_fn_info(&_fn f, &def_id f_id, &ident f_name) -> fn_info {
|
||||
auto res = rec(vars=@new_def_hash[var_info](),
|
||||
cf=f.decl.cf);
|
||||
let uint next = 0u;
|
||||
|
|
@ -75,7 +71,7 @@ fn mk_fn_info(_fn f, def_id f_id, ident f_name) -> fn_info {
|
|||
/* ignore args, which we know are initialized;
|
||||
just collect locally declared vars */
|
||||
|
||||
let @vec[tup(ident,def_id)] locals = find_locals(f, f_id);
|
||||
let @vec[tup(ident,def_id)] locals = find_locals(f, f_name, f_id);
|
||||
// log (uistr(vec::len[tup(ident, def_id)](locals)) + " locals");
|
||||
for (tup(ident,def_id) p in *locals) {
|
||||
next = add_var(p._1, p._0, next, res);
|
||||
|
|
@ -90,6 +86,8 @@ fn mk_fn_info(_fn f, def_id f_id, ident f_name) -> fn_info {
|
|||
ret res;
|
||||
}
|
||||
|
||||
/* FIXME: can do this with just one case -- for fn -- now */
|
||||
|
||||
/* extends mk_fn_info to an item, side-effecting the map fi from
|
||||
function IDs to fn_info maps
|
||||
only looks at function and object items. */
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ type ast_visitor =
|
|||
fn (&@ast::expr e) visit_expr_post,
|
||||
fn (&@ast::ty t) visit_ty_pre,
|
||||
fn (&@ast::ty t) visit_ty_post,
|
||||
fn (&ast::_fn f, &ast::def_id d_id) visit_fn_pre,
|
||||
fn (&ast::_fn f, &ast::def_id d_id) visit_fn_post);
|
||||
fn (&ast::_fn f, &ast::ident name, &ast::def_id d_id) visit_fn_pre,
|
||||
fn (&ast::_fn f, &ast::ident name, &ast::def_id d_id) visit_fn_post);
|
||||
|
||||
fn walk_crate(&ast_visitor v, &ast::crate c) {
|
||||
if (!v.keep_going()) { ret; }
|
||||
|
|
@ -93,8 +93,8 @@ fn walk_item(&ast_visitor v, @ast::item i) {
|
|||
walk_ty(v, t);
|
||||
walk_expr(v, e);
|
||||
}
|
||||
case (ast::item_fn(_, ?f, _, ?d, _)) {
|
||||
walk_fn(v, f, d);
|
||||
case (ast::item_fn(?i, ?f, _, ?d, _)) {
|
||||
walk_fn(v, f, i, d);
|
||||
}
|
||||
case (ast::item_mod(_, ?m, _)) {
|
||||
walk_mod(v, m);
|
||||
|
|
@ -118,13 +118,13 @@ fn walk_item(&ast_visitor v, @ast::item i) {
|
|||
}
|
||||
for (@ast::method m in ob.methods) {
|
||||
v.visit_method_pre(m);
|
||||
walk_fn(v, m.node.meth, m.node.id);
|
||||
walk_fn(v, m.node.meth, m.node.ident, m.node.id);
|
||||
v.visit_method_post(m);
|
||||
}
|
||||
alt (ob.dtor) {
|
||||
case (none[@ast::method]) {}
|
||||
case (some[@ast::method](?m)) {
|
||||
walk_fn(v, m.node.meth, m.node.id);
|
||||
walk_fn(v, m.node.meth, m.node.ident, m.node.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -229,12 +229,12 @@ fn walk_fn_decl(&ast_visitor v, &ast::fn_decl fd) {
|
|||
walk_ty(v, fd.output);
|
||||
}
|
||||
|
||||
fn walk_fn(&ast_visitor v, &ast::_fn f, &ast::def_id d) {
|
||||
fn walk_fn(&ast_visitor v, &ast::_fn f, &ast::ident i, &ast::def_id d) {
|
||||
if (!v.keep_going()) { ret; }
|
||||
v.visit_fn_pre(f, d);
|
||||
v.visit_fn_pre(f, i, d);
|
||||
walk_fn_decl(v, f.decl);
|
||||
walk_block(v, f.body);
|
||||
v.visit_fn_post(f, d);
|
||||
v.visit_fn_post(f, i, d);
|
||||
}
|
||||
|
||||
fn walk_block(&ast_visitor v, &ast::block b) {
|
||||
|
|
@ -459,7 +459,7 @@ fn def_visit_arm(&ast::arm a) { }
|
|||
fn def_visit_decl(&@ast::decl d) { }
|
||||
fn def_visit_expr(&@ast::expr e) { }
|
||||
fn def_visit_ty(&@ast::ty t) { }
|
||||
fn def_visit_fn(&ast::_fn f, &ast::def_id d) { }
|
||||
fn def_visit_fn(&ast::_fn f, &ast::ident i, &ast::def_id d) { }
|
||||
|
||||
fn default_visitor() -> ast_visitor {
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue