From dc83c846623c2d9c0ad31ebe769def34d8f1579f Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Wed, 18 May 2011 15:38:54 -0700 Subject: [PATCH] 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. --- src/comp/middle/walk.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/comp/middle/walk.rs b/src/comp/middle/walk.rs index 972356c628e8..27e354273682 100644 --- a/src/comp/middle/walk.rs +++ b/src/comp/middle/walk.rs @@ -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); } //