1use rustc_ast::visit::BoundKind;
6use rustc_ast::{self as ast, AttrVec, NodeId, visit as ast_visit};
7use rustc_data_structures::fx::{FxHashMap, FxHashSet};
8use rustc_data_structures::thousands::usize_with_underscores;
9use rustc_hir::{self as hir, AmbigArg, HirId, intravisit as hir_visit};
10use rustc_middle::ty::TyCtxt;
11use rustc_span::Span;
12use rustc_span::def_id::LocalDefId;
13
14struct NodeStats {
15 count: usize,
16 size: usize,
17}
18
19impl NodeStats {
20 fn new() -> NodeStats {
21 NodeStats { count: 0, size: 0 }
22 }
23
24 fn accum_size(&self) -> usize {
25 self.count * self.size
26 }
27}
28
29struct Node {
30 stats: NodeStats,
31 subnodes: FxHashMap<&'static str, NodeStats>,
32}
33
34impl Node {
35 fn new() -> Node {
36 Node { stats: NodeStats::new(), subnodes: FxHashMap::default() }
37 }
38}
39
40struct StatCollector<'k> {
58 tcx: Option<TyCtxt<'k>>,
59 nodes: FxHashMap<&'static str, Node>,
60 seen: FxHashSet<HirId>,
61}
62
63pub fn print_hir_stats(tcx: TyCtxt<'_>) {
64 let mut collector =
65 StatCollector { tcx: Some(tcx), nodes: FxHashMap::default(), seen: FxHashSet::default() };
66 tcx.hir_walk_toplevel_module(&mut collector);
67 tcx.hir_walk_attributes(&mut collector);
68 collector.print(tcx, "HIR STATS", "hir-stats");
69}
70
71pub fn print_ast_stats(tcx: TyCtxt<'_>, krate: &ast::Crate) {
72 use rustc_ast::visit::Visitor;
73
74 let mut collector =
75 StatCollector { tcx: None, nodes: FxHashMap::default(), seen: FxHashSet::default() };
76 collector.visit_crate(krate);
77 collector.print(tcx, "POST EXPANSION AST STATS", "ast-stats");
78}
79
80impl<'k> StatCollector<'k> {
81 fn record<T>(&mut self, label: &'static str, id: Option<HirId>, val: &T) {
83 self.record_inner(label, None, id, val);
84 }
85
86 fn record_variant<T>(
88 &mut self,
89 label1: &'static str,
90 label2: &'static str,
91 id: Option<HirId>,
92 val: &T,
93 ) {
94 self.record_inner(label1, Some(label2), id, val);
95 }
96
97 fn record_inner<T>(
98 &mut self,
99 label1: &'static str,
100 label2: Option<&'static str>,
101 id: Option<HirId>,
102 val: &T,
103 ) {
104 if id.is_some_and(|x| !self.seen.insert(x)) {
105 return;
106 }
107
108 let node = self.nodes.entry(label1).or_insert(Node::new());
109 node.stats.count += 1;
110 node.stats.size = size_of_val(val);
111
112 if let Some(label2) = label2 {
113 let subnode = node.subnodes.entry(label2).or_insert(NodeStats::new());
114 subnode.count += 1;
115 subnode.size = size_of_val(val);
116 }
117 }
118
119 fn print(&self, tcx: TyCtxt<'_>, title: &str, prefix: &str) {
120 use std::fmt::Write;
121
122 #[allow(rustc::potential_query_instability)]
124 let mut nodes: Vec<_> = self.nodes.iter().collect();
125 nodes.sort_by_cached_key(|(label, node)| (node.stats.accum_size(), label.to_owned()));
126 nodes.reverse(); let name_w = 18;
129 let acc_size1_w = 10;
130 let acc_size2_w = 8; let acc_size_w = acc_size1_w + acc_size2_w;
132 let count_w = 14;
133 let item_size_w = 14;
134 let banner_w = name_w + acc_size_w + count_w + item_size_w;
135
136 let total_size = nodes.iter().map(|(_, node)| node.stats.accum_size()).sum();
137 let total_count = nodes.iter().map(|(_, node)| node.stats.count).sum();
138
139 let mut s = String::new();
145 _ = s.write_fmt(format_args!("{1} {0}\n", "=".repeat(banner_w), prefix))writeln!(s, "{prefix} {}", "=".repeat(banner_w));
146 _ = s.write_fmt(format_args!("{1} {2}: {0}\n",
tcx.crate_name(hir::def_id::LOCAL_CRATE), prefix, title))writeln!(s, "{prefix} {title}: {}", tcx.crate_name(hir::def_id::LOCAL_CRATE));
147 _ = s.write_fmt(format_args!("{4} {0:<5$}{1:>6$}{2:>7$}{3:>8$}\n", "Name",
"Accumulated Size", "Count", "Item Size", prefix, name_w, acc_size_w,
count_w, item_size_w))writeln!(
148 s,
149 "{prefix} {:<name_w$}{:>acc_size_w$}{:>count_w$}{:>item_size_w$}",
150 "Name", "Accumulated Size", "Count", "Item Size"
151 );
152 _ = s.write_fmt(format_args!("{1} {0}\n", "-".repeat(banner_w), prefix))writeln!(s, "{prefix} {}", "-".repeat(banner_w));
153
154 let percent = |m, n| (m * 100) as f64 / n as f64;
155
156 for (label, node) in nodes {
157 let size = node.stats.accum_size();
158 _ = s.write_fmt(format_args!("{5} {0:<6$}{1:>7$} ({2:4.1}%){3:>8$}{4:>9$}\n",
label, usize_with_underscores(size), percent(size, total_size),
usize_with_underscores(node.stats.count),
usize_with_underscores(node.stats.size), prefix, name_w, acc_size1_w,
count_w, item_size_w))writeln!(
159 s,
160 "{prefix} {:<name_w$}{:>acc_size1_w$} ({:4.1}%){:>count_w$}{:>item_size_w$}",
161 label,
162 usize_with_underscores(size),
163 percent(size, total_size),
164 usize_with_underscores(node.stats.count),
165 usize_with_underscores(node.stats.size)
166 );
167 if !node.subnodes.is_empty() {
168 #[allow(rustc::potential_query_instability)]
170 let mut subnodes: Vec<_> = node.subnodes.iter().collect();
171 subnodes.sort_by_cached_key(|(label, subnode)| {
172 (subnode.accum_size(), label.to_owned())
173 });
174
175 for (label, subnode) in subnodes {
176 let size = subnode.accum_size();
177 _ = s.write_fmt(format_args!("{4} - {0:<5$}{1:>6$} ({2:4.1}%){3:>7$}\n", label,
usize_with_underscores(size), percent(size, total_size),
usize_with_underscores(subnode.count), prefix, name_w, acc_size1_w,
count_w))writeln!(
178 s,
179 "{prefix} - {:<name_w$}{:>acc_size1_w$} ({:4.1}%){:>count_w$}",
180 label,
181 usize_with_underscores(size),
182 percent(size, total_size),
183 usize_with_underscores(subnode.count),
184 );
185 }
186 }
187 }
188 _ = s.write_fmt(format_args!("{1} {0}\n", "-".repeat(banner_w), prefix))writeln!(s, "{prefix} {}", "-".repeat(banner_w));
189 _ = s.write_fmt(format_args!("{4} {0:<5$}{1:>6$}{2:>7$}{3:>8$}\n", "Total",
usize_with_underscores(total_size), "",
usize_with_underscores(total_count), prefix, name_w, acc_size1_w,
acc_size2_w, count_w))writeln!(
190 s,
191 "{prefix} {:<name_w$}{:>acc_size1_w$}{:>acc_size2_w$}{:>count_w$}",
192 "Total",
193 usize_with_underscores(total_size),
194 "",
195 usize_with_underscores(total_count),
196 );
197 _ = s.write_fmt(format_args!("{1} {0}\n", "=".repeat(banner_w), prefix))writeln!(s, "{prefix} {}", "=".repeat(banner_w));
198 { ::std::io::_eprint(format_args!("{0}", s)); };eprint!("{s}");
199 }
200}
201
202macro_rules! record_variants {
204 (
205 ($self:ident, $val:expr, $kind:expr, $id:expr, $mod:ident, $ty:ty, $tykind:ident),
206 [$($variant:ident),*]
207 ) => {
208 match $kind {
209 $(
210 $mod::$tykind::$variant { .. } => {
211 $self.record_variant(stringify!($ty), stringify!($variant), $id, $val)
212 }
213 )*
214 }
215 };
216}
217
218impl<'v> hir_visit::Visitor<'v> for StatCollector<'v> {
219 fn visit_param(&mut self, param: &'v hir::Param<'v>) {
220 self.record("Param", Some(param.hir_id), param);
221 hir_visit::walk_param(self, param)
222 }
223
224 fn visit_nested_item(&mut self, id: hir::ItemId) {
225 let nested_item = self.tcx.unwrap().hir_item(id);
226 self.visit_item(nested_item)
227 }
228
229 fn visit_nested_trait_item(&mut self, trait_item_id: hir::TraitItemId) {
230 let nested_trait_item = self.tcx.unwrap().hir_trait_item(trait_item_id);
231 self.visit_trait_item(nested_trait_item)
232 }
233
234 fn visit_nested_impl_item(&mut self, impl_item_id: hir::ImplItemId) {
235 let nested_impl_item = self.tcx.unwrap().hir_impl_item(impl_item_id);
236 self.visit_impl_item(nested_impl_item)
237 }
238
239 fn visit_nested_foreign_item(&mut self, id: hir::ForeignItemId) {
240 let nested_foreign_item = self.tcx.unwrap().hir_foreign_item(id);
241 self.visit_foreign_item(nested_foreign_item);
242 }
243
244 fn visit_nested_body(&mut self, body_id: hir::BodyId) {
245 let nested_body = self.tcx.unwrap().hir_body(body_id);
246 self.visit_body(nested_body)
247 }
248
249 fn visit_item(&mut self, i: &'v hir::Item<'v>) {
250 match i.kind {
hir::ItemKind::ExternCrate { .. } => {
self.record_variant("Item", "ExternCrate", Some(i.hir_id()), i)
}
hir::ItemKind::Use { .. } => {
self.record_variant("Item", "Use", Some(i.hir_id()), i)
}
hir::ItemKind::Static { .. } => {
self.record_variant("Item", "Static", Some(i.hir_id()), i)
}
hir::ItemKind::Const { .. } => {
self.record_variant("Item", "Const", Some(i.hir_id()), i)
}
hir::ItemKind::Fn { .. } => {
self.record_variant("Item", "Fn", Some(i.hir_id()), i)
}
hir::ItemKind::Macro { .. } => {
self.record_variant("Item", "Macro", Some(i.hir_id()), i)
}
hir::ItemKind::Mod { .. } => {
self.record_variant("Item", "Mod", Some(i.hir_id()), i)
}
hir::ItemKind::ForeignMod { .. } => {
self.record_variant("Item", "ForeignMod", Some(i.hir_id()), i)
}
hir::ItemKind::GlobalAsm { .. } => {
self.record_variant("Item", "GlobalAsm", Some(i.hir_id()), i)
}
hir::ItemKind::TyAlias { .. } => {
self.record_variant("Item", "TyAlias", Some(i.hir_id()), i)
}
hir::ItemKind::Enum { .. } => {
self.record_variant("Item", "Enum", Some(i.hir_id()), i)
}
hir::ItemKind::Struct { .. } => {
self.record_variant("Item", "Struct", Some(i.hir_id()), i)
}
hir::ItemKind::Union { .. } => {
self.record_variant("Item", "Union", Some(i.hir_id()), i)
}
hir::ItemKind::Trait { .. } => {
self.record_variant("Item", "Trait", Some(i.hir_id()), i)
}
hir::ItemKind::TraitAlias { .. } => {
self.record_variant("Item", "TraitAlias", Some(i.hir_id()), i)
}
hir::ItemKind::Impl { .. } => {
self.record_variant("Item", "Impl", Some(i.hir_id()), i)
}
};record_variants!(
251 (self, i, i.kind, Some(i.hir_id()), hir, Item, ItemKind),
252 [
253 ExternCrate,
254 Use,
255 Static,
256 Const,
257 Fn,
258 Macro,
259 Mod,
260 ForeignMod,
261 GlobalAsm,
262 TyAlias,
263 Enum,
264 Struct,
265 Union,
266 Trait,
267 TraitAlias,
268 Impl
269 ]
270 );
271 hir_visit::walk_item(self, i)
272 }
273
274 fn visit_body(&mut self, b: &hir::Body<'v>) {
275 self.record("Body", None, b);
276 hir_visit::walk_body(self, b);
277 }
278
279 fn visit_mod(&mut self, m: &'v hir::Mod<'v>, _s: Span, _n: HirId) {
280 self.record("Mod", None, m);
281 hir_visit::walk_mod(self, m)
282 }
283
284 fn visit_foreign_item(&mut self, i: &'v hir::ForeignItem<'v>) {
285 match i.kind {
hir::ForeignItemKind::Fn { .. } => {
self.record_variant("ForeignItem", "Fn", Some(i.hir_id()), i)
}
hir::ForeignItemKind::Static { .. } => {
self.record_variant("ForeignItem", "Static", Some(i.hir_id()), i)
}
hir::ForeignItemKind::Type { .. } => {
self.record_variant("ForeignItem", "Type", Some(i.hir_id()), i)
}
};record_variants!(
286 (self, i, i.kind, Some(i.hir_id()), hir, ForeignItem, ForeignItemKind),
287 [Fn, Static, Type]
288 );
289 hir_visit::walk_foreign_item(self, i)
290 }
291
292 fn visit_local(&mut self, l: &'v hir::LetStmt<'v>) {
293 self.record("Local", Some(l.hir_id), l);
294 hir_visit::walk_local(self, l)
295 }
296
297 fn visit_block(&mut self, b: &'v hir::Block<'v>) {
298 self.record("Block", Some(b.hir_id), b);
299 hir_visit::walk_block(self, b)
300 }
301
302 fn visit_stmt(&mut self, s: &'v hir::Stmt<'v>) {
303 match s.kind {
hir::StmtKind::Let { .. } => {
self.record_variant("Stmt", "Let", Some(s.hir_id), s)
}
hir::StmtKind::Item { .. } => {
self.record_variant("Stmt", "Item", Some(s.hir_id), s)
}
hir::StmtKind::Expr { .. } => {
self.record_variant("Stmt", "Expr", Some(s.hir_id), s)
}
hir::StmtKind::Semi { .. } => {
self.record_variant("Stmt", "Semi", Some(s.hir_id), s)
}
};record_variants!(
304 (self, s, s.kind, Some(s.hir_id), hir, Stmt, StmtKind),
305 [Let, Item, Expr, Semi]
306 );
307 hir_visit::walk_stmt(self, s)
308 }
309
310 fn visit_arm(&mut self, a: &'v hir::Arm<'v>) {
311 self.record("Arm", Some(a.hir_id), a);
312 hir_visit::walk_arm(self, a)
313 }
314
315 fn visit_pat(&mut self, p: &'v hir::Pat<'v>) {
316 match p.kind {
hir::PatKind::Missing { .. } => {
self.record_variant("Pat", "Missing", Some(p.hir_id), p)
}
hir::PatKind::Wild { .. } => {
self.record_variant("Pat", "Wild", Some(p.hir_id), p)
}
hir::PatKind::Binding { .. } => {
self.record_variant("Pat", "Binding", Some(p.hir_id), p)
}
hir::PatKind::Struct { .. } => {
self.record_variant("Pat", "Struct", Some(p.hir_id), p)
}
hir::PatKind::TupleStruct { .. } => {
self.record_variant("Pat", "TupleStruct", Some(p.hir_id), p)
}
hir::PatKind::Or { .. } => {
self.record_variant("Pat", "Or", Some(p.hir_id), p)
}
hir::PatKind::Never { .. } => {
self.record_variant("Pat", "Never", Some(p.hir_id), p)
}
hir::PatKind::Tuple { .. } => {
self.record_variant("Pat", "Tuple", Some(p.hir_id), p)
}
hir::PatKind::Box { .. } => {
self.record_variant("Pat", "Box", Some(p.hir_id), p)
}
hir::PatKind::Deref { .. } => {
self.record_variant("Pat", "Deref", Some(p.hir_id), p)
}
hir::PatKind::Ref { .. } => {
self.record_variant("Pat", "Ref", Some(p.hir_id), p)
}
hir::PatKind::Expr { .. } => {
self.record_variant("Pat", "Expr", Some(p.hir_id), p)
}
hir::PatKind::Guard { .. } => {
self.record_variant("Pat", "Guard", Some(p.hir_id), p)
}
hir::PatKind::Range { .. } => {
self.record_variant("Pat", "Range", Some(p.hir_id), p)
}
hir::PatKind::Slice { .. } => {
self.record_variant("Pat", "Slice", Some(p.hir_id), p)
}
hir::PatKind::Err { .. } => {
self.record_variant("Pat", "Err", Some(p.hir_id), p)
}
};record_variants!(
317 (self, p, p.kind, Some(p.hir_id), hir, Pat, PatKind),
318 [
319 Missing,
320 Wild,
321 Binding,
322 Struct,
323 TupleStruct,
324 Or,
325 Never,
326 Tuple,
327 Box,
328 Deref,
329 Ref,
330 Expr,
331 Guard,
332 Range,
333 Slice,
334 Err
335 ]
336 );
337 hir_visit::walk_pat(self, p)
338 }
339
340 fn visit_pat_field(&mut self, f: &'v hir::PatField<'v>) {
341 self.record("PatField", Some(f.hir_id), f);
342 hir_visit::walk_pat_field(self, f)
343 }
344
345 fn visit_expr(&mut self, e: &'v hir::Expr<'v>) {
346 match e.kind {
hir::ExprKind::ConstBlock { .. } => {
self.record_variant("Expr", "ConstBlock", Some(e.hir_id), e)
}
hir::ExprKind::Array { .. } => {
self.record_variant("Expr", "Array", Some(e.hir_id), e)
}
hir::ExprKind::Call { .. } => {
self.record_variant("Expr", "Call", Some(e.hir_id), e)
}
hir::ExprKind::MethodCall { .. } => {
self.record_variant("Expr", "MethodCall", Some(e.hir_id), e)
}
hir::ExprKind::Use { .. } => {
self.record_variant("Expr", "Use", Some(e.hir_id), e)
}
hir::ExprKind::Tup { .. } => {
self.record_variant("Expr", "Tup", Some(e.hir_id), e)
}
hir::ExprKind::Binary { .. } => {
self.record_variant("Expr", "Binary", Some(e.hir_id), e)
}
hir::ExprKind::Unary { .. } => {
self.record_variant("Expr", "Unary", Some(e.hir_id), e)
}
hir::ExprKind::Lit { .. } => {
self.record_variant("Expr", "Lit", Some(e.hir_id), e)
}
hir::ExprKind::Cast { .. } => {
self.record_variant("Expr", "Cast", Some(e.hir_id), e)
}
hir::ExprKind::Type { .. } => {
self.record_variant("Expr", "Type", Some(e.hir_id), e)
}
hir::ExprKind::DropTemps { .. } => {
self.record_variant("Expr", "DropTemps", Some(e.hir_id), e)
}
hir::ExprKind::Let { .. } => {
self.record_variant("Expr", "Let", Some(e.hir_id), e)
}
hir::ExprKind::If { .. } => {
self.record_variant("Expr", "If", Some(e.hir_id), e)
}
hir::ExprKind::Loop { .. } => {
self.record_variant("Expr", "Loop", Some(e.hir_id), e)
}
hir::ExprKind::Match { .. } => {
self.record_variant("Expr", "Match", Some(e.hir_id), e)
}
hir::ExprKind::Closure { .. } => {
self.record_variant("Expr", "Closure", Some(e.hir_id), e)
}
hir::ExprKind::Block { .. } => {
self.record_variant("Expr", "Block", Some(e.hir_id), e)
}
hir::ExprKind::Assign { .. } => {
self.record_variant("Expr", "Assign", Some(e.hir_id), e)
}
hir::ExprKind::AssignOp { .. } => {
self.record_variant("Expr", "AssignOp", Some(e.hir_id), e)
}
hir::ExprKind::Field { .. } => {
self.record_variant("Expr", "Field", Some(e.hir_id), e)
}
hir::ExprKind::Index { .. } => {
self.record_variant("Expr", "Index", Some(e.hir_id), e)
}
hir::ExprKind::Path { .. } => {
self.record_variant("Expr", "Path", Some(e.hir_id), e)
}
hir::ExprKind::AddrOf { .. } => {
self.record_variant("Expr", "AddrOf", Some(e.hir_id), e)
}
hir::ExprKind::Break { .. } => {
self.record_variant("Expr", "Break", Some(e.hir_id), e)
}
hir::ExprKind::Continue { .. } => {
self.record_variant("Expr", "Continue", Some(e.hir_id), e)
}
hir::ExprKind::Ret { .. } => {
self.record_variant("Expr", "Ret", Some(e.hir_id), e)
}
hir::ExprKind::Become { .. } => {
self.record_variant("Expr", "Become", Some(e.hir_id), e)
}
hir::ExprKind::InlineAsm { .. } => {
self.record_variant("Expr", "InlineAsm", Some(e.hir_id), e)
}
hir::ExprKind::OffsetOf { .. } => {
self.record_variant("Expr", "OffsetOf", Some(e.hir_id), e)
}
hir::ExprKind::Struct { .. } => {
self.record_variant("Expr", "Struct", Some(e.hir_id), e)
}
hir::ExprKind::Repeat { .. } => {
self.record_variant("Expr", "Repeat", Some(e.hir_id), e)
}
hir::ExprKind::Yield { .. } => {
self.record_variant("Expr", "Yield", Some(e.hir_id), e)
}
hir::ExprKind::UnsafeBinderCast { .. } => {
self.record_variant("Expr", "UnsafeBinderCast", Some(e.hir_id), e)
}
hir::ExprKind::Err { .. } => {
self.record_variant("Expr", "Err", Some(e.hir_id), e)
}
};record_variants!(
347 (self, e, e.kind, Some(e.hir_id), hir, Expr, ExprKind),
348 [
349 ConstBlock,
350 Array,
351 Call,
352 MethodCall,
353 Use,
354 Tup,
355 Binary,
356 Unary,
357 Lit,
358 Cast,
359 Type,
360 DropTemps,
361 Let,
362 If,
363 Loop,
364 Match,
365 Closure,
366 Block,
367 Assign,
368 AssignOp,
369 Field,
370 Index,
371 Path,
372 AddrOf,
373 Break,
374 Continue,
375 Ret,
376 Become,
377 InlineAsm,
378 OffsetOf,
379 Struct,
380 Repeat,
381 Yield,
382 UnsafeBinderCast,
383 Err
384 ]
385 );
386 hir_visit::walk_expr(self, e)
387 }
388
389 fn visit_expr_field(&mut self, f: &'v hir::ExprField<'v>) {
390 self.record("ExprField", Some(f.hir_id), f);
391 hir_visit::walk_expr_field(self, f)
392 }
393
394 fn visit_ty(&mut self, t: &'v hir::Ty<'v, AmbigArg>) {
395 match t.kind {
hir::TyKind::InferDelegation { .. } => {
self.record_variant("Ty", "InferDelegation", Some(t.hir_id), t)
}
hir::TyKind::Slice { .. } => {
self.record_variant("Ty", "Slice", Some(t.hir_id), t)
}
hir::TyKind::Array { .. } => {
self.record_variant("Ty", "Array", Some(t.hir_id), t)
}
hir::TyKind::Ptr { .. } => {
self.record_variant("Ty", "Ptr", Some(t.hir_id), t)
}
hir::TyKind::Ref { .. } => {
self.record_variant("Ty", "Ref", Some(t.hir_id), t)
}
hir::TyKind::FnPtr { .. } => {
self.record_variant("Ty", "FnPtr", Some(t.hir_id), t)
}
hir::TyKind::UnsafeBinder { .. } => {
self.record_variant("Ty", "UnsafeBinder", Some(t.hir_id), t)
}
hir::TyKind::Never { .. } => {
self.record_variant("Ty", "Never", Some(t.hir_id), t)
}
hir::TyKind::Tup { .. } => {
self.record_variant("Ty", "Tup", Some(t.hir_id), t)
}
hir::TyKind::Path { .. } => {
self.record_variant("Ty", "Path", Some(t.hir_id), t)
}
hir::TyKind::OpaqueDef { .. } => {
self.record_variant("Ty", "OpaqueDef", Some(t.hir_id), t)
}
hir::TyKind::TraitAscription { .. } => {
self.record_variant("Ty", "TraitAscription", Some(t.hir_id), t)
}
hir::TyKind::TraitObject { .. } => {
self.record_variant("Ty", "TraitObject", Some(t.hir_id), t)
}
hir::TyKind::Infer { .. } => {
self.record_variant("Ty", "Infer", Some(t.hir_id), t)
}
hir::TyKind::Pat { .. } => {
self.record_variant("Ty", "Pat", Some(t.hir_id), t)
}
hir::TyKind::Err { .. } => {
self.record_variant("Ty", "Err", Some(t.hir_id), t)
}
};record_variants!(
396 (self, t, t.kind, Some(t.hir_id), hir, Ty, TyKind),
397 [
398 InferDelegation,
399 Slice,
400 Array,
401 Ptr,
402 Ref,
403 FnPtr,
404 UnsafeBinder,
405 Never,
406 Tup,
407 Path,
408 OpaqueDef,
409 TraitAscription,
410 TraitObject,
411 Infer,
412 Pat,
413 Err
414 ]
415 );
416 hir_visit::walk_ty(self, t)
417 }
418
419 fn visit_generic_param(&mut self, p: &'v hir::GenericParam<'v>) {
420 self.record("GenericParam", Some(p.hir_id), p);
421 hir_visit::walk_generic_param(self, p)
422 }
423
424 fn visit_generics(&mut self, g: &'v hir::Generics<'v>) {
425 self.record("Generics", None, g);
426 hir_visit::walk_generics(self, g)
427 }
428
429 fn visit_where_predicate(&mut self, p: &'v hir::WherePredicate<'v>) {
430 match p.kind {
hir::WherePredicateKind::BoundPredicate { .. } => {
self.record_variant("WherePredicate", "BoundPredicate",
Some(p.hir_id), p)
}
hir::WherePredicateKind::RegionPredicate { .. } => {
self.record_variant("WherePredicate", "RegionPredicate",
Some(p.hir_id), p)
}
hir::WherePredicateKind::EqPredicate { .. } => {
self.record_variant("WherePredicate", "EqPredicate", Some(p.hir_id),
p)
}
};record_variants!(
431 (self, p, p.kind, Some(p.hir_id), hir, WherePredicate, WherePredicateKind),
432 [BoundPredicate, RegionPredicate, EqPredicate]
433 );
434 hir_visit::walk_where_predicate(self, p)
435 }
436
437 fn visit_fn(
438 &mut self,
439 fk: hir_visit::FnKind<'v>,
440 fd: &'v hir::FnDecl<'v>,
441 b: hir::BodyId,
442 _: Span,
443 id: LocalDefId,
444 ) {
445 self.record("FnDecl", None, fd);
446 hir_visit::walk_fn(self, fk, fd, b, id)
447 }
448
449 fn visit_use(&mut self, p: &'v hir::UsePath<'v>, _hir_id: HirId) {
450 self.record("Path", None, p);
452 let hir::Path { span: _, res: _, segments } = *p;
458 for elem in segments {
match ::rustc_ast_ir::visit::VisitorResult::branch(self.visit_path_segment(elem))
{
core::ops::ControlFlow::Continue(()) =>
(),
#[allow(unreachable_code)]
core::ops::ControlFlow::Break(r) => {
return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
}
};
};ast_visit::walk_list!(self, visit_path_segment, segments);
459 }
460
461 fn visit_trait_item(&mut self, ti: &'v hir::TraitItem<'v>) {
462 match ti.kind {
hir::TraitItemKind::Const { .. } => {
self.record_variant("TraitItem", "Const", Some(ti.hir_id()), ti)
}
hir::TraitItemKind::Fn { .. } => {
self.record_variant("TraitItem", "Fn", Some(ti.hir_id()), ti)
}
hir::TraitItemKind::Type { .. } => {
self.record_variant("TraitItem", "Type", Some(ti.hir_id()), ti)
}
};record_variants!(
463 (self, ti, ti.kind, Some(ti.hir_id()), hir, TraitItem, TraitItemKind),
464 [Const, Fn, Type]
465 );
466 hir_visit::walk_trait_item(self, ti)
467 }
468
469 fn visit_trait_item_ref(&mut self, ti: &'v hir::TraitItemId) {
470 self.record("TraitItemId", Some(ti.hir_id()), ti);
471 hir_visit::walk_trait_item_ref(self, *ti)
472 }
473
474 fn visit_impl_item(&mut self, ii: &'v hir::ImplItem<'v>) {
475 match ii.kind {
hir::ImplItemKind::Const { .. } => {
self.record_variant("ImplItem", "Const", Some(ii.hir_id()), ii)
}
hir::ImplItemKind::Fn { .. } => {
self.record_variant("ImplItem", "Fn", Some(ii.hir_id()), ii)
}
hir::ImplItemKind::Type { .. } => {
self.record_variant("ImplItem", "Type", Some(ii.hir_id()), ii)
}
};record_variants!(
476 (self, ii, ii.kind, Some(ii.hir_id()), hir, ImplItem, ImplItemKind),
477 [Const, Fn, Type]
478 );
479 hir_visit::walk_impl_item(self, ii)
480 }
481
482 fn visit_foreign_item_ref(&mut self, fi: &'v hir::ForeignItemId) {
483 self.record("ForeignItemId", Some(fi.hir_id()), fi);
484 hir_visit::walk_foreign_item_ref(self, *fi)
485 }
486
487 fn visit_impl_item_ref(&mut self, ii: &'v hir::ImplItemId) {
488 self.record("ImplItemId", Some(ii.hir_id()), ii);
489 hir_visit::walk_impl_item_ref(self, *ii)
490 }
491
492 fn visit_param_bound(&mut self, b: &'v hir::GenericBound<'v>) {
493 match b {
hir::GenericBound::Trait { .. } => {
self.record_variant("GenericBound", "Trait", None, b)
}
hir::GenericBound::Outlives { .. } => {
self.record_variant("GenericBound", "Outlives", None, b)
}
hir::GenericBound::Use { .. } => {
self.record_variant("GenericBound", "Use", None, b)
}
};record_variants!(
494 (self, b, b, None, hir, GenericBound, GenericBound),
495 [Trait, Outlives, Use]
496 );
497 hir_visit::walk_param_bound(self, b)
498 }
499
500 fn visit_field_def(&mut self, s: &'v hir::FieldDef<'v>) {
501 self.record("FieldDef", Some(s.hir_id), s);
502 hir_visit::walk_field_def(self, s)
503 }
504
505 fn visit_variant(&mut self, v: &'v hir::Variant<'v>) {
506 self.record("Variant", None, v);
507 hir_visit::walk_variant(self, v)
508 }
509
510 fn visit_generic_arg(&mut self, ga: &'v hir::GenericArg<'v>) {
511 match ga {
hir::GenericArg::Lifetime { .. } => {
self.record_variant("GenericArg", "Lifetime", Some(ga.hir_id()), ga)
}
hir::GenericArg::Type { .. } => {
self.record_variant("GenericArg", "Type", Some(ga.hir_id()), ga)
}
hir::GenericArg::Const { .. } => {
self.record_variant("GenericArg", "Const", Some(ga.hir_id()), ga)
}
hir::GenericArg::Infer { .. } => {
self.record_variant("GenericArg", "Infer", Some(ga.hir_id()), ga)
}
};record_variants!(
512 (self, ga, ga, Some(ga.hir_id()), hir, GenericArg, GenericArg),
513 [Lifetime, Type, Const, Infer]
514 );
515 match ga {
516 hir::GenericArg::Lifetime(lt) => self.visit_lifetime(lt),
517 hir::GenericArg::Type(ty) => self.visit_ty(ty),
518 hir::GenericArg::Const(ct) => self.visit_const_arg(ct),
519 hir::GenericArg::Infer(inf) => self.visit_id(inf.hir_id),
520 }
521 }
522
523 fn visit_lifetime(&mut self, lifetime: &'v hir::Lifetime) {
524 self.record("Lifetime", Some(lifetime.hir_id), lifetime);
525 hir_visit::walk_lifetime(self, lifetime)
526 }
527
528 fn visit_path(&mut self, path: &hir::Path<'v>, _id: HirId) {
529 self.record("Path", None, path);
530 hir_visit::walk_path(self, path)
531 }
532
533 fn visit_path_segment(&mut self, path_segment: &'v hir::PathSegment<'v>) {
534 self.record("PathSegment", None, path_segment);
535 hir_visit::walk_path_segment(self, path_segment)
536 }
537
538 fn visit_generic_args(&mut self, ga: &'v hir::GenericArgs<'v>) {
539 self.record("GenericArgs", None, ga);
540 hir_visit::walk_generic_args(self, ga)
541 }
542
543 fn visit_assoc_item_constraint(&mut self, constraint: &'v hir::AssocItemConstraint<'v>) {
544 self.record("AssocItemConstraint", Some(constraint.hir_id), constraint);
545 hir_visit::walk_assoc_item_constraint(self, constraint)
546 }
547
548 fn visit_attribute(&mut self, attr: &'v hir::Attribute) {
549 self.record("Attribute", None, attr);
550 }
551
552 fn visit_inline_asm(&mut self, asm: &'v hir::InlineAsm<'v>, id: HirId) {
553 self.record("InlineAsm", None, asm);
554 hir_visit::walk_inline_asm(self, asm, id);
555 }
556}
557
558impl<'v> ast_visit::Visitor<'v> for StatCollector<'v> {
559 fn visit_foreign_item(&mut self, i: &'v ast::ForeignItem) {
560 match i.kind {
ast::ForeignItemKind::Static { .. } => {
self.record_variant("ForeignItem", "Static", None, i)
}
ast::ForeignItemKind::Fn { .. } => {
self.record_variant("ForeignItem", "Fn", None, i)
}
ast::ForeignItemKind::TyAlias { .. } => {
self.record_variant("ForeignItem", "TyAlias", None, i)
}
ast::ForeignItemKind::MacCall { .. } => {
self.record_variant("ForeignItem", "MacCall", None, i)
}
};record_variants!(
561 (self, i, i.kind, None, ast, ForeignItem, ForeignItemKind),
562 [Static, Fn, TyAlias, MacCall]
563 );
564 ast_visit::walk_item(self, i)
565 }
566
567 fn visit_item(&mut self, i: &'v ast::Item) {
568 match i.kind {
ast::ItemKind::ExternCrate { .. } => {
self.record_variant("Item", "ExternCrate", None, i)
}
ast::ItemKind::Use { .. } => {
self.record_variant("Item", "Use", None, i)
}
ast::ItemKind::Static { .. } => {
self.record_variant("Item", "Static", None, i)
}
ast::ItemKind::Const { .. } => {
self.record_variant("Item", "Const", None, i)
}
ast::ItemKind::ConstBlock { .. } => {
self.record_variant("Item", "ConstBlock", None, i)
}
ast::ItemKind::Fn { .. } => { self.record_variant("Item", "Fn", None, i) }
ast::ItemKind::Mod { .. } => {
self.record_variant("Item", "Mod", None, i)
}
ast::ItemKind::ForeignMod { .. } => {
self.record_variant("Item", "ForeignMod", None, i)
}
ast::ItemKind::GlobalAsm { .. } => {
self.record_variant("Item", "GlobalAsm", None, i)
}
ast::ItemKind::TyAlias { .. } => {
self.record_variant("Item", "TyAlias", None, i)
}
ast::ItemKind::Enum { .. } => {
self.record_variant("Item", "Enum", None, i)
}
ast::ItemKind::Struct { .. } => {
self.record_variant("Item", "Struct", None, i)
}
ast::ItemKind::Union { .. } => {
self.record_variant("Item", "Union", None, i)
}
ast::ItemKind::Trait { .. } => {
self.record_variant("Item", "Trait", None, i)
}
ast::ItemKind::TraitAlias { .. } => {
self.record_variant("Item", "TraitAlias", None, i)
}
ast::ItemKind::Impl { .. } => {
self.record_variant("Item", "Impl", None, i)
}
ast::ItemKind::MacCall { .. } => {
self.record_variant("Item", "MacCall", None, i)
}
ast::ItemKind::MacroDef { .. } => {
self.record_variant("Item", "MacroDef", None, i)
}
ast::ItemKind::Delegation { .. } => {
self.record_variant("Item", "Delegation", None, i)
}
ast::ItemKind::DelegationMac { .. } => {
self.record_variant("Item", "DelegationMac", None, i)
}
};record_variants!(
569 (self, i, i.kind, None, ast, Item, ItemKind),
570 [
571 ExternCrate,
572 Use,
573 Static,
574 Const,
575 ConstBlock,
576 Fn,
577 Mod,
578 ForeignMod,
579 GlobalAsm,
580 TyAlias,
581 Enum,
582 Struct,
583 Union,
584 Trait,
585 TraitAlias,
586 Impl,
587 MacCall,
588 MacroDef,
589 Delegation,
590 DelegationMac
591 ]
592 );
593 ast_visit::walk_item(self, i)
594 }
595
596 fn visit_local(&mut self, l: &'v ast::Local) {
597 self.record("Local", None, l);
598 ast_visit::walk_local(self, l)
599 }
600
601 fn visit_block(&mut self, b: &'v ast::Block) {
602 self.record("Block", None, b);
603 ast_visit::walk_block(self, b)
604 }
605
606 fn visit_stmt(&mut self, s: &'v ast::Stmt) {
607 match s.kind {
ast::StmtKind::Let { .. } => {
self.record_variant("Stmt", "Let", None, s)
}
ast::StmtKind::Item { .. } => {
self.record_variant("Stmt", "Item", None, s)
}
ast::StmtKind::Expr { .. } => {
self.record_variant("Stmt", "Expr", None, s)
}
ast::StmtKind::Semi { .. } => {
self.record_variant("Stmt", "Semi", None, s)
}
ast::StmtKind::Empty { .. } => {
self.record_variant("Stmt", "Empty", None, s)
}
ast::StmtKind::MacCall { .. } => {
self.record_variant("Stmt", "MacCall", None, s)
}
};record_variants!(
608 (self, s, s.kind, None, ast, Stmt, StmtKind),
609 [Let, Item, Expr, Semi, Empty, MacCall]
610 );
611 ast_visit::walk_stmt(self, s)
612 }
613
614 fn visit_param(&mut self, p: &'v ast::Param) {
615 self.record("Param", None, p);
616 ast_visit::walk_param(self, p)
617 }
618
619 fn visit_arm(&mut self, a: &'v ast::Arm) {
620 self.record("Arm", None, a);
621 ast_visit::walk_arm(self, a)
622 }
623
624 fn visit_pat(&mut self, p: &'v ast::Pat) {
625 match p.kind {
ast::PatKind::Missing { .. } => {
self.record_variant("Pat", "Missing", None, p)
}
ast::PatKind::Wild { .. } => {
self.record_variant("Pat", "Wild", None, p)
}
ast::PatKind::Ident { .. } => {
self.record_variant("Pat", "Ident", None, p)
}
ast::PatKind::Struct { .. } => {
self.record_variant("Pat", "Struct", None, p)
}
ast::PatKind::TupleStruct { .. } => {
self.record_variant("Pat", "TupleStruct", None, p)
}
ast::PatKind::Or { .. } => { self.record_variant("Pat", "Or", None, p) }
ast::PatKind::Path { .. } => {
self.record_variant("Pat", "Path", None, p)
}
ast::PatKind::Tuple { .. } => {
self.record_variant("Pat", "Tuple", None, p)
}
ast::PatKind::Box { .. } => { self.record_variant("Pat", "Box", None, p) }
ast::PatKind::Deref { .. } => {
self.record_variant("Pat", "Deref", None, p)
}
ast::PatKind::Ref { .. } => { self.record_variant("Pat", "Ref", None, p) }
ast::PatKind::Expr { .. } => {
self.record_variant("Pat", "Expr", None, p)
}
ast::PatKind::Range { .. } => {
self.record_variant("Pat", "Range", None, p)
}
ast::PatKind::Slice { .. } => {
self.record_variant("Pat", "Slice", None, p)
}
ast::PatKind::Rest { .. } => {
self.record_variant("Pat", "Rest", None, p)
}
ast::PatKind::Never { .. } => {
self.record_variant("Pat", "Never", None, p)
}
ast::PatKind::Guard { .. } => {
self.record_variant("Pat", "Guard", None, p)
}
ast::PatKind::Paren { .. } => {
self.record_variant("Pat", "Paren", None, p)
}
ast::PatKind::MacCall { .. } => {
self.record_variant("Pat", "MacCall", None, p)
}
ast::PatKind::Err { .. } => { self.record_variant("Pat", "Err", None, p) }
};record_variants!(
626 (self, p, p.kind, None, ast, Pat, PatKind),
627 [
628 Missing,
629 Wild,
630 Ident,
631 Struct,
632 TupleStruct,
633 Or,
634 Path,
635 Tuple,
636 Box,
637 Deref,
638 Ref,
639 Expr,
640 Range,
641 Slice,
642 Rest,
643 Never,
644 Guard,
645 Paren,
646 MacCall,
647 Err
648 ]
649 );
650 ast_visit::walk_pat(self, p)
651 }
652
653 fn visit_expr(&mut self, e: &'v ast::Expr) {
654 #[rustfmt::skip]
655 match e.kind {
ast::ExprKind::Array { .. } => {
self.record_variant("Expr", "Array", None, e)
}
ast::ExprKind::ConstBlock { .. } => {
self.record_variant("Expr", "ConstBlock", None, e)
}
ast::ExprKind::Call { .. } => {
self.record_variant("Expr", "Call", None, e)
}
ast::ExprKind::MethodCall { .. } => {
self.record_variant("Expr", "MethodCall", None, e)
}
ast::ExprKind::Tup { .. } => {
self.record_variant("Expr", "Tup", None, e)
}
ast::ExprKind::Binary { .. } => {
self.record_variant("Expr", "Binary", None, e)
}
ast::ExprKind::Unary { .. } => {
self.record_variant("Expr", "Unary", None, e)
}
ast::ExprKind::Lit { .. } => {
self.record_variant("Expr", "Lit", None, e)
}
ast::ExprKind::Cast { .. } => {
self.record_variant("Expr", "Cast", None, e)
}
ast::ExprKind::Type { .. } => {
self.record_variant("Expr", "Type", None, e)
}
ast::ExprKind::Let { .. } => {
self.record_variant("Expr", "Let", None, e)
}
ast::ExprKind::If { .. } => { self.record_variant("Expr", "If", None, e) }
ast::ExprKind::While { .. } => {
self.record_variant("Expr", "While", None, e)
}
ast::ExprKind::ForLoop { .. } => {
self.record_variant("Expr", "ForLoop", None, e)
}
ast::ExprKind::Loop { .. } => {
self.record_variant("Expr", "Loop", None, e)
}
ast::ExprKind::Match { .. } => {
self.record_variant("Expr", "Match", None, e)
}
ast::ExprKind::Closure { .. } => {
self.record_variant("Expr", "Closure", None, e)
}
ast::ExprKind::Block { .. } => {
self.record_variant("Expr", "Block", None, e)
}
ast::ExprKind::Await { .. } => {
self.record_variant("Expr", "Await", None, e)
}
ast::ExprKind::Use { .. } => {
self.record_variant("Expr", "Use", None, e)
}
ast::ExprKind::TryBlock { .. } => {
self.record_variant("Expr", "TryBlock", None, e)
}
ast::ExprKind::Assign { .. } => {
self.record_variant("Expr", "Assign", None, e)
}
ast::ExprKind::AssignOp { .. } => {
self.record_variant("Expr", "AssignOp", None, e)
}
ast::ExprKind::Field { .. } => {
self.record_variant("Expr", "Field", None, e)
}
ast::ExprKind::Index { .. } => {
self.record_variant("Expr", "Index", None, e)
}
ast::ExprKind::Range { .. } => {
self.record_variant("Expr", "Range", None, e)
}
ast::ExprKind::Underscore { .. } => {
self.record_variant("Expr", "Underscore", None, e)
}
ast::ExprKind::Path { .. } => {
self.record_variant("Expr", "Path", None, e)
}
ast::ExprKind::AddrOf { .. } => {
self.record_variant("Expr", "AddrOf", None, e)
}
ast::ExprKind::Break { .. } => {
self.record_variant("Expr", "Break", None, e)
}
ast::ExprKind::Continue { .. } => {
self.record_variant("Expr", "Continue", None, e)
}
ast::ExprKind::Ret { .. } => {
self.record_variant("Expr", "Ret", None, e)
}
ast::ExprKind::InlineAsm { .. } => {
self.record_variant("Expr", "InlineAsm", None, e)
}
ast::ExprKind::FormatArgs { .. } => {
self.record_variant("Expr", "FormatArgs", None, e)
}
ast::ExprKind::OffsetOf { .. } => {
self.record_variant("Expr", "OffsetOf", None, e)
}
ast::ExprKind::MacCall { .. } => {
self.record_variant("Expr", "MacCall", None, e)
}
ast::ExprKind::Struct { .. } => {
self.record_variant("Expr", "Struct", None, e)
}
ast::ExprKind::Repeat { .. } => {
self.record_variant("Expr", "Repeat", None, e)
}
ast::ExprKind::Paren { .. } => {
self.record_variant("Expr", "Paren", None, e)
}
ast::ExprKind::Try { .. } => {
self.record_variant("Expr", "Try", None, e)
}
ast::ExprKind::Yield { .. } => {
self.record_variant("Expr", "Yield", None, e)
}
ast::ExprKind::Yeet { .. } => {
self.record_variant("Expr", "Yeet", None, e)
}
ast::ExprKind::Become { .. } => {
self.record_variant("Expr", "Become", None, e)
}
ast::ExprKind::IncludedBytes { .. } => {
self.record_variant("Expr", "IncludedBytes", None, e)
}
ast::ExprKind::Gen { .. } => {
self.record_variant("Expr", "Gen", None, e)
}
ast::ExprKind::UnsafeBinderCast { .. } => {
self.record_variant("Expr", "UnsafeBinderCast", None, e)
}
ast::ExprKind::Err { .. } => {
self.record_variant("Expr", "Err", None, e)
}
ast::ExprKind::Dummy { .. } => {
self.record_variant("Expr", "Dummy", None, e)
}
};record_variants!(
656 (self, e, e.kind, None, ast, Expr, ExprKind),
657 [
658 Array, ConstBlock, Call, MethodCall, Tup, Binary, Unary, Lit, Cast, Type, Let,
659 If, While, ForLoop, Loop, Match, Closure, Block, Await, Use, TryBlock, Assign,
660 AssignOp, Field, Index, Range, Underscore, Path, AddrOf, Break, Continue, Ret,
661 InlineAsm, FormatArgs, OffsetOf, MacCall, Struct, Repeat, Paren, Try, Yield, Yeet,
662 Become, IncludedBytes, Gen, UnsafeBinderCast, Err, Dummy
663 ]
664 );
665 ast_visit::walk_expr(self, e)
666 }
667
668 fn visit_ty(&mut self, t: &'v ast::Ty) {
669 match t.kind {
ast::TyKind::Slice { .. } => {
self.record_variant("Ty", "Slice", None, t)
}
ast::TyKind::Array { .. } => {
self.record_variant("Ty", "Array", None, t)
}
ast::TyKind::Ptr { .. } => { self.record_variant("Ty", "Ptr", None, t) }
ast::TyKind::Ref { .. } => { self.record_variant("Ty", "Ref", None, t) }
ast::TyKind::PinnedRef { .. } => {
self.record_variant("Ty", "PinnedRef", None, t)
}
ast::TyKind::FnPtr { .. } => {
self.record_variant("Ty", "FnPtr", None, t)
}
ast::TyKind::UnsafeBinder { .. } => {
self.record_variant("Ty", "UnsafeBinder", None, t)
}
ast::TyKind::Never { .. } => {
self.record_variant("Ty", "Never", None, t)
}
ast::TyKind::Tup { .. } => { self.record_variant("Ty", "Tup", None, t) }
ast::TyKind::Path { .. } => { self.record_variant("Ty", "Path", None, t) }
ast::TyKind::Pat { .. } => { self.record_variant("Ty", "Pat", None, t) }
ast::TyKind::TraitObject { .. } => {
self.record_variant("Ty", "TraitObject", None, t)
}
ast::TyKind::ImplTrait { .. } => {
self.record_variant("Ty", "ImplTrait", None, t)
}
ast::TyKind::Paren { .. } => {
self.record_variant("Ty", "Paren", None, t)
}
ast::TyKind::Infer { .. } => {
self.record_variant("Ty", "Infer", None, t)
}
ast::TyKind::ImplicitSelf { .. } => {
self.record_variant("Ty", "ImplicitSelf", None, t)
}
ast::TyKind::MacCall { .. } => {
self.record_variant("Ty", "MacCall", None, t)
}
ast::TyKind::CVarArgs { .. } => {
self.record_variant("Ty", "CVarArgs", None, t)
}
ast::TyKind::Dummy { .. } => {
self.record_variant("Ty", "Dummy", None, t)
}
ast::TyKind::Err { .. } => { self.record_variant("Ty", "Err", None, t) }
};record_variants!(
670 (self, t, t.kind, None, ast, Ty, TyKind),
671 [
672 Slice,
673 Array,
674 Ptr,
675 Ref,
676 PinnedRef,
677 FnPtr,
678 UnsafeBinder,
679 Never,
680 Tup,
681 Path,
682 Pat,
683 TraitObject,
684 ImplTrait,
685 Paren,
686 Infer,
687 ImplicitSelf,
688 MacCall,
689 CVarArgs,
690 Dummy,
691 Err
692 ]
693 );
694
695 ast_visit::walk_ty(self, t)
696 }
697
698 fn visit_generic_param(&mut self, g: &'v ast::GenericParam) {
699 self.record("GenericParam", None, g);
700 ast_visit::walk_generic_param(self, g)
701 }
702
703 fn visit_where_predicate(&mut self, p: &'v ast::WherePredicate) {
704 match &p.kind {
ast::WherePredicateKind::BoundPredicate { .. } => {
self.record_variant("WherePredicate", "BoundPredicate", None, p)
}
ast::WherePredicateKind::RegionPredicate { .. } => {
self.record_variant("WherePredicate", "RegionPredicate", None, p)
}
ast::WherePredicateKind::EqPredicate { .. } => {
self.record_variant("WherePredicate", "EqPredicate", None, p)
}
};record_variants!(
705 (self, p, &p.kind, None, ast, WherePredicate, WherePredicateKind),
706 [BoundPredicate, RegionPredicate, EqPredicate]
707 );
708 ast_visit::walk_where_predicate(self, p)
709 }
710
711 fn visit_fn(&mut self, fk: ast_visit::FnKind<'v>, _: &AttrVec, _: Span, _: NodeId) {
712 self.record("FnDecl", None, fk.decl());
713 ast_visit::walk_fn(self, fk)
714 }
715
716 fn visit_assoc_item(&mut self, i: &'v ast::AssocItem, ctxt: ast_visit::AssocCtxt) {
717 match i.kind {
ast::AssocItemKind::Const { .. } => {
self.record_variant("AssocItem", "Const", None, i)
}
ast::AssocItemKind::Fn { .. } => {
self.record_variant("AssocItem", "Fn", None, i)
}
ast::AssocItemKind::Type { .. } => {
self.record_variant("AssocItem", "Type", None, i)
}
ast::AssocItemKind::MacCall { .. } => {
self.record_variant("AssocItem", "MacCall", None, i)
}
ast::AssocItemKind::Delegation { .. } => {
self.record_variant("AssocItem", "Delegation", None, i)
}
ast::AssocItemKind::DelegationMac { .. } => {
self.record_variant("AssocItem", "DelegationMac", None, i)
}
};record_variants!(
718 (self, i, i.kind, None, ast, AssocItem, AssocItemKind),
719 [Const, Fn, Type, MacCall, Delegation, DelegationMac]
720 );
721 ast_visit::walk_assoc_item(self, i, ctxt);
722 }
723
724 fn visit_param_bound(&mut self, b: &'v ast::GenericBound, _ctxt: BoundKind) {
725 match b {
ast::GenericBound::Trait { .. } => {
self.record_variant("GenericBound", "Trait", None, b)
}
ast::GenericBound::Outlives { .. } => {
self.record_variant("GenericBound", "Outlives", None, b)
}
ast::GenericBound::Use { .. } => {
self.record_variant("GenericBound", "Use", None, b)
}
};record_variants!(
726 (self, b, b, None, ast, GenericBound, GenericBound),
727 [Trait, Outlives, Use]
728 );
729 ast_visit::walk_param_bound(self, b)
730 }
731
732 fn visit_field_def(&mut self, s: &'v ast::FieldDef) {
733 self.record("FieldDef", None, s);
734 ast_visit::walk_field_def(self, s)
735 }
736
737 fn visit_variant(&mut self, v: &'v ast::Variant) {
738 self.record("Variant", None, v);
739 ast_visit::walk_variant(self, v)
740 }
741
742 fn visit_path_segment(&mut self, path_segment: &'v ast::PathSegment) {
752 self.record("PathSegment", None, path_segment);
753 ast_visit::walk_path_segment(self, path_segment)
754 }
755
756 fn visit_generic_args(&mut self, g: &'v ast::GenericArgs) {
761 match g {
ast::GenericArgs::AngleBracketed { .. } => {
self.record_variant("GenericArgs", "AngleBracketed", None, g)
}
ast::GenericArgs::Parenthesized { .. } => {
self.record_variant("GenericArgs", "Parenthesized", None, g)
}
ast::GenericArgs::ParenthesizedElided { .. } => {
self.record_variant("GenericArgs", "ParenthesizedElided", None, g)
}
};record_variants!(
762 (self, g, g, None, ast, GenericArgs, GenericArgs),
763 [AngleBracketed, Parenthesized, ParenthesizedElided]
764 );
765 ast_visit::walk_generic_args(self, g)
766 }
767
768 fn visit_attribute(&mut self, attr: &'v ast::Attribute) {
769 match attr.kind {
ast::AttrKind::Normal { .. } => {
self.record_variant("Attribute", "Normal", None, attr)
}
ast::AttrKind::DocComment { .. } => {
self.record_variant("Attribute", "DocComment", None, attr)
}
};record_variants!(
770 (self, attr, attr.kind, None, ast, Attribute, AttrKind),
771 [Normal, DocComment]
772 );
773 ast_visit::walk_attribute(self, attr)
774 }
775
776 fn visit_expr_field(&mut self, f: &'v ast::ExprField) {
777 self.record("ExprField", None, f);
778 ast_visit::walk_expr_field(self, f)
779 }
780
781 fn visit_crate(&mut self, krate: &'v ast::Crate) {
782 self.record("Crate", None, krate);
783 ast_visit::walk_crate(self, krate)
784 }
785
786 fn visit_inline_asm(&mut self, asm: &'v ast::InlineAsm) {
787 self.record("InlineAsm", None, asm);
788 ast_visit::walk_inline_asm(self, asm)
789 }
790}