Add visit_fn_pre and visit_fn_post fields to visitors

Added visit_fn_pre and visit_fn_post fields that get applied to
both regular functions and methods.
This commit is contained in:
Tim Chevalier 2011-05-18 15:38:54 -07:00 committed by Graydon Hoare
parent ea1701de8c
commit dc83c84662

View file

@ -31,7 +31,9 @@ type ast_visitor =
fn (&@ast::expr e) visit_expr_pre,
fn (&@ast::expr e) visit_expr_post,
fn (&@ast::ty t) visit_ty_pre,
fn (&@ast::ty t) visit_ty_post);
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 walk_crate(&ast_visitor v, &ast::crate c) {
if (!v.keep_going()) { ret; }
@ -91,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, _, _, _)) {
walk_fn(v, f);
case (ast::item_fn(_, ?f, _, ?d, _)) {
walk_fn(v, f, d);
}
case (ast::item_mod(_, ?m, _)) {
walk_mod(v, m);
@ -116,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);
walk_fn(v, m.node.meth, 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);
walk_fn(v, m.node.meth, m.node.id);
}
}
}
@ -227,10 +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) {
fn walk_fn(&ast_visitor v, &ast::_fn f, &ast::def_id d) {
if (!v.keep_going()) { ret; }
v.visit_fn_pre(f, d);
walk_fn_decl(v, f.decl);
walk_block(v, f.body);
v.visit_fn_post(f, d);
}
fn walk_block(&ast_visitor v, &ast::block b) {
@ -455,6 +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 default_visitor() -> ast_visitor {
@ -472,6 +477,7 @@ fn default_visitor() -> ast_visitor {
auto d_visit_decl = def_visit_decl;
auto d_visit_expr = def_visit_expr;
auto d_visit_ty = def_visit_ty;
auto d_visit_fn = def_visit_fn;
ret rec(keep_going = d_keep_going,
want_crate_directives = d_want_crate_directives,
@ -498,7 +504,9 @@ fn default_visitor() -> ast_visitor {
visit_expr_pre = d_visit_expr,
visit_expr_post = d_visit_expr,
visit_ty_pre = d_visit_ty,
visit_ty_post = d_visit_ty);
visit_ty_post = d_visit_ty,
visit_fn_pre = d_visit_fn,
visit_fn_post = d_visit_fn);
}
//