1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
use syntax;
use syntax::ast::*;
use syntax::visit::Visitor;
pub trait Visit {
fn visit<'ast, V: Visitor<'ast>>(&'ast self, v: &mut V);
}
impl Visit for Crate {
fn visit<'ast, V: Visitor<'ast>>(&'ast self, v: &mut V) {
syntax::visit::walk_crate(v, self);
}
}
macro_rules! gen_visit_impls {
(
pub trait Visitor<'ast>: Sized {
$(
fn $visit_fn:ident (&mut self, $arg:ident : &'ast $ArgTy:ty) { ... }
)*
}
) => {
$(
impl Visit for $ArgTy {
fn visit<'ast, V: Visitor<'ast>>(&'ast self, v: &mut V) {
v.$visit_fn(self)
}
}
)*
};
}
gen_visit_impls! {
pub trait Visitor<'ast>: Sized {
fn visit_foreign_item(&mut self, i: &'ast ForeignItem) { ... }
fn visit_global_asm(&mut self, ga: &'ast GlobalAsm) { ... }
fn visit_item(&mut self, i: &'ast Item) { ... }
fn visit_local(&mut self, l: &'ast Local) { ... }
fn visit_block(&mut self, b: &'ast Block) { ... }
fn visit_stmt(&mut self, s: &'ast Stmt) { ... }
fn visit_arm(&mut self, a: &'ast Arm) { ... }
fn visit_pat(&mut self, p: &'ast Pat) { ... }
fn visit_anon_const(&mut self, c: &'ast AnonConst) { ... }
fn visit_expr(&mut self, ex: &'ast Expr) { ... }
fn visit_ty(&mut self, t: &'ast Ty) { ... }
fn visit_generic_param(&mut self, param: &'ast GenericParam) { ... }
fn visit_generics(&mut self, g: &'ast Generics) { ... }
fn visit_where_predicate(&mut self, p: &'ast WherePredicate) { ... }
fn visit_trait_item(&mut self, ti: &'ast TraitItem) { ... }
fn visit_impl_item(&mut self, ii: &'ast ImplItem) { ... }
fn visit_trait_ref(&mut self, t: &'ast TraitRef) { ... }
fn visit_param_bound(&mut self, bounds: &'ast GenericBound) { ... }
fn visit_struct_field(&mut self, s: &'ast StructField) { ... }
fn visit_label(&mut self, label: &'ast Label) { ... }
fn visit_lifetime(&mut self, lifetime: &'ast Lifetime) { ... }
fn visit_mac(&mut self, mac: &'ast Mac) { ... }
fn visit_generic_arg(&mut self, generic_arg: &'ast GenericArg) { ... }
fn visit_assoc_type_binding(&mut self, type_binding: &'ast TypeBinding) { ... }
fn visit_attribute(&mut self, _attr: &'ast Attribute) { ... }
fn visit_vis(&mut self, vis: &'ast Visibility) { ... }
fn visit_fn_ret_ty(&mut self, ret_ty: &'ast FunctionRetTy) { ... }
}
}