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 { gens, target, body } = self;
301 gens.visit_in(v);
302 target.visit_in(v);
303 body.visit_in(v);
304 }
305}
306impl Walk for ImplKind {
307 #[inline]
308 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
309 v.visit_impl_kind(self);
310 }
311 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
312 match self {
313 ImplKind::Type(t) => t.visit_in(v),
314 ImplKind::Trait { impl_trait, for_type } => {
315 impl_trait.visit_in(v);
316 for_type.visit_in(v);
317 }
318 }
319 }
320}
321impl Walk for Use {
322 #[inline]
323 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
324 v.visit_use(self);
325 }
326 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
327 let Use { absolute: _, tree } = self;
328 tree.visit_in(v);
329 }
330}
331impl Walk for UseTree {
332 #[inline]
333 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
334 v.visit_use_tree(self);
335 }
336 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
337 match self {
338 UseTree::Tree(tree) => tree.iter().for_each(|t| t.visit_in(v)),
339 UseTree::Path(part, tree) => {
340 part.visit_in(v);
341 tree.visit_in(v);
342 }
343 UseTree::Alias(from, to) => {
344 from.visit_in(v);
345 to.visit_in(v);
346 }
347 UseTree::Name(name) => name.visit_in(v),
348 UseTree::Glob => {}
349 }
350 }
351}
352impl Walk for Ty {
353 #[inline]
354 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
355 v.visit_ty(self);
356 }
357 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
358 let Ty { span, kind, gens } = self;
359 span.visit_in(v);
360 kind.visit_in(v);
361 gens.visit_in(v);
362 }
363}
364impl Walk for TyKind {
365 #[inline]
366 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
367 v.visit_ty_kind(self);
368 }
369 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
370 match self {
371 TyKind::Never => {}
372 TyKind::Infer => {}
373 TyKind::Path(value) => value.visit_in(v),
374 TyKind::Array(value) => value.visit_in(v),
375 TyKind::Slice(value) => value.visit_in(v),
376 TyKind::Tuple(value) => value.visit_in(v),
377 TyKind::Ref(value) => value.visit_in(v),
378 TyKind::Ptr(value) => value.visit_in(v),
379 TyKind::Fn(value) => value.visit_in(v),
380 }
381 }
382}
383impl Walk for TyArray {
384 #[inline]
385 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
386 v.visit_ty_array(self);
387 }
388 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
389 let TyArray { ty, count: _ } = self;
390 ty.visit_in(v);
391 }
393}
394impl Walk for TySlice {
395 #[inline]
396 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
397 v.visit_ty_slice(self);
398 }
399 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
400 let TySlice { ty } = self;
401 ty.visit_in(v);
402 }
403}
404impl Walk for TyTuple {
405 #[inline]
406 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
407 v.visit_ty_tuple(self);
408 }
409 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
410 let TyTuple { types } = self;
411 types.visit_in(v);
412 }
413}
414impl Walk for TyRef {
415 #[inline]
416 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
417 v.visit_ty_ref(self);
418 }
419 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
420 let TyRef { mutable, count: _, to } = self;
421 mutable.children(v);
422 to.children(v);
423 }
424}
425impl Walk for TyPtr {
426 #[inline]
427 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
428 v.visit_ty_ptr(self);
429 }
430 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
431 let TyPtr { to } = self;
432 to.children(v);
433 }
434}
435impl Walk for TyFn {
436 #[inline]
437 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
438 v.visit_ty_fn(self);
439 }
440 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
441 let TyFn { args, rety } = self;
442 args.visit_in(v);
443 rety.visit_in(v);
444 }
445}
446impl Walk for Path {
447 #[inline]
448 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
449 v.visit_path(self);
450 }
451 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
452 let Path { absolute: _, parts } = self;
453 parts.visit_in(v);
454 }
455}
456impl Walk for PathPart {
457 #[inline]
458 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
459 v.visit_path_part(self);
460 }
461 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
462 match self {
463 PathPart::SuperKw => {}
464 PathPart::SelfTy => {}
465 PathPart::Ident(sym) => sym.visit_in(v),
466 }
467 }
468}
469impl Walk for Stmt {
470 #[inline]
471 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
472 v.visit_stmt(self);
473 }
474 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
475 let Stmt { span, kind, semi } = self;
476 span.visit_in(v);
477 kind.visit_in(v);
478 semi.visit_in(v);
479 }
480}
481impl Walk for StmtKind {
482 #[inline]
483 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
484 v.visit_stmt_kind(self);
485 }
486 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
487 match self {
488 StmtKind::Empty => {}
489 StmtKind::Item(value) => value.visit_in(v),
490 StmtKind::Expr(value) => value.visit_in(v),
491 }
492 }
493}
494impl Walk for Semi {
495 #[inline]
496 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
497 v.visit_semi(self);
498 }
499}
500impl Walk for Expr {
501 #[inline]
502 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
503 v.visit_expr(self);
504 }
505 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
506 let Expr { span, kind } = self;
507 span.visit_in(v);
508 kind.visit_in(v);
509 }
510}
511impl Walk for ExprKind {
512 #[inline]
513 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
514 v.visit_expr_kind(self);
515 }
516 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
517 match self {
518 ExprKind::Empty => {}
519 ExprKind::Closure(value) => value.visit_in(v),
520 ExprKind::Tuple(value) => value.visit_in(v),
521 ExprKind::Structor(value) => value.visit_in(v),
522 ExprKind::Array(value) => value.visit_in(v),
523 ExprKind::ArrayRep(value) => value.visit_in(v),
524 ExprKind::AddrOf(value) => value.visit_in(v),
525 ExprKind::Quote(value) => value.visit_in(v),
526 ExprKind::Literal(value) => value.visit_in(v),
527 ExprKind::Group(value) => value.visit_in(v),
528 ExprKind::Block(value) => value.visit_in(v),
529 ExprKind::Assign(value) => value.visit_in(v),
530 ExprKind::Modify(value) => value.visit_in(v),
531 ExprKind::Binary(value) => value.visit_in(v),
532 ExprKind::Unary(value) => value.visit_in(v),
533 ExprKind::Member(value) => value.visit_in(v),
534 ExprKind::Index(value) => value.visit_in(v),
535 ExprKind::Cast(value) => value.visit_in(v),
536 ExprKind::Path(value) => value.visit_in(v),
537 ExprKind::Let(value) => value.visit_in(v),
538 ExprKind::Match(value) => value.visit_in(v),
539 ExprKind::While(value) => value.visit_in(v),
540 ExprKind::If(value) => value.visit_in(v),
541 ExprKind::For(value) => value.visit_in(v),
542 ExprKind::Break(value) => value.visit_in(v),
543 ExprKind::Return(value) => value.visit_in(v),
544 ExprKind::Continue => v.visit_continue(),
545 }
546 }
547}
548
549impl Walk for Closure {
550 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
551 v.visit_closure(self);
552 }
553
554 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
555 let Self { arg, body } = self;
556 v.visit_pattern(arg);
557 v.visit_expr(body);
558 }
559}
560
561impl Walk for Tuple {
562 #[inline]
563 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
564 v.visit_tuple(self);
565 }
566 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
567 let Tuple { exprs } = self;
568 exprs.visit_in(v);
569 }
570}
571impl Walk for Structor {
572 #[inline]
573 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
574 v.visit_structor(self);
575 }
576 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
577 let Structor { to, init } = self;
578 to.visit_in(v);
579 init.visit_in(v);
580 }
581}
582impl Walk for Fielder {
583 #[inline]
584 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
585 v.visit_fielder(self);
586 }
587 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
588 let Fielder { name, init } = self;
589 name.visit_in(v);
590 init.visit_in(v);
591 }
592}
593impl Walk for Array {
594 #[inline]
595 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
596 v.visit_array(self);
597 }
598 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
599 let Array { values } = self;
600 values.visit_in(v);
601 }
602}
603impl Walk for ArrayRep {
604 #[inline]
605 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
606 v.visit_array_rep(self);
607 }
608 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
609 let ArrayRep { value, repeat: _ } = self;
610 value.visit_in(v);
611 }
613}
614impl Walk for AddrOf {
615 #[inline]
616 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
617 v.visit_addrof(self);
618 }
619 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
620 let AddrOf { mutable, expr } = self;
621 mutable.visit_in(v);
622 expr.visit_in(v);
623 }
624}
625impl Walk for Cast {
626 #[inline]
627 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
628 v.visit_cast(self);
629 }
630 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
631 let Cast { head, ty } = self;
632 head.visit_in(v);
633 ty.visit_in(v);
634 }
635}
636impl Walk for Quote {
637 #[inline]
638 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
639 v.visit_quote(self);
640 }
641 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
642 let Quote { quote } = self;
643 quote.visit_in(v);
644 }
645}
646impl Walk for Group {
647 #[inline]
648 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
649 v.visit_group(self);
650 }
651 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
652 let Group { expr } = self;
653 expr.visit_in(v);
654 }
655}
656impl Walk for Block {
657 #[inline]
658 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
659 v.visit_block(self);
660 }
661 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
662 let Block { stmts } = self;
663 stmts.visit_in(v);
664 }
665}
666impl Walk for Assign {
667 #[inline]
668 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
669 v.visit_assign(self);
670 }
671 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
672 let Assign { parts } = self;
673 parts.visit_in(v);
674 }
675}
676impl Walk for Modify {
677 #[inline]
678 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
679 v.visit_modify(self);
680 }
681 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
682 let Modify { kind, parts } = self;
683 kind.visit_in(v);
684 parts.visit_in(v);
685 }
686}
687impl Walk for ModifyKind {
688 #[inline]
689 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
690 v.visit_modify_kind(self);
691 }
692}
693impl Walk for Binary {
694 #[inline]
695 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
696 v.visit_binary(self);
697 }
698 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
699 let Binary { kind, parts } = self;
700 kind.visit_in(v);
701 parts.visit_in(v);
702 }
703}
704impl Walk for BinaryKind {
705 #[inline]
706 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
707 v.visit_binary_kind(self);
708 }
709}
710impl Walk for Unary {
711 #[inline]
712 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
713 v.visit_unary(self);
714 }
715 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
716 let Unary { kind, tail } = self;
717 kind.visit_in(v);
718 tail.visit_in(v);
719 }
720}
721impl Walk for UnaryKind {
722 #[inline]
723 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
724 v.visit_unary_kind(self);
725 }
726}
727impl Walk for Member {
728 #[inline]
729 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
730 v.visit_member(self);
731 }
732 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
733 let Member { head, kind } = self;
734 head.visit_in(v);
735 kind.visit_in(v);
736 }
737}
738impl Walk for MemberKind {
739 #[inline]
740 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
741 v.visit_member_kind(self);
742 }
743 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
744 match self {
745 MemberKind::Call(sym, tuple) => {
746 sym.visit_in(v);
747 tuple.visit_in(v);
748 }
749 MemberKind::Struct(sym) => sym.visit_in(v),
750 MemberKind::Tuple(literal) => literal.visit_in(v),
751 }
752 }
753}
754impl Walk for Index {
755 #[inline]
756 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
757 v.visit_index(self);
758 }
759 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
760 let Index { head, indices } = self;
761 head.visit_in(v);
762 indices.visit_in(v);
763 }
764}
765impl Walk for Let {
766 #[inline]
767 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
768 v.visit_let(self);
769 }
770 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
771 let Let { mutable, name, ty, init } = self;
772 mutable.visit_in(v);
773 name.visit_in(v);
774 ty.visit_in(v);
775 init.visit_in(v);
776 }
777}
778impl Walk for Match {
779 #[inline]
780 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
781 v.visit_match(self);
782 }
783 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
784 let Match { scrutinee, arms } = self;
785 scrutinee.visit_in(v);
786 arms.visit_in(v);
787 }
788}
789impl Walk for MatchArm {
790 #[inline]
791 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
792 v.visit_match_arm(self);
793 }
794 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
795 let MatchArm(pat, expr) = self;
796 pat.visit_in(v);
797 expr.visit_in(v);
798 }
799}
800impl Walk for Pattern {
801 #[inline]
802 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
803 v.visit_pattern(self);
804 }
805 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
806 match self {
807 Pattern::Name(sym) => sym.visit_in(v),
808 Pattern::Path(path) => path.visit_in(v),
809 Pattern::Literal(literal) => literal.visit_in(v),
810 Pattern::Rest(pattern) => pattern.visit_in(v),
811 Pattern::Ref(mutability, pattern) => {
812 mutability.visit_in(v);
813 pattern.visit_in(v);
814 }
815 Pattern::RangeExc(from, to) => {
816 from.visit_in(v);
817 to.visit_in(v);
818 }
819 Pattern::RangeInc(from, to) => {
820 from.visit_in(v);
821 to.visit_in(v);
822 }
823 Pattern::Tuple(patterns) => patterns.visit_in(v),
824 Pattern::Array(patterns) => patterns.visit_in(v),
825 Pattern::Struct(path, items) => {
826 path.visit_in(v);
827 items.visit_in(v);
828 }
829 Pattern::TupleStruct(path, patterns) => {
830 path.visit_in(v);
831 patterns.visit_in(v);
832 }
833 }
834 }
835}
836impl Walk for While {
837 #[inline]
838 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
839 v.visit_while(self);
840 }
841 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
842 let While { cond, pass, fail } = self;
843 cond.visit_in(v);
844 pass.visit_in(v);
845 fail.visit_in(v);
846 }
847}
848impl Walk for If {
849 #[inline]
850 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
851 v.visit_if(self);
852 }
853 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
854 let If { cond, pass, fail } = self;
855 cond.visit_in(v);
856 pass.visit_in(v);
857 fail.visit_in(v);
858 }
859}
860impl Walk for For {
861 #[inline]
862 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
863 v.visit_for(self);
864 }
865 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
866 let For { bind, cond, pass, fail } = self;
867 cond.visit_in(v);
868 fail.visit_in(v);
869 bind.visit_in(v);
870 pass.visit_in(v);
871 }
872}
873impl Walk for Else {
874 #[inline]
875 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
876 v.visit_else(self);
877 }
878 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
879 let Else { body } = self;
880 body.visit_in(v);
881 }
882}
883impl Walk for Break {
884 #[inline]
885 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
886 v.visit_break(self);
887 }
888 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
889 let Break { body } = self;
890 body.visit_in(v);
891 }
892}
893impl Walk for Return {
894 #[inline]
895 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
896 v.visit_return(self);
897 }
898 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
899 let Return { body } = self;
900 body.visit_in(v);
901 }
902}
903
904impl<T: Walk> Walk for [T] {
907 #[inline]
908 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
909 self.iter().for_each(|value| value.visit_in(v));
910 }
911 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
912 self.iter().for_each(|value| value.children(v));
913 }
914}
915
916impl<T: Walk> Walk for Vec<T> {
917 #[inline]
918 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
919 self.as_slice().visit_in(v);
920 }
921
922 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
923 self.as_slice().children(v);
924 }
925}
926
927impl<A: Walk, B: Walk> Walk for (A, B) {
928 #[inline]
929 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
930 let (a, b) = self;
931 a.visit_in(v);
932 b.visit_in(v);
933 }
934 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
935 let (a, b) = self;
936 a.children(v);
937 b.children(v);
938 }
939}
940
941impl<T: Walk> Walk for Option<T> {
942 #[inline]
943 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
944 if let Some(value) = self.as_ref() {
945 value.visit_in(v)
946 }
947 }
948 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
949 if let Some(value) = self {
950 value.children(v)
951 }
952 }
953}
954
955impl<T: Walk> Walk for Box<T> {
956 #[inline]
957 fn visit_in<'a, V: Visit<'a>>(&'a self, v: &mut V) {
958 self.as_ref().visit_in(v)
959 }
960 fn children<'a, V: Visit<'a>>(&'a self, v: &mut V) {
961 self.as_ref().children(v)
962 }
963}