Skip to content

Commit 3d83010

Browse files
committed
Switch to new <V:Visitor> visitor (rather than @visitor).
Alpha-renamed top-level visit_* functions to walk_*. (Motivation: Distinguish visit action and recursive traversal.) Abstract over `&mut self` rather than over `@mut self`. This required some acrobatics, notably the `impl<E> Visitor<E> for @mut Visitor<E>` and corresponding introduction of `@mut Visitor` and some local `let mut` bindings. Remove oldvisit reference. Added default implementations for all of the Visitor trait methods. Note that both `visit_expr_post` and `visit_ty` are no-op's by default, just like they are in `oldvisit::default_visitor`. Refactoring: extract logic to ease swapping visit for oldvisit (hopefully).
1 parent 9b92500 commit 3d83010

File tree

5 files changed

+370
-297
lines changed

5 files changed

+370
-297
lines changed

src/librustc/middle/lint.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ impl Context {
480480
(orig.visit_item)(it, (self, stopping));
481481
}
482482
NewVisitor(new_visitor) => {
483+
let mut new_visitor = new_visitor;
483484
new_visitor.visit_item(it, ());
484485
}
485486
}
@@ -492,7 +493,8 @@ impl Context {
492493
oldvisit::visit_crate(c, (self, stopping))
493494
}
494495
NewVisitor(new_visitor) => {
495-
visit::visit_crate(new_visitor, c, ())
496+
let mut new_visitor = new_visitor;
497+
visit::walk_crate(&mut new_visitor, c, ())
496498
}
497499
}
498500
}
@@ -518,6 +520,7 @@ impl Context {
518520
let fk = visit::fk_method(m.ident,
519521
&m.generics,
520522
m);
523+
let mut new_visitor = new_visitor;
521524
new_visitor.visit_fn(&fk,
522525
&m.decl,
523526
&m.body,

src/libsyntax/ast_map.rs

+52-51
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,11 @@ pub struct Ctx {
8989
}
9090

9191
impl Ctx {
92-
fn extend(@mut self, elt: ident) -> @path {
92+
fn extend(&self, elt: ident) -> @path {
9393
@vec::append(self.path.clone(), [path_name(elt)])
9494
}
9595

96-
fn map_method(@mut self,
96+
fn map_method(&mut self,
9797
impl_did: def_id,
9898
impl_path: @path,
9999
m: @method,
@@ -107,7 +107,7 @@ impl Ctx {
107107
self.map.insert(m.self_id, node_local(special_idents::self_));
108108
}
109109

110-
fn map_struct_def(@mut self,
110+
fn map_struct_def(&mut self,
111111
struct_def: @ast::struct_def,
112112
parent_node: ast_node,
113113
ident: ast::ident) {
@@ -130,7 +130,7 @@ impl Ctx {
130130
}
131131
}
132132

133-
fn map_expr(@mut self, ex: @expr) {
133+
fn map_expr(&mut self, ex: @expr) {
134134
self.map.insert(ex.id, node_expr(ex));
135135

136136
// Expressions which are or might be calls:
@@ -141,10 +141,10 @@ impl Ctx {
141141
}
142142
}
143143

144-
visit::visit_expr(self as @mut Visitor<()>, ex, ());
144+
visit::walk_expr(self, ex, ());
145145
}
146146

147-
fn map_fn(@mut self,
147+
fn map_fn(&mut self,
148148
fk: &visit::fn_kind,
149149
decl: &fn_decl,
150150
body: &Block,
@@ -153,21 +153,21 @@ impl Ctx {
153153
for a in decl.inputs.iter() {
154154
self.map.insert(a.id, node_arg);
155155
}
156-
visit::visit_fn(self as @mut Visitor<()>, fk, decl, body, sp, id, ());
156+
visit::walk_fn(self, fk, decl, body, sp, id, ());
157157
}
158158

159-
fn map_stmt(@mut self, stmt: @stmt) {
159+
fn map_stmt(&mut self, stmt: @stmt) {
160160
self.map.insert(stmt_id(stmt), node_stmt(stmt));
161-
visit::visit_stmt(self as @mut Visitor<()>, stmt, ());
161+
visit::walk_stmt(self, stmt, ());
162162
}
163163

164-
fn map_block(@mut self, b: &Block) {
164+
fn map_block(&mut self, b: &Block) {
165165
// clone is FIXME #2543
166166
self.map.insert(b.id, node_block((*b).clone()));
167-
visit::visit_block(self as @mut Visitor<()>, b, ());
167+
visit::walk_block(self, b, ());
168168
}
169169

170-
fn map_pat(@mut self, pat: @pat) {
170+
fn map_pat(&mut self, pat: @pat) {
171171
match pat.node {
172172
pat_ident(_, ref path, _) => {
173173
// Note: this is at least *potentially* a pattern...
@@ -177,20 +177,21 @@ impl Ctx {
177177
_ => ()
178178
}
179179

180-
visit::visit_pat(self as @mut Visitor<()>, pat, ());
180+
visit::walk_pat(self, pat, ());
181181
}
182182
}
183183

184184
impl Visitor<()> for Ctx {
185-
fn visit_item(@mut self, i: @item, _: ()) {
185+
fn visit_item(&mut self, i: @item, _: ()) {
186186
// clone is FIXME #2543
187187
let item_path = @self.path.clone();
188188
self.map.insert(i.id, node_item(i, item_path));
189189
match i.node {
190190
item_impl(_, _, _, ref ms) => {
191191
let impl_did = ast_util::local_def(i.id);
192192
for m in ms.iter() {
193-
self.map_method(impl_did, self.extend(i.ident), *m, false)
193+
let extended = { self.extend(i.ident) };
194+
self.map_method(impl_did, extended, *m, false)
194195
}
195196
}
196197
item_enum(ref enum_definition, _) => {
@@ -254,24 +255,24 @@ impl Visitor<()> for Ctx {
254255
}
255256
_ => self.path.push(path_name(i.ident))
256257
}
257-
visit::visit_item(self as @mut Visitor<()>, i, ());
258+
visit::walk_item(self, i, ());
258259
self.path.pop();
259260
}
260261

261-
fn visit_pat(@mut self, pat: @pat, _: ()) {
262+
fn visit_pat(&mut self, pat: @pat, _: ()) {
262263
self.map_pat(pat);
263-
visit::visit_pat(self as @mut Visitor<()>, pat, ())
264+
visit::walk_pat(self, pat, ())
264265
}
265266

266-
fn visit_expr(@mut self, expr: @expr, _: ()) {
267+
fn visit_expr(&mut self, expr: @expr, _: ()) {
267268
self.map_expr(expr)
268269
}
269270

270-
fn visit_stmt(@mut self, stmt: @stmt, _: ()) {
271+
fn visit_stmt(&mut self, stmt: @stmt, _: ()) {
271272
self.map_stmt(stmt)
272273
}
273274

274-
fn visit_fn(@mut self,
275+
fn visit_fn(&mut self,
275276
function_kind: &fn_kind,
276277
function_declaration: &fn_decl,
277278
block: &Block,
@@ -281,56 +282,56 @@ impl Visitor<()> for Ctx {
281282
self.map_fn(function_kind, function_declaration, block, span, node_id)
282283
}
283284

284-
fn visit_block(@mut self, block: &Block, _: ()) {
285+
fn visit_block(&mut self, block: &Block, _: ()) {
285286
self.map_block(block)
286287
}
287288

288289
// XXX: Methods below can become default methods.
289290

290-
fn visit_mod(@mut self, module: &_mod, _: span, _: NodeId, _: ()) {
291-
visit::visit_mod(self as @mut Visitor<()>, module, ())
291+
fn visit_mod(&mut self, module: &_mod, _: span, _: NodeId, _: ()) {
292+
visit::walk_mod(self, module, ())
292293
}
293294

294-
fn visit_view_item(@mut self, view_item: &view_item, _: ()) {
295-
visit::visit_view_item(self as @mut Visitor<()>, view_item, ())
295+
fn visit_view_item(&mut self, view_item: &view_item, _: ()) {
296+
visit::walk_view_item(self, view_item, ())
296297
}
297298

298-
fn visit_foreign_item(@mut self, foreign_item: @foreign_item, _: ()) {
299-
visit::visit_foreign_item(self as @mut Visitor<()>, foreign_item, ())
299+
fn visit_foreign_item(&mut self, foreign_item: @foreign_item, _: ()) {
300+
visit::walk_foreign_item(self, foreign_item, ())
300301
}
301302

302-
fn visit_local(@mut self, local: @Local, _: ()) {
303-
visit::visit_local(self as @mut Visitor<()>, local, ())
303+
fn visit_local(&mut self, local: @Local, _: ()) {
304+
visit::walk_local(self, local, ())
304305
}
305306

306-
fn visit_arm(@mut self, arm: &arm, _: ()) {
307-
visit::visit_arm(self as @mut Visitor<()>, arm, ())
307+
fn visit_arm(&mut self, arm: &arm, _: ()) {
308+
visit::walk_arm(self, arm, ())
308309
}
309310

310-
fn visit_decl(@mut self, decl: @decl, _: ()) {
311-
visit::visit_decl(self as @mut Visitor<()>, decl, ())
311+
fn visit_decl(&mut self, decl: @decl, _: ()) {
312+
visit::walk_decl(self, decl, ())
312313
}
313314

314-
fn visit_expr_post(@mut self, _: @expr, _: ()) {
315+
fn visit_expr_post(&mut self, _: @expr, _: ()) {
315316
// Empty!
316317
}
317318

318-
fn visit_ty(@mut self, typ: &Ty, _: ()) {
319-
visit::visit_ty(self as @mut Visitor<()>, typ, ())
319+
fn visit_ty(&mut self, typ: &Ty, _: ()) {
320+
visit::walk_ty(self, typ, ())
320321
}
321322

322-
fn visit_generics(@mut self, generics: &Generics, _: ()) {
323-
visit::visit_generics(self as @mut Visitor<()>, generics, ())
323+
fn visit_generics(&mut self, generics: &Generics, _: ()) {
324+
visit::walk_generics(self, generics, ())
324325
}
325326

326-
fn visit_fn(@mut self,
327+
fn visit_fn(&mut self,
327328
function_kind: &fn_kind,
328329
function_declaration: &fn_decl,
329330
block: &Block,
330331
span: span,
331332
node_id: NodeId,
332333
_: ()) {
333-
visit::visit_fn(self as @mut Visitor<()>,
334+
visit::walk_fn(self,
334335
function_kind,
335336
function_declaration,
336337
block,
@@ -339,30 +340,30 @@ impl Visitor<()> for Ctx {
339340
())
340341
}
341342

342-
fn visit_ty_method(@mut self, ty_method: &TypeMethod, _: ()) {
343-
visit::visit_ty_method(self as @mut Visitor<()>, ty_method, ())
343+
fn visit_ty_method(&mut self, ty_method: &TypeMethod, _: ()) {
344+
visit::walk_ty_method(self, ty_method, ())
344345
}
345346

346-
fn visit_trait_method(@mut self, trait_method: &trait_method, _: ()) {
347-
visit::visit_trait_method(self as @mut Visitor<()>, trait_method, ())
347+
fn visit_trait_method(&mut self, trait_method: &trait_method, _: ()) {
348+
visit::walk_trait_method(self, trait_method, ())
348349
}
349350

350-
fn visit_struct_def(@mut self,
351+
fn visit_struct_def(&mut self,
351352
struct_def: @struct_def,
352353
ident: ident,
353354
generics: &Generics,
354355
node_id: NodeId,
355356
_: ()) {
356-
visit::visit_struct_def(self as @mut Visitor<()>,
357+
visit::walk_struct_def(self,
357358
struct_def,
358359
ident,
359360
generics,
360361
node_id,
361362
())
362363
}
363364

364-
fn visit_struct_field(@mut self, struct_field: @struct_field, _: ()) {
365-
visit::visit_struct_field(self as @mut Visitor<()>, struct_field, ())
365+
fn visit_struct_field(&mut self, struct_field: @struct_field, _: ()) {
366+
visit::walk_struct_field(self, struct_field, ())
366367
}
367368
}
368369

@@ -372,7 +373,7 @@ pub fn map_crate(diag: @mut span_handler, c: &Crate) -> map {
372373
path: ~[],
373374
diag: diag,
374375
};
375-
visit::visit_crate(cx as @mut Visitor<()>, c, ());
376+
visit::walk_crate(cx, c, ());
376377
cx.map
377378
}
378379

@@ -409,7 +410,7 @@ pub fn map_decoded_item(diag: @mut span_handler,
409410
}
410411

411412
// visit the item / method contents and add those to the map:
412-
ii.accept((), cx as @mut Visitor<()>);
413+
ii.accept((), cx);
413414
}
414415

415416
pub fn node_id_to_str(map: map, id: NodeId, itr: @ident_interner) -> ~str {

0 commit comments

Comments
 (0)