1use super::visit::Visit;
4use crate::ast::*;
5use cl_structures::span::Span;
6
7pub trait Walk {
9 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V);
11
12 #[allow(unused)]
13 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {}
15}
16
17impl Walk for Span {
18 #[inline]
19 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
20 v.visit_span(self);
21 }
22}
23impl Walk for Sym {
24 #[inline]
25 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
26 v.visit_sym(self);
27 }
28}
29impl Walk for Mutability {
30 #[inline]
31 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
32 v.visit_mutability(self);
33 }
34}
35impl Walk for Visibility {
36 #[inline]
37 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
38 v.visit_visibility(self);
39 }
40}
41impl Walk for bool {
42 #[inline]
43 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
44 v.visit_bool(self);
45 }
46}
47impl Walk for char {
48 #[inline]
49 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
50 v.visit_char(self);
51 }
52}
53impl Walk for u128 {
54 #[inline]
55 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
56 v.visit_int(self);
57 }
58}
59impl Walk for u64 {
60 #[inline]
61 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
62 v.visit_smuggled_float(self);
63 }
64}
65impl Walk for str {
66 #[inline]
67 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
68 v.visit_string(self);
69 }
70}
71impl Walk for Literal {
72 #[inline]
73 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
74 v.visit_literal(self);
75 }
76 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
77 match self {
78 Literal::Bool(value) => value.children(v),
79 Literal::Char(value) => value.children(v),
80 Literal::Int(value) => value.children(v),
81 Literal::Float(value) => value.children(v),
82 Literal::String(value) => value.children(v),
83 };
84 }
85}
86impl Walk for File {
87 #[inline]
88 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
89 v.visit_file(self);
90 }
91 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
92 let File { name: _, items } = self;
93 items.iter().for_each(|i| v.visit_item(i));
94 }
95}
96impl Walk for Attrs {
97 #[inline]
98 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
99 v.visit_attrs(self);
100 }
101 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
102 let Attrs { meta } = self;
103 meta.children(v);
104 }
105}
106impl Walk for Meta {
107 #[inline]
108 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
109 v.visit_meta(self);
110 }
111 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
112 let Meta { name, kind } = self;
113 name.visit_in(v);
114 kind.visit_in(v);
115 }
116}
117impl Walk for MetaKind {
118 #[inline]
119 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
120 v.visit_meta_kind(self);
121 }
122 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
123 match self {
124 MetaKind::Plain => {}
125 MetaKind::Equals(lit) => lit.visit_in(v),
126 MetaKind::Func(lits) => lits.visit_in(v),
127 }
128 }
129}
130impl Walk for Item {
131 #[inline]
132 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
133 v.visit_item(self);
134 }
135 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
136 let Item { span, attrs, vis, kind } = self;
137 span.visit_in(v);
138 attrs.visit_in(v);
139 vis.visit_in(v);
140 kind.visit_in(v);
141 }
142}
143impl Walk for ItemKind {
144 #[inline]
145 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
146 v.visit_item_kind(self);
147 }
148 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
149 match self {
150 ItemKind::Module(value) => value.visit_in(v),
151 ItemKind::Alias(value) => value.visit_in(v),
152 ItemKind::Enum(value) => value.visit_in(v),
153 ItemKind::Struct(value) => value.visit_in(v),
154 ItemKind::Const(value) => value.visit_in(v),
155 ItemKind::Static(value) => value.visit_in(v),
156 ItemKind::Function(value) => value.visit_in(v),
157 ItemKind::Impl(value) => value.visit_in(v),
158 ItemKind::Use(value) => value.visit_in(v),
159 }
160 }
161}
162impl Walk for Generics {
163 #[inline]
164 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
165 v.visit_generics(self);
166 }
167 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
168 let Self { vars } = self;
169 vars.visit_in(v);
170 }
171}
172impl Walk for Module {
173 #[inline]
174 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
175 v.visit_module(self);
176 }
177 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
178 let Module { name, file } = self;
179 name.visit_in(v);
180 file.visit_in(v);
181 }
182}
183impl Walk for Alias {
184 #[inline]
185 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
186 v.visit_alias(self);
187 }
188 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
189 let Alias { name, from } = self;
190 name.visit_in(v);
191 from.visit_in(v);
192 }
193}
194impl Walk for Const {
195 #[inline]
196 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
197 v.visit_const(self);
198 }
199 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
200 let Const { name, ty, init } = self;
201 name.visit_in(v);
202 ty.visit_in(v);
203 init.visit_in(v);
204 }
205}
206impl Walk for Static {
207 #[inline]
208 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
209 v.visit_static(self);
210 }
211 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
212 let Static { mutable, name, ty, init } = self;
213 mutable.visit_in(v);
214 name.visit_in(v);
215 ty.visit_in(v);
216 init.visit_in(v);
217 }
218}
219impl Walk for Function {
220 #[inline]
221 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
222 v.visit_function(self);
223 }
224 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
225 let Function { name, gens, sign, bind, body } = self;
226 name.visit_in(v);
227 gens.visit_in(v);
228 sign.visit_in(v);
229 bind.visit_in(v);
230 body.visit_in(v);
231 }
232}
233impl Walk for Struct {
234 #[inline]
235 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
236 v.visit_struct(self);
237 }
238 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
239 let Struct { name, gens, kind } = self;
240 name.visit_in(v);
241 gens.visit_in(v);
242 kind.visit_in(v);
243 }
244}
245impl Walk for StructKind {
246 #[inline]
247 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
248 v.visit_struct_kind(self);
249 }
250 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
251 match self {
252 StructKind::Empty => {}
253 StructKind::Tuple(tys) => tys.visit_in(v),
254 StructKind::Struct(ms) => ms.visit_in(v),
255 }
256 }
257}
258impl Walk for StructMember {
259 #[inline]
260 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
261 v.visit_struct_member(self);
262 }
263 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
264 let StructMember { vis, name, ty } = self;
265 vis.visit_in(v);
266 name.visit_in(v);
267 ty.visit_in(v);
268 }
269}
270impl Walk for Enum {
271 #[inline]
272 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
273 v.visit_enum(self);
274 }
275 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
276 let Enum { name, gens, variants } = self;
277 name.visit_in(v);
278 gens.visit_in(v);
279 variants.visit_in(v);
280 }
281}
282impl Walk for Variant {
283 #[inline]
284 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
285 v.visit_variant(self);
286 }
287 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
288 let Variant { name, kind, body } = self;
289 name.visit_in(v);
290 kind.visit_in(v);
291 body.visit_in(v);
292 }
293}
294impl Walk for Impl {
295 #[inline]
296 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
297 v.visit_impl(self);
298 }
299 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
300 let Impl { target, body } = self;
301 target.visit_in(v);
302 body.visit_in(v);
303 }
304}
305impl Walk for ImplKind {
306 #[inline]
307 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
308 v.visit_impl_kind(self);
309 }
310 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
311 match self {
312 ImplKind::Type(t) => t.visit_in(v),
313 ImplKind::Trait { impl_trait, for_type } => {
314 impl_trait.visit_in(v);
315 for_type.visit_in(v);
316 }
317 }
318 }
319}
320impl Walk for Use {
321 #[inline]
322 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
323 v.visit_use(self);
324 }
325 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
326 let Use { absolute: _, tree } = self;
327 tree.visit_in(v);
328 }
329}
330impl Walk for UseTree {
331 #[inline]
332 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
333 v.visit_use_tree(self);
334 }
335 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
336 match self {
337 UseTree::Tree(tree) => tree.iter().for_each(|t| t.visit_in(v)),
338 UseTree::Path(part, tree) => {
339 part.visit_in(v);
340 tree.visit_in(v);
341 }
342 UseTree::Alias(from, to) => {
343 from.visit_in(v);
344 to.visit_in(v);
345 }
346 UseTree::Name(name) => name.visit_in(v),
347 UseTree::Glob => {}
348 }
349 }
350}
351impl Walk for Ty {
352 #[inline]
353 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
354 v.visit_ty(self);
355 }
356 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
357 let Ty { span, kind } = self;
358 span.visit_in(v);
359 kind.visit_in(v);
360 }
361}
362impl Walk for TyKind {
363 #[inline]
364 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
365 v.visit_ty_kind(self);
366 }
367 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
368 match self {
369 TyKind::Never => {}
370 TyKind::Empty => {}
371 TyKind::Infer => {}
372 TyKind::Path(value) => value.visit_in(v),
373 TyKind::Array(value) => value.visit_in(v),
374 TyKind::Slice(value) => value.visit_in(v),
375 TyKind::Tuple(value) => value.visit_in(v),
376 TyKind::Ref(value) => value.visit_in(v),
377 TyKind::Fn(value) => value.visit_in(v),
378 }
379 }
380}
381impl Walk for TyArray {
382 #[inline]
383 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
384 v.visit_ty_array(self);
385 }
386 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
387 let TyArray { ty, count: _ } = self;
388 ty.visit_in(v);
389 }
391}
392impl Walk for TySlice {
393 #[inline]
394 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
395 v.visit_ty_slice(self);
396 }
397 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
398 let TySlice { ty } = self;
399 ty.visit_in(v);
400 }
401}
402impl Walk for TyTuple {
403 #[inline]
404 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
405 v.visit_ty_tuple(self);
406 }
407 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
408 let TyTuple { types } = self;
409 types.visit_in(v);
410 }
411}
412impl Walk for TyRef {
413 #[inline]
414 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
415 v.visit_ty_ref(self);
416 }
417 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
418 let TyRef { mutable, count: _, to } = self;
419 mutable.children(v);
420 to.children(v);
421 }
422}
423impl Walk for TyFn {
424 #[inline]
425 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
426 v.visit_ty_fn(self);
427 }
428 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
429 let TyFn { args, rety } = self;
430 args.visit_in(v);
431 rety.visit_in(v);
432 }
433}
434impl Walk for Path {
435 #[inline]
436 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
437 v.visit_path(self);
438 }
439 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
440 let Path { absolute: _, parts } = self;
441 parts.visit_in(v);
442 }
443}
444impl Walk for PathPart {
445 #[inline]
446 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
447 v.visit_path_part(self);
448 }
449 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
450 match self {
451 PathPart::SuperKw => {}
452 PathPart::SelfTy => {}
453 PathPart::Ident(sym) => sym.visit_in(v),
454 }
455 }
456}
457impl Walk for Stmt {
458 #[inline]
459 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
460 v.visit_stmt(self);
461 }
462 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
463 let Stmt { span, kind, semi } = self;
464 span.visit_in(v);
465 kind.visit_in(v);
466 semi.visit_in(v);
467 }
468}
469impl Walk for StmtKind {
470 #[inline]
471 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
472 v.visit_stmt_kind(self);
473 }
474 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
475 match self {
476 StmtKind::Empty => {}
477 StmtKind::Item(value) => value.visit_in(v),
478 StmtKind::Expr(value) => value.visit_in(v),
479 }
480 }
481}
482impl Walk for Semi {
483 #[inline]
484 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
485 v.visit_semi(self);
486 }
487}
488impl Walk for Expr {
489 #[inline]
490 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
491 v.visit_expr(self);
492 }
493 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
494 let Expr { span, kind } = self;
495 span.visit_in(v);
496 kind.visit_in(v);
497 }
498}
499impl Walk for ExprKind {
500 #[inline]
501 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
502 v.visit_expr_kind(self);
503 }
504 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
505 match self {
506 ExprKind::Empty => {}
507 ExprKind::Closure(value) => value.visit_in(v),
508 ExprKind::Tuple(value) => value.visit_in(v),
509 ExprKind::Structor(value) => value.visit_in(v),
510 ExprKind::Array(value) => value.visit_in(v),
511 ExprKind::ArrayRep(value) => value.visit_in(v),
512 ExprKind::AddrOf(value) => value.visit_in(v),
513 ExprKind::Quote(value) => value.visit_in(v),
514 ExprKind::Literal(value) => value.visit_in(v),
515 ExprKind::Group(value) => value.visit_in(v),
516 ExprKind::Block(value) => value.visit_in(v),
517 ExprKind::Assign(value) => value.visit_in(v),
518 ExprKind::Modify(value) => value.visit_in(v),
519 ExprKind::Binary(value) => value.visit_in(v),
520 ExprKind::Unary(value) => value.visit_in(v),
521 ExprKind::Member(value) => value.visit_in(v),
522 ExprKind::Index(value) => value.visit_in(v),
523 ExprKind::Cast(value) => value.visit_in(v),
524 ExprKind::Path(value) => value.visit_in(v),
525 ExprKind::Let(value) => value.visit_in(v),
526 ExprKind::Match(value) => value.visit_in(v),
527 ExprKind::While(value) => value.visit_in(v),
528 ExprKind::If(value) => value.visit_in(v),
529 ExprKind::For(value) => value.visit_in(v),
530 ExprKind::Break(value) => value.visit_in(v),
531 ExprKind::Return(value) => value.visit_in(v),
532 ExprKind::Continue => v.visit_continue(),
533 }
534 }
535}
536
537impl Walk for Closure {
538 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
539 v.visit_closure(self);
540 }
541
542 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
543 let Self { arg, body } = self;
544 v.visit_pattern(arg);
545 v.visit_expr(body);
546 }
547}
548
549impl Walk for Tuple {
550 #[inline]
551 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
552 v.visit_tuple(self);
553 }
554 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
555 let Tuple { exprs } = self;
556 exprs.visit_in(v);
557 }
558}
559impl Walk for Structor {
560 #[inline]
561 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
562 v.visit_structor(self);
563 }
564 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
565 let Structor { to, init } = self;
566 to.visit_in(v);
567 init.visit_in(v);
568 }
569}
570impl Walk for Fielder {
571 #[inline]
572 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
573 v.visit_fielder(self);
574 }
575 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
576 let Fielder { name, init } = self;
577 name.visit_in(v);
578 init.visit_in(v);
579 }
580}
581impl Walk for Array {
582 #[inline]
583 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
584 v.visit_array(self);
585 }
586 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
587 let Array { values } = self;
588 values.visit_in(v);
589 }
590}
591impl Walk for ArrayRep {
592 #[inline]
593 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
594 v.visit_array_rep(self);
595 }
596 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
597 let ArrayRep { value, repeat: _ } = self;
598 value.visit_in(v);
599 }
601}
602impl Walk for AddrOf {
603 #[inline]
604 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
605 v.visit_addrof(self);
606 }
607 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
608 let AddrOf { mutable, expr } = self;
609 mutable.visit_in(v);
610 expr.visit_in(v);
611 }
612}
613impl Walk for Cast {
614 #[inline]
615 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
616 v.visit_cast(self);
617 }
618 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
619 let Cast { head, ty } = self;
620 head.visit_in(v);
621 ty.visit_in(v);
622 }
623}
624impl Walk for Quote {
625 #[inline]
626 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
627 v.visit_quote(self);
628 }
629 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
630 let Quote { quote } = self;
631 quote.visit_in(v);
632 }
633}
634impl Walk for Group {
635 #[inline]
636 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
637 v.visit_group(self);
638 }
639 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
640 let Group { expr } = self;
641 expr.visit_in(v);
642 }
643}
644impl Walk for Block {
645 #[inline]
646 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
647 v.visit_block(self);
648 }
649 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
650 let Block { stmts } = self;
651 stmts.visit_in(v);
652 }
653}
654impl Walk for Assign {
655 #[inline]
656 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
657 v.visit_assign(self);
658 }
659 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
660 let Assign { parts } = self;
661 parts.visit_in(v);
662 }
663}
664impl Walk for Modify {
665 #[inline]
666 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
667 v.visit_modify(self);
668 }
669 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
670 let Modify { kind, parts } = self;
671 kind.visit_in(v);
672 parts.visit_in(v);
673 }
674}
675impl Walk for ModifyKind {
676 #[inline]
677 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
678 v.visit_modify_kind(self);
679 }
680}
681impl Walk for Binary {
682 #[inline]
683 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
684 v.visit_binary(self);
685 }
686 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
687 let Binary { kind, parts } = self;
688 kind.visit_in(v);
689 parts.visit_in(v);
690 }
691}
692impl Walk for BinaryKind {
693 #[inline]
694 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
695 v.visit_binary_kind(self);
696 }
697}
698impl Walk for Unary {
699 #[inline]
700 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
701 v.visit_unary(self);
702 }
703 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
704 let Unary { kind, tail } = self;
705 kind.visit_in(v);
706 tail.visit_in(v);
707 }
708}
709impl Walk for UnaryKind {
710 #[inline]
711 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
712 v.visit_unary_kind(self);
713 }
714}
715impl Walk for Member {
716 #[inline]
717 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
718 v.visit_member(self);
719 }
720 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
721 let Member { head, kind } = self;
722 head.visit_in(v);
723 kind.visit_in(v);
724 }
725}
726impl Walk for MemberKind {
727 #[inline]
728 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
729 v.visit_member_kind(self);
730 }
731 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
732 match self {
733 MemberKind::Call(sym, tuple) => {
734 sym.visit_in(v);
735 tuple.visit_in(v);
736 }
737 MemberKind::Struct(sym) => sym.visit_in(v),
738 MemberKind::Tuple(literal) => literal.visit_in(v),
739 }
740 }
741}
742impl Walk for Index {
743 #[inline]
744 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
745 v.visit_index(self);
746 }
747 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
748 let Index { head, indices } = self;
749 head.visit_in(v);
750 indices.visit_in(v);
751 }
752}
753impl Walk for Let {
754 #[inline]
755 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
756 v.visit_let(self);
757 }
758 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
759 let Let { mutable, name, ty, init } = self;
760 mutable.visit_in(v);
761 name.visit_in(v);
762 ty.visit_in(v);
763 init.visit_in(v);
764 }
765}
766impl Walk for Match {
767 #[inline]
768 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
769 v.visit_match(self);
770 }
771 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
772 let Match { scrutinee, arms } = self;
773 scrutinee.visit_in(v);
774 arms.visit_in(v);
775 }
776}
777impl Walk for MatchArm {
778 #[inline]
779 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
780 v.visit_match_arm(self);
781 }
782 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
783 let MatchArm(pat, expr) = self;
784 pat.visit_in(v);
785 expr.visit_in(v);
786 }
787}
788impl Walk for Pattern {
789 #[inline]
790 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
791 v.visit_pattern(self);
792 }
793 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
794 match self {
795 Pattern::Name(sym) => sym.visit_in(v),
796 Pattern::Path(path) => path.visit_in(v),
797 Pattern::Literal(literal) => literal.visit_in(v),
798 Pattern::Rest(pattern) => pattern.visit_in(v),
799 Pattern::Ref(mutability, pattern) => {
800 mutability.visit_in(v);
801 pattern.visit_in(v);
802 }
803 Pattern::RangeExc(from, to) => {
804 from.visit_in(v);
805 to.visit_in(v);
806 }
807 Pattern::RangeInc(from, to) => {
808 from.visit_in(v);
809 to.visit_in(v);
810 }
811 Pattern::Tuple(patterns) => patterns.visit_in(v),
812 Pattern::Array(patterns) => patterns.visit_in(v),
813 Pattern::Struct(path, items) => {
814 path.visit_in(v);
815 items.visit_in(v);
816 }
817 Pattern::TupleStruct(path, patterns) => {
818 path.visit_in(v);
819 patterns.visit_in(v);
820 }
821 }
822 }
823}
824impl Walk for While {
825 #[inline]
826 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
827 v.visit_while(self);
828 }
829 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
830 let While { cond, pass, fail } = self;
831 cond.visit_in(v);
832 pass.visit_in(v);
833 fail.visit_in(v);
834 }
835}
836impl Walk for If {
837 #[inline]
838 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
839 v.visit_if(self);
840 }
841 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
842 let If { cond, pass, fail } = self;
843 cond.visit_in(v);
844 pass.visit_in(v);
845 fail.visit_in(v);
846 }
847}
848impl Walk for For {
849 #[inline]
850 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
851 v.visit_for(self);
852 }
853 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
854 let For { bind, cond, pass, fail } = self;
855 bind.visit_in(v);
856 cond.visit_in(v);
857 pass.visit_in(v);
858 fail.visit_in(v);
859 }
860}
861impl Walk for Else {
862 #[inline]
863 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
864 v.visit_else(self);
865 }
866 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
867 let Else { body } = self;
868 body.visit_in(v);
869 }
870}
871impl Walk for Break {
872 #[inline]
873 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
874 v.visit_break(self);
875 }
876 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
877 let Break { body } = self;
878 body.visit_in(v);
879 }
880}
881impl Walk for Return {
882 #[inline]
883 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
884 v.visit_return(self);
885 }
886 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
887 let Return { body } = self;
888 body.visit_in(v);
889 }
890}
891
892impl<T: Walk> Walk for [T] {
895 #[inline]
896 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
897 self.iter().for_each(|value| value.visit_in(v));
898 }
899 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
900 self.iter().for_each(|value| value.children(v));
901 }
902}
903
904impl<T: Walk> Walk for Vec<T> {
905 #[inline]
906 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
907 self.as_slice().visit_in(v);
908 }
909
910 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
911 self.as_slice().children(v);
912 }
913}
914
915impl<A: Walk, B: Walk> Walk for (A, B) {
916 #[inline]
917 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
918 let (a, b) = self;
919 a.visit_in(v);
920 b.visit_in(v);
921 }
922 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
923 let (a, b) = self;
924 a.children(v);
925 b.children(v);
926 }
927}
928
929impl<T: Walk> Walk for Option<T> {
930 #[inline]
931 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
932 if let Some(value) = self.as_ref() {
933 value.visit_in(v)
934 }
935 }
936 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
937 if let Some(value) = self {
938 value.children(v)
939 }
940 }
941}
942
943impl<T: Walk> Walk for Box<T> {
944 #[inline]
945 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
946 self.as_ref().visit_in(v)
947 }
948 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
949 self.as_ref().children(v)
950 }
951}