lib_ruby_parser_ast/traverse/finder/
finder_gen.rs

1// This file is autogenerated by codegen/finder.liquid
2
3use crate::traverse::finder::{Finder, PatternItem};
4use crate::traverse::visitor::Visitor;
5use crate::nodes::*;
6use crate::Node;
7
8impl Visitor for Finder {
9    
10    fn on_alias(&mut self, node: &Alias) {
11        match self.pattern.unshift() {
12            Some(PatternItem::To) => { self.visit(&node.to); }
13
14            Some(PatternItem::From) => { self.visit(&node.from); }
15
16            // skip keyword_l
17
18            // skip expression_l
19
20            
21
22            None => {
23                // end of the search chain, match
24                self.result = Some(Node::Alias(node.clone()));
25            }
26            Some(_) => {
27                // end of the search chain, no match
28            }
29        }
30    }
31
32    fn on_and(&mut self, node: &And) {
33        match self.pattern.unshift() {
34            Some(PatternItem::Lhs) => { self.visit(&node.lhs); }
35
36            Some(PatternItem::Rhs) => { self.visit(&node.rhs); }
37
38            // skip operator_l
39
40            // skip expression_l
41
42            
43
44            None => {
45                // end of the search chain, match
46                self.result = Some(Node::And(node.clone()));
47            }
48            Some(_) => {
49                // end of the search chain, no match
50            }
51        }
52    }
53
54    fn on_and_asgn(&mut self, node: &AndAsgn) {
55        match self.pattern.unshift() {
56            Some(PatternItem::Recv) => { self.visit(&node.recv); }
57
58            Some(PatternItem::Value) => { self.visit(&node.value); }
59
60            // skip operator_l
61
62            // skip expression_l
63
64            
65
66            None => {
67                // end of the search chain, match
68                self.result = Some(Node::AndAsgn(node.clone()));
69            }
70            Some(_) => {
71                // end of the search chain, no match
72            }
73        }
74    }
75
76    fn on_arg(&mut self, node: &Arg) {
77        match self.pattern.unshift() {
78            // skip name
79
80            // skip expression_l
81
82            
83
84            None => {
85                // end of the search chain, match
86                self.result = Some(Node::Arg(node.clone()));
87            }
88            Some(_) => {
89                // end of the search chain, no match
90            }
91        }
92    }
93
94    fn on_args(&mut self, node: &Args) {
95        match self.pattern.unshift() {
96            Some(PatternItem::Arglist) => { visit_node_list(self, &node.args) }
97
98            // skip expression_l
99
100            // skip begin_l
101
102            // skip end_l
103
104            
105
106            None => {
107                // end of the search chain, match
108                self.result = Some(Node::Args(node.clone()));
109            }
110            Some(_) => {
111                // end of the search chain, no match
112            }
113        }
114    }
115
116    fn on_array(&mut self, node: &Array) {
117        match self.pattern.unshift() {
118            Some(PatternItem::Elements) => { visit_node_list(self, &node.elements) }
119
120            // skip begin_l
121
122            // skip end_l
123
124            // skip expression_l
125
126            
127
128            None => {
129                // end of the search chain, match
130                self.result = Some(Node::Array(node.clone()));
131            }
132            Some(_) => {
133                // end of the search chain, no match
134            }
135        }
136    }
137
138    fn on_array_pattern(&mut self, node: &ArrayPattern) {
139        match self.pattern.unshift() {
140            Some(PatternItem::Elements) => { visit_node_list(self, &node.elements) }
141
142            // skip begin_l
143
144            // skip end_l
145
146            // skip expression_l
147
148            
149
150            None => {
151                // end of the search chain, match
152                self.result = Some(Node::ArrayPattern(node.clone()));
153            }
154            Some(_) => {
155                // end of the search chain, no match
156            }
157        }
158    }
159
160    fn on_array_pattern_with_tail(&mut self, node: &ArrayPatternWithTail) {
161        match self.pattern.unshift() {
162            Some(PatternItem::Elements) => { visit_node_list(self, &node.elements) }
163
164            // skip begin_l
165
166            // skip end_l
167
168            // skip expression_l
169
170            
171
172            None => {
173                // end of the search chain, match
174                self.result = Some(Node::ArrayPatternWithTail(node.clone()));
175            }
176            Some(_) => {
177                // end of the search chain, no match
178            }
179        }
180    }
181
182    fn on_back_ref(&mut self, node: &BackRef) {
183        match self.pattern.unshift() {
184            // skip name
185
186            // skip expression_l
187
188            
189
190            None => {
191                // end of the search chain, match
192                self.result = Some(Node::BackRef(node.clone()));
193            }
194            Some(_) => {
195                // end of the search chain, no match
196            }
197        }
198    }
199
200    fn on_begin(&mut self, node: &Begin) {
201        match self.pattern.unshift() {
202            Some(PatternItem::Stmts) => { visit_node_list(self, &node.statements) }
203
204            // skip begin_l
205
206            // skip end_l
207
208            // skip expression_l
209
210            
211
212            None => {
213                // end of the search chain, match
214                self.result = Some(Node::Begin(node.clone()));
215            }
216            Some(_) => {
217                // end of the search chain, no match
218            }
219        }
220    }
221
222    fn on_block(&mut self, node: &Block) {
223        match self.pattern.unshift() {
224            Some(PatternItem::MethodCall) => { self.visit(&node.call); }
225
226            Some(PatternItem::Args) => { if let Some(inner) = node.args.as_ref() { self.visit(inner); } }
227
228            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
229
230            // skip begin_l
231
232            // skip end_l
233
234            // skip expression_l
235
236            
237
238            None => {
239                // end of the search chain, match
240                self.result = Some(Node::Block(node.clone()));
241            }
242            Some(_) => {
243                // end of the search chain, no match
244            }
245        }
246    }
247
248    fn on_blockarg(&mut self, node: &Blockarg) {
249        match self.pattern.unshift() {
250            // skip name
251
252            // skip operator_l
253
254            // skip name_l
255
256            // skip expression_l
257
258            
259
260            None => {
261                // end of the search chain, match
262                self.result = Some(Node::Blockarg(node.clone()));
263            }
264            Some(_) => {
265                // end of the search chain, no match
266            }
267        }
268    }
269
270    fn on_block_pass(&mut self, node: &BlockPass) {
271        match self.pattern.unshift() {
272            Some(PatternItem::Value) => { if let Some(inner) = node.value.as_ref() { self.visit(inner); } }
273
274            // skip operator_l
275
276            // skip expression_l
277
278            
279
280            None => {
281                // end of the search chain, match
282                self.result = Some(Node::BlockPass(node.clone()));
283            }
284            Some(_) => {
285                // end of the search chain, no match
286            }
287        }
288    }
289
290    fn on_break(&mut self, node: &Break) {
291        match self.pattern.unshift() {
292            Some(PatternItem::Args) => { visit_node_list(self, &node.args) }
293
294            // skip keyword_l
295
296            // skip expression_l
297
298            
299
300            None => {
301                // end of the search chain, match
302                self.result = Some(Node::Break(node.clone()));
303            }
304            Some(_) => {
305                // end of the search chain, no match
306            }
307        }
308    }
309
310    fn on_case(&mut self, node: &Case) {
311        match self.pattern.unshift() {
312            Some(PatternItem::Expr) => { if let Some(inner) = node.expr.as_ref() { self.visit(inner); } }
313
314            Some(PatternItem::WhenBodies) => { visit_node_list(self, &node.when_bodies) }
315
316            Some(PatternItem::ElseBody) => { if let Some(inner) = node.else_body.as_ref() { self.visit(inner); } }
317
318            // skip keyword_l
319
320            // skip else_l
321
322            // skip end_l
323
324            // skip expression_l
325
326            
327
328            None => {
329                // end of the search chain, match
330                self.result = Some(Node::Case(node.clone()));
331            }
332            Some(_) => {
333                // end of the search chain, no match
334            }
335        }
336    }
337
338    fn on_case_match(&mut self, node: &CaseMatch) {
339        match self.pattern.unshift() {
340            Some(PatternItem::Expr) => { self.visit(&node.expr); }
341
342            Some(PatternItem::InBodies) => { visit_node_list(self, &node.in_bodies) }
343
344            Some(PatternItem::ElseBody) => { if let Some(inner) = node.else_body.as_ref() { self.visit(inner); } }
345
346            // skip keyword_l
347
348            // skip else_l
349
350            // skip end_l
351
352            // skip expression_l
353
354            
355
356            None => {
357                // end of the search chain, match
358                self.result = Some(Node::CaseMatch(node.clone()));
359            }
360            Some(_) => {
361                // end of the search chain, no match
362            }
363        }
364    }
365
366    fn on_casgn(&mut self, node: &Casgn) {
367        match self.pattern.unshift() {
368            Some(PatternItem::Scope) => { if let Some(inner) = node.scope.as_ref() { self.visit(inner); } }
369
370            // skip name
371
372            Some(PatternItem::Value) => { if let Some(inner) = node.value.as_ref() { self.visit(inner); } }
373
374            // skip double_colon_l
375
376            // skip name_l
377
378            // skip operator_l
379
380            // skip expression_l
381
382            
383
384            None => {
385                // end of the search chain, match
386                self.result = Some(Node::Casgn(node.clone()));
387            }
388            Some(_) => {
389                // end of the search chain, no match
390            }
391        }
392    }
393
394    fn on_cbase(&mut self, node: &Cbase) {
395        match self.pattern.unshift() {
396            // skip expression_l
397
398            
399
400            None => {
401                // end of the search chain, match
402                self.result = Some(Node::Cbase(node.clone()));
403            }
404            Some(_) => {
405                // end of the search chain, no match
406            }
407        }
408    }
409
410    fn on_class(&mut self, node: &Class) {
411        match self.pattern.unshift() {
412            Some(PatternItem::Name) => { self.visit(&node.name); }
413
414            Some(PatternItem::Superclass) => { if let Some(inner) = node.superclass.as_ref() { self.visit(inner); } }
415
416            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
417
418            // skip keyword_l
419
420            // skip operator_l
421
422            // skip end_l
423
424            // skip expression_l
425
426            
427
428            None => {
429                // end of the search chain, match
430                self.result = Some(Node::Class(node.clone()));
431            }
432            Some(_) => {
433                // end of the search chain, no match
434            }
435        }
436    }
437
438    fn on_complex(&mut self, node: &Complex) {
439        match self.pattern.unshift() {
440            // skip value
441
442            // skip operator_l
443
444            // skip expression_l
445
446            
447
448            None => {
449                // end of the search chain, match
450                self.result = Some(Node::Complex(node.clone()));
451            }
452            Some(_) => {
453                // end of the search chain, no match
454            }
455        }
456    }
457
458    fn on_const(&mut self, node: &Const) {
459        match self.pattern.unshift() {
460            Some(PatternItem::Scope) => { if let Some(inner) = node.scope.as_ref() { self.visit(inner); } }
461
462            // skip name
463
464            // skip double_colon_l
465
466            // skip name_l
467
468            // skip expression_l
469
470            
471
472            None => {
473                // end of the search chain, match
474                self.result = Some(Node::Const(node.clone()));
475            }
476            Some(_) => {
477                // end of the search chain, no match
478            }
479        }
480    }
481
482    fn on_const_pattern(&mut self, node: &ConstPattern) {
483        match self.pattern.unshift() {
484            Some(PatternItem::Const) => { self.visit(&node.const_); }
485
486            Some(PatternItem::Pattern) => { self.visit(&node.pattern); }
487
488            // skip begin_l
489
490            // skip end_l
491
492            // skip expression_l
493
494            
495
496            None => {
497                // end of the search chain, match
498                self.result = Some(Node::ConstPattern(node.clone()));
499            }
500            Some(_) => {
501                // end of the search chain, no match
502            }
503        }
504    }
505
506    fn on_c_send(&mut self, node: &CSend) {
507        match self.pattern.unshift() {
508            Some(PatternItem::Recv) => { self.visit(&node.recv); }
509
510            // skip method_name
511
512            Some(PatternItem::Args) => { visit_node_list(self, &node.args) }
513
514            // skip dot_l
515
516            // skip selector_l
517
518            // skip begin_l
519
520            // skip end_l
521
522            // skip operator_l
523
524            // skip expression_l
525
526            
527
528            None => {
529                // end of the search chain, match
530                self.result = Some(Node::CSend(node.clone()));
531            }
532            Some(_) => {
533                // end of the search chain, no match
534            }
535        }
536    }
537
538    fn on_cvar(&mut self, node: &Cvar) {
539        match self.pattern.unshift() {
540            // skip name
541
542            // skip expression_l
543
544            
545
546            None => {
547                // end of the search chain, match
548                self.result = Some(Node::Cvar(node.clone()));
549            }
550            Some(_) => {
551                // end of the search chain, no match
552            }
553        }
554    }
555
556    fn on_cvasgn(&mut self, node: &Cvasgn) {
557        match self.pattern.unshift() {
558            // skip name
559
560            Some(PatternItem::Value) => { if let Some(inner) = node.value.as_ref() { self.visit(inner); } }
561
562            // skip name_l
563
564            // skip operator_l
565
566            // skip expression_l
567
568            
569
570            None => {
571                // end of the search chain, match
572                self.result = Some(Node::Cvasgn(node.clone()));
573            }
574            Some(_) => {
575                // end of the search chain, no match
576            }
577        }
578    }
579
580    fn on_def(&mut self, node: &Def) {
581        match self.pattern.unshift() {
582            // skip name
583
584            Some(PatternItem::Args) => { if let Some(inner) = node.args.as_ref() { self.visit(inner); } }
585
586            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
587
588            // skip keyword_l
589
590            // skip name_l
591
592            // skip end_l
593
594            // skip assignment_l
595
596            // skip expression_l
597
598            
599
600            None => {
601                // end of the search chain, match
602                self.result = Some(Node::Def(node.clone()));
603            }
604            Some(_) => {
605                // end of the search chain, no match
606            }
607        }
608    }
609
610    fn on_defined(&mut self, node: &Defined) {
611        match self.pattern.unshift() {
612            Some(PatternItem::Value) => { self.visit(&node.value); }
613
614            // skip keyword_l
615
616            // skip begin_l
617
618            // skip end_l
619
620            // skip expression_l
621
622            
623
624            None => {
625                // end of the search chain, match
626                self.result = Some(Node::Defined(node.clone()));
627            }
628            Some(_) => {
629                // end of the search chain, no match
630            }
631        }
632    }
633
634    fn on_defs(&mut self, node: &Defs) {
635        match self.pattern.unshift() {
636            Some(PatternItem::Definee) => { self.visit(&node.definee); }
637
638            // skip name
639
640            Some(PatternItem::Args) => { if let Some(inner) = node.args.as_ref() { self.visit(inner); } }
641
642            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
643
644            // skip keyword_l
645
646            // skip operator_l
647
648            // skip name_l
649
650            // skip assignment_l
651
652            // skip end_l
653
654            // skip expression_l
655
656            
657
658            None => {
659                // end of the search chain, match
660                self.result = Some(Node::Defs(node.clone()));
661            }
662            Some(_) => {
663                // end of the search chain, no match
664            }
665        }
666    }
667
668    fn on_dstr(&mut self, node: &Dstr) {
669        match self.pattern.unshift() {
670            Some(PatternItem::Parts) => { visit_node_list(self, &node.parts) }
671
672            // skip begin_l
673
674            // skip end_l
675
676            // skip expression_l
677
678            
679
680            None => {
681                // end of the search chain, match
682                self.result = Some(Node::Dstr(node.clone()));
683            }
684            Some(_) => {
685                // end of the search chain, no match
686            }
687        }
688    }
689
690    fn on_dsym(&mut self, node: &Dsym) {
691        match self.pattern.unshift() {
692            Some(PatternItem::Parts) => { visit_node_list(self, &node.parts) }
693
694            // skip begin_l
695
696            // skip end_l
697
698            // skip expression_l
699
700            
701
702            None => {
703                // end of the search chain, match
704                self.result = Some(Node::Dsym(node.clone()));
705            }
706            Some(_) => {
707                // end of the search chain, no match
708            }
709        }
710    }
711
712    fn on_e_flip_flop(&mut self, node: &EFlipFlop) {
713        match self.pattern.unshift() {
714            Some(PatternItem::Left) => { if let Some(inner) = node.left.as_ref() { self.visit(inner); } }
715
716            Some(PatternItem::Right) => { if let Some(inner) = node.right.as_ref() { self.visit(inner); } }
717
718            // skip operator_l
719
720            // skip expression_l
721
722            
723
724            None => {
725                // end of the search chain, match
726                self.result = Some(Node::EFlipFlop(node.clone()));
727            }
728            Some(_) => {
729                // end of the search chain, no match
730            }
731        }
732    }
733
734    fn on_empty_else(&mut self, node: &EmptyElse) {
735        match self.pattern.unshift() {
736            // skip expression_l
737
738            
739
740            None => {
741                // end of the search chain, match
742                self.result = Some(Node::EmptyElse(node.clone()));
743            }
744            Some(_) => {
745                // end of the search chain, no match
746            }
747        }
748    }
749
750    fn on_encoding(&mut self, node: &Encoding) {
751        match self.pattern.unshift() {
752            // skip expression_l
753
754            
755
756            None => {
757                // end of the search chain, match
758                self.result = Some(Node::Encoding(node.clone()));
759            }
760            Some(_) => {
761                // end of the search chain, no match
762            }
763        }
764    }
765
766    fn on_ensure(&mut self, node: &Ensure) {
767        match self.pattern.unshift() {
768            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
769
770            Some(PatternItem::Ensure) => { if let Some(inner) = node.ensure.as_ref() { self.visit(inner); } }
771
772            // skip keyword_l
773
774            // skip expression_l
775
776            
777
778            None => {
779                // end of the search chain, match
780                self.result = Some(Node::Ensure(node.clone()));
781            }
782            Some(_) => {
783                // end of the search chain, no match
784            }
785        }
786    }
787
788    fn on_erange(&mut self, node: &Erange) {
789        match self.pattern.unshift() {
790            Some(PatternItem::Left) => { if let Some(inner) = node.left.as_ref() { self.visit(inner); } }
791
792            Some(PatternItem::Right) => { if let Some(inner) = node.right.as_ref() { self.visit(inner); } }
793
794            // skip operator_l
795
796            // skip expression_l
797
798            
799
800            None => {
801                // end of the search chain, match
802                self.result = Some(Node::Erange(node.clone()));
803            }
804            Some(_) => {
805                // end of the search chain, no match
806            }
807        }
808    }
809
810    fn on_false(&mut self, node: &False) {
811        match self.pattern.unshift() {
812            // skip expression_l
813
814            
815
816            None => {
817                // end of the search chain, match
818                self.result = Some(Node::False(node.clone()));
819            }
820            Some(_) => {
821                // end of the search chain, no match
822            }
823        }
824    }
825
826    fn on_file(&mut self, node: &File) {
827        match self.pattern.unshift() {
828            // skip expression_l
829
830            
831
832            None => {
833                // end of the search chain, match
834                self.result = Some(Node::File(node.clone()));
835            }
836            Some(_) => {
837                // end of the search chain, no match
838            }
839        }
840    }
841
842    fn on_find_pattern(&mut self, node: &FindPattern) {
843        match self.pattern.unshift() {
844            Some(PatternItem::Elements) => { visit_node_list(self, &node.elements) }
845
846            // skip begin_l
847
848            // skip end_l
849
850            // skip expression_l
851
852            
853
854            None => {
855                // end of the search chain, match
856                self.result = Some(Node::FindPattern(node.clone()));
857            }
858            Some(_) => {
859                // end of the search chain, no match
860            }
861        }
862    }
863
864    fn on_float(&mut self, node: &Float) {
865        match self.pattern.unshift() {
866            // skip value
867
868            // skip operator_l
869
870            // skip expression_l
871
872            
873
874            None => {
875                // end of the search chain, match
876                self.result = Some(Node::Float(node.clone()));
877            }
878            Some(_) => {
879                // end of the search chain, no match
880            }
881        }
882    }
883
884    fn on_for(&mut self, node: &For) {
885        match self.pattern.unshift() {
886            Some(PatternItem::Iterator) => { self.visit(&node.iterator); }
887
888            Some(PatternItem::Iteratee) => { self.visit(&node.iteratee); }
889
890            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
891
892            // skip keyword_l
893
894            // skip operator_l
895
896            // skip begin_l
897
898            // skip end_l
899
900            // skip expression_l
901
902            
903
904            None => {
905                // end of the search chain, match
906                self.result = Some(Node::For(node.clone()));
907            }
908            Some(_) => {
909                // end of the search chain, no match
910            }
911        }
912    }
913
914    fn on_forward_arg(&mut self, node: &ForwardArg) {
915        match self.pattern.unshift() {
916            // skip expression_l
917
918            
919
920            None => {
921                // end of the search chain, match
922                self.result = Some(Node::ForwardArg(node.clone()));
923            }
924            Some(_) => {
925                // end of the search chain, no match
926            }
927        }
928    }
929
930    fn on_forwarded_args(&mut self, node: &ForwardedArgs) {
931        match self.pattern.unshift() {
932            // skip expression_l
933
934            
935
936            None => {
937                // end of the search chain, match
938                self.result = Some(Node::ForwardedArgs(node.clone()));
939            }
940            Some(_) => {
941                // end of the search chain, no match
942            }
943        }
944    }
945
946    fn on_gvar(&mut self, node: &Gvar) {
947        match self.pattern.unshift() {
948            // skip name
949
950            // skip expression_l
951
952            
953
954            None => {
955                // end of the search chain, match
956                self.result = Some(Node::Gvar(node.clone()));
957            }
958            Some(_) => {
959                // end of the search chain, no match
960            }
961        }
962    }
963
964    fn on_gvasgn(&mut self, node: &Gvasgn) {
965        match self.pattern.unshift() {
966            // skip name
967
968            Some(PatternItem::Value) => { if let Some(inner) = node.value.as_ref() { self.visit(inner); } }
969
970            // skip name_l
971
972            // skip operator_l
973
974            // skip expression_l
975
976            
977
978            None => {
979                // end of the search chain, match
980                self.result = Some(Node::Gvasgn(node.clone()));
981            }
982            Some(_) => {
983                // end of the search chain, no match
984            }
985        }
986    }
987
988    fn on_hash(&mut self, node: &Hash) {
989        match self.pattern.unshift() {
990            Some(PatternItem::Pairs) => { visit_node_list(self, &node.pairs) }
991
992            // skip begin_l
993
994            // skip end_l
995
996            // skip expression_l
997
998            
999
1000            None => {
1001                // end of the search chain, match
1002                self.result = Some(Node::Hash(node.clone()));
1003            }
1004            Some(_) => {
1005                // end of the search chain, no match
1006            }
1007        }
1008    }
1009
1010    fn on_hash_pattern(&mut self, node: &HashPattern) {
1011        match self.pattern.unshift() {
1012            Some(PatternItem::Elements) => { visit_node_list(self, &node.elements) }
1013
1014            // skip begin_l
1015
1016            // skip end_l
1017
1018            // skip expression_l
1019
1020            
1021
1022            None => {
1023                // end of the search chain, match
1024                self.result = Some(Node::HashPattern(node.clone()));
1025            }
1026            Some(_) => {
1027                // end of the search chain, no match
1028            }
1029        }
1030    }
1031
1032    fn on_heredoc(&mut self, node: &Heredoc) {
1033        match self.pattern.unshift() {
1034            Some(PatternItem::Parts) => { visit_node_list(self, &node.parts) }
1035
1036            // skip heredoc_body_l
1037
1038            // skip heredoc_end_l
1039
1040            // skip expression_l
1041
1042            
1043
1044            None => {
1045                // end of the search chain, match
1046                self.result = Some(Node::Heredoc(node.clone()));
1047            }
1048            Some(_) => {
1049                // end of the search chain, no match
1050            }
1051        }
1052    }
1053
1054    fn on_if(&mut self, node: &If) {
1055        match self.pattern.unshift() {
1056            Some(PatternItem::Cond) => { self.visit(&node.cond); }
1057
1058            Some(PatternItem::IfTrue) => { if let Some(inner) = node.if_true.as_ref() { self.visit(inner); } }
1059
1060            Some(PatternItem::IfFalse) => { if let Some(inner) = node.if_false.as_ref() { self.visit(inner); } }
1061
1062            // skip keyword_l
1063
1064            // skip begin_l
1065
1066            // skip else_l
1067
1068            // skip end_l
1069
1070            // skip expression_l
1071
1072            
1073
1074            None => {
1075                // end of the search chain, match
1076                self.result = Some(Node::If(node.clone()));
1077            }
1078            Some(_) => {
1079                // end of the search chain, no match
1080            }
1081        }
1082    }
1083
1084    fn on_if_guard(&mut self, node: &IfGuard) {
1085        match self.pattern.unshift() {
1086            Some(PatternItem::Cond) => { self.visit(&node.cond); }
1087
1088            // skip keyword_l
1089
1090            // skip expression_l
1091
1092            
1093
1094            None => {
1095                // end of the search chain, match
1096                self.result = Some(Node::IfGuard(node.clone()));
1097            }
1098            Some(_) => {
1099                // end of the search chain, no match
1100            }
1101        }
1102    }
1103
1104    fn on_i_flip_flop(&mut self, node: &IFlipFlop) {
1105        match self.pattern.unshift() {
1106            Some(PatternItem::Left) => { if let Some(inner) = node.left.as_ref() { self.visit(inner); } }
1107
1108            Some(PatternItem::Right) => { if let Some(inner) = node.right.as_ref() { self.visit(inner); } }
1109
1110            // skip operator_l
1111
1112            // skip expression_l
1113
1114            
1115
1116            None => {
1117                // end of the search chain, match
1118                self.result = Some(Node::IFlipFlop(node.clone()));
1119            }
1120            Some(_) => {
1121                // end of the search chain, no match
1122            }
1123        }
1124    }
1125
1126    fn on_if_mod(&mut self, node: &IfMod) {
1127        match self.pattern.unshift() {
1128            Some(PatternItem::Cond) => { self.visit(&node.cond); }
1129
1130            Some(PatternItem::IfTrue) => { if let Some(inner) = node.if_true.as_ref() { self.visit(inner); } }
1131
1132            Some(PatternItem::IfFalse) => { if let Some(inner) = node.if_false.as_ref() { self.visit(inner); } }
1133
1134            // skip keyword_l
1135
1136            // skip expression_l
1137
1138            
1139
1140            None => {
1141                // end of the search chain, match
1142                self.result = Some(Node::IfMod(node.clone()));
1143            }
1144            Some(_) => {
1145                // end of the search chain, no match
1146            }
1147        }
1148    }
1149
1150    fn on_if_ternary(&mut self, node: &IfTernary) {
1151        match self.pattern.unshift() {
1152            Some(PatternItem::Cond) => { self.visit(&node.cond); }
1153
1154            Some(PatternItem::IfTrue) => { self.visit(&node.if_true); }
1155
1156            Some(PatternItem::IfFalse) => { self.visit(&node.if_false); }
1157
1158            // skip question_l
1159
1160            // skip colon_l
1161
1162            // skip expression_l
1163
1164            
1165
1166            None => {
1167                // end of the search chain, match
1168                self.result = Some(Node::IfTernary(node.clone()));
1169            }
1170            Some(_) => {
1171                // end of the search chain, no match
1172            }
1173        }
1174    }
1175
1176    fn on_index(&mut self, node: &Index) {
1177        match self.pattern.unshift() {
1178            Some(PatternItem::Recv) => { self.visit(&node.recv); }
1179
1180            Some(PatternItem::Indexes) => { visit_node_list(self, &node.indexes) }
1181
1182            // skip begin_l
1183
1184            // skip end_l
1185
1186            // skip expression_l
1187
1188            
1189
1190            None => {
1191                // end of the search chain, match
1192                self.result = Some(Node::Index(node.clone()));
1193            }
1194            Some(_) => {
1195                // end of the search chain, no match
1196            }
1197        }
1198    }
1199
1200    fn on_index_asgn(&mut self, node: &IndexAsgn) {
1201        match self.pattern.unshift() {
1202            Some(PatternItem::Recv) => { self.visit(&node.recv); }
1203
1204            Some(PatternItem::Indexes) => { visit_node_list(self, &node.indexes) }
1205
1206            Some(PatternItem::Value) => { if let Some(inner) = node.value.as_ref() { self.visit(inner); } }
1207
1208            // skip begin_l
1209
1210            // skip end_l
1211
1212            // skip operator_l
1213
1214            // skip expression_l
1215
1216            
1217
1218            None => {
1219                // end of the search chain, match
1220                self.result = Some(Node::IndexAsgn(node.clone()));
1221            }
1222            Some(_) => {
1223                // end of the search chain, no match
1224            }
1225        }
1226    }
1227
1228    fn on_in_pattern(&mut self, node: &InPattern) {
1229        match self.pattern.unshift() {
1230            Some(PatternItem::Pattern) => { self.visit(&node.pattern); }
1231
1232            Some(PatternItem::Guard) => { if let Some(inner) = node.guard.as_ref() { self.visit(inner); } }
1233
1234            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
1235
1236            // skip keyword_l
1237
1238            // skip begin_l
1239
1240            // skip expression_l
1241
1242            
1243
1244            None => {
1245                // end of the search chain, match
1246                self.result = Some(Node::InPattern(node.clone()));
1247            }
1248            Some(_) => {
1249                // end of the search chain, no match
1250            }
1251        }
1252    }
1253
1254    fn on_int(&mut self, node: &Int) {
1255        match self.pattern.unshift() {
1256            // skip value
1257
1258            // skip operator_l
1259
1260            // skip expression_l
1261
1262            
1263
1264            None => {
1265                // end of the search chain, match
1266                self.result = Some(Node::Int(node.clone()));
1267            }
1268            Some(_) => {
1269                // end of the search chain, no match
1270            }
1271        }
1272    }
1273
1274    fn on_irange(&mut self, node: &Irange) {
1275        match self.pattern.unshift() {
1276            Some(PatternItem::Left) => { if let Some(inner) = node.left.as_ref() { self.visit(inner); } }
1277
1278            Some(PatternItem::Right) => { if let Some(inner) = node.right.as_ref() { self.visit(inner); } }
1279
1280            // skip operator_l
1281
1282            // skip expression_l
1283
1284            
1285
1286            None => {
1287                // end of the search chain, match
1288                self.result = Some(Node::Irange(node.clone()));
1289            }
1290            Some(_) => {
1291                // end of the search chain, no match
1292            }
1293        }
1294    }
1295
1296    fn on_ivar(&mut self, node: &Ivar) {
1297        match self.pattern.unshift() {
1298            // skip name
1299
1300            // skip expression_l
1301
1302            
1303
1304            None => {
1305                // end of the search chain, match
1306                self.result = Some(Node::Ivar(node.clone()));
1307            }
1308            Some(_) => {
1309                // end of the search chain, no match
1310            }
1311        }
1312    }
1313
1314    fn on_ivasgn(&mut self, node: &Ivasgn) {
1315        match self.pattern.unshift() {
1316            // skip name
1317
1318            Some(PatternItem::Value) => { if let Some(inner) = node.value.as_ref() { self.visit(inner); } }
1319
1320            // skip name_l
1321
1322            // skip operator_l
1323
1324            // skip expression_l
1325
1326            
1327
1328            None => {
1329                // end of the search chain, match
1330                self.result = Some(Node::Ivasgn(node.clone()));
1331            }
1332            Some(_) => {
1333                // end of the search chain, no match
1334            }
1335        }
1336    }
1337
1338    fn on_kwarg(&mut self, node: &Kwarg) {
1339        match self.pattern.unshift() {
1340            // skip name
1341
1342            // skip name_l
1343
1344            // skip expression_l
1345
1346            
1347
1348            None => {
1349                // end of the search chain, match
1350                self.result = Some(Node::Kwarg(node.clone()));
1351            }
1352            Some(_) => {
1353                // end of the search chain, no match
1354            }
1355        }
1356    }
1357
1358    fn on_kwargs(&mut self, node: &Kwargs) {
1359        match self.pattern.unshift() {
1360            Some(PatternItem::Pairs) => { visit_node_list(self, &node.pairs) }
1361
1362            // skip expression_l
1363
1364            
1365
1366            None => {
1367                // end of the search chain, match
1368                self.result = Some(Node::Kwargs(node.clone()));
1369            }
1370            Some(_) => {
1371                // end of the search chain, no match
1372            }
1373        }
1374    }
1375
1376    fn on_kw_begin(&mut self, node: &KwBegin) {
1377        match self.pattern.unshift() {
1378            Some(PatternItem::Stmts) => { visit_node_list(self, &node.statements) }
1379
1380            // skip begin_l
1381
1382            // skip end_l
1383
1384            // skip expression_l
1385
1386            
1387
1388            None => {
1389                // end of the search chain, match
1390                self.result = Some(Node::KwBegin(node.clone()));
1391            }
1392            Some(_) => {
1393                // end of the search chain, no match
1394            }
1395        }
1396    }
1397
1398    fn on_kwnilarg(&mut self, node: &Kwnilarg) {
1399        match self.pattern.unshift() {
1400            // skip name_l
1401
1402            // skip expression_l
1403
1404            
1405
1406            None => {
1407                // end of the search chain, match
1408                self.result = Some(Node::Kwnilarg(node.clone()));
1409            }
1410            Some(_) => {
1411                // end of the search chain, no match
1412            }
1413        }
1414    }
1415
1416    fn on_kwoptarg(&mut self, node: &Kwoptarg) {
1417        match self.pattern.unshift() {
1418            // skip name
1419
1420            Some(PatternItem::DefaultValue) => { self.visit(&node.default); }
1421
1422            // skip name_l
1423
1424            // skip expression_l
1425
1426            
1427
1428            None => {
1429                // end of the search chain, match
1430                self.result = Some(Node::Kwoptarg(node.clone()));
1431            }
1432            Some(_) => {
1433                // end of the search chain, no match
1434            }
1435        }
1436    }
1437
1438    fn on_kwrestarg(&mut self, node: &Kwrestarg) {
1439        match self.pattern.unshift() {
1440            // skip name
1441
1442            // skip operator_l
1443
1444            // skip name_l
1445
1446            // skip expression_l
1447
1448            
1449
1450            None => {
1451                // end of the search chain, match
1452                self.result = Some(Node::Kwrestarg(node.clone()));
1453            }
1454            Some(_) => {
1455                // end of the search chain, no match
1456            }
1457        }
1458    }
1459
1460    fn on_kwsplat(&mut self, node: &Kwsplat) {
1461        match self.pattern.unshift() {
1462            Some(PatternItem::Value) => { self.visit(&node.value); }
1463
1464            // skip operator_l
1465
1466            // skip expression_l
1467
1468            
1469
1470            None => {
1471                // end of the search chain, match
1472                self.result = Some(Node::Kwsplat(node.clone()));
1473            }
1474            Some(_) => {
1475                // end of the search chain, no match
1476            }
1477        }
1478    }
1479
1480    fn on_lambda(&mut self, node: &Lambda) {
1481        match self.pattern.unshift() {
1482            // skip expression_l
1483
1484            
1485
1486            None => {
1487                // end of the search chain, match
1488                self.result = Some(Node::Lambda(node.clone()));
1489            }
1490            Some(_) => {
1491                // end of the search chain, no match
1492            }
1493        }
1494    }
1495
1496    fn on_line(&mut self, node: &Line) {
1497        match self.pattern.unshift() {
1498            // skip expression_l
1499
1500            
1501
1502            None => {
1503                // end of the search chain, match
1504                self.result = Some(Node::Line(node.clone()));
1505            }
1506            Some(_) => {
1507                // end of the search chain, no match
1508            }
1509        }
1510    }
1511
1512    fn on_lvar(&mut self, node: &Lvar) {
1513        match self.pattern.unshift() {
1514            // skip name
1515
1516            // skip expression_l
1517
1518            
1519
1520            None => {
1521                // end of the search chain, match
1522                self.result = Some(Node::Lvar(node.clone()));
1523            }
1524            Some(_) => {
1525                // end of the search chain, no match
1526            }
1527        }
1528    }
1529
1530    fn on_lvasgn(&mut self, node: &Lvasgn) {
1531        match self.pattern.unshift() {
1532            // skip name
1533
1534            Some(PatternItem::Value) => { if let Some(inner) = node.value.as_ref() { self.visit(inner); } }
1535
1536            // skip name_l
1537
1538            // skip operator_l
1539
1540            // skip expression_l
1541
1542            
1543
1544            None => {
1545                // end of the search chain, match
1546                self.result = Some(Node::Lvasgn(node.clone()));
1547            }
1548            Some(_) => {
1549                // end of the search chain, no match
1550            }
1551        }
1552    }
1553
1554    fn on_masgn(&mut self, node: &Masgn) {
1555        match self.pattern.unshift() {
1556            Some(PatternItem::Lhs) => { self.visit(&node.lhs); }
1557
1558            Some(PatternItem::Rhs) => { self.visit(&node.rhs); }
1559
1560            // skip operator_l
1561
1562            // skip expression_l
1563
1564            
1565
1566            None => {
1567                // end of the search chain, match
1568                self.result = Some(Node::Masgn(node.clone()));
1569            }
1570            Some(_) => {
1571                // end of the search chain, no match
1572            }
1573        }
1574    }
1575
1576    fn on_match_alt(&mut self, node: &MatchAlt) {
1577        match self.pattern.unshift() {
1578            Some(PatternItem::Lhs) => { self.visit(&node.lhs); }
1579
1580            Some(PatternItem::Rhs) => { self.visit(&node.rhs); }
1581
1582            // skip operator_l
1583
1584            // skip expression_l
1585
1586            
1587
1588            None => {
1589                // end of the search chain, match
1590                self.result = Some(Node::MatchAlt(node.clone()));
1591            }
1592            Some(_) => {
1593                // end of the search chain, no match
1594            }
1595        }
1596    }
1597
1598    fn on_match_as(&mut self, node: &MatchAs) {
1599        match self.pattern.unshift() {
1600            Some(PatternItem::Value) => { self.visit(&node.value); }
1601
1602            Some(PatternItem::As) => { self.visit(&node.as_); }
1603
1604            // skip operator_l
1605
1606            // skip expression_l
1607
1608            
1609
1610            None => {
1611                // end of the search chain, match
1612                self.result = Some(Node::MatchAs(node.clone()));
1613            }
1614            Some(_) => {
1615                // end of the search chain, no match
1616            }
1617        }
1618    }
1619
1620    fn on_match_current_line(&mut self, node: &MatchCurrentLine) {
1621        match self.pattern.unshift() {
1622            Some(PatternItem::Re) => { self.visit(&node.re); }
1623
1624            // skip expression_l
1625
1626            
1627
1628            None => {
1629                // end of the search chain, match
1630                self.result = Some(Node::MatchCurrentLine(node.clone()));
1631            }
1632            Some(_) => {
1633                // end of the search chain, no match
1634            }
1635        }
1636    }
1637
1638    fn on_match_nil_pattern(&mut self, node: &MatchNilPattern) {
1639        match self.pattern.unshift() {
1640            // skip operator_l
1641
1642            // skip name_l
1643
1644            // skip expression_l
1645
1646            
1647
1648            None => {
1649                // end of the search chain, match
1650                self.result = Some(Node::MatchNilPattern(node.clone()));
1651            }
1652            Some(_) => {
1653                // end of the search chain, no match
1654            }
1655        }
1656    }
1657
1658    fn on_match_pattern(&mut self, node: &MatchPattern) {
1659        match self.pattern.unshift() {
1660            Some(PatternItem::Value) => { self.visit(&node.value); }
1661
1662            Some(PatternItem::Pattern) => { self.visit(&node.pattern); }
1663
1664            // skip operator_l
1665
1666            // skip expression_l
1667
1668            
1669
1670            None => {
1671                // end of the search chain, match
1672                self.result = Some(Node::MatchPattern(node.clone()));
1673            }
1674            Some(_) => {
1675                // end of the search chain, no match
1676            }
1677        }
1678    }
1679
1680    fn on_match_pattern_p(&mut self, node: &MatchPatternP) {
1681        match self.pattern.unshift() {
1682            Some(PatternItem::Value) => { self.visit(&node.value); }
1683
1684            Some(PatternItem::Pattern) => { self.visit(&node.pattern); }
1685
1686            // skip operator_l
1687
1688            // skip expression_l
1689
1690            
1691
1692            None => {
1693                // end of the search chain, match
1694                self.result = Some(Node::MatchPatternP(node.clone()));
1695            }
1696            Some(_) => {
1697                // end of the search chain, no match
1698            }
1699        }
1700    }
1701
1702    fn on_match_rest(&mut self, node: &MatchRest) {
1703        match self.pattern.unshift() {
1704            Some(PatternItem::Name) => { if let Some(inner) = node.name.as_ref() { self.visit(inner); } }
1705
1706            // skip operator_l
1707
1708            // skip expression_l
1709
1710            
1711
1712            None => {
1713                // end of the search chain, match
1714                self.result = Some(Node::MatchRest(node.clone()));
1715            }
1716            Some(_) => {
1717                // end of the search chain, no match
1718            }
1719        }
1720    }
1721
1722    fn on_match_var(&mut self, node: &MatchVar) {
1723        match self.pattern.unshift() {
1724            // skip name
1725
1726            // skip name_l
1727
1728            // skip expression_l
1729
1730            
1731
1732            None => {
1733                // end of the search chain, match
1734                self.result = Some(Node::MatchVar(node.clone()));
1735            }
1736            Some(_) => {
1737                // end of the search chain, no match
1738            }
1739        }
1740    }
1741
1742    fn on_match_with_lvasgn(&mut self, node: &MatchWithLvasgn) {
1743        match self.pattern.unshift() {
1744            Some(PatternItem::Re) => { self.visit(&node.re); }
1745
1746            Some(PatternItem::Value) => { self.visit(&node.value); }
1747
1748            // skip operator_l
1749
1750            // skip expression_l
1751
1752            
1753
1754            None => {
1755                // end of the search chain, match
1756                self.result = Some(Node::MatchWithLvasgn(node.clone()));
1757            }
1758            Some(_) => {
1759                // end of the search chain, no match
1760            }
1761        }
1762    }
1763
1764    fn on_mlhs(&mut self, node: &Mlhs) {
1765        match self.pattern.unshift() {
1766            Some(PatternItem::MlhsItems) => { visit_node_list(self, &node.items) }
1767
1768            // skip begin_l
1769
1770            // skip end_l
1771
1772            // skip expression_l
1773
1774            
1775
1776            None => {
1777                // end of the search chain, match
1778                self.result = Some(Node::Mlhs(node.clone()));
1779            }
1780            Some(_) => {
1781                // end of the search chain, no match
1782            }
1783        }
1784    }
1785
1786    fn on_module(&mut self, node: &Module) {
1787        match self.pattern.unshift() {
1788            Some(PatternItem::Name) => { self.visit(&node.name); }
1789
1790            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
1791
1792            // skip keyword_l
1793
1794            // skip end_l
1795
1796            // skip expression_l
1797
1798            
1799
1800            None => {
1801                // end of the search chain, match
1802                self.result = Some(Node::Module(node.clone()));
1803            }
1804            Some(_) => {
1805                // end of the search chain, no match
1806            }
1807        }
1808    }
1809
1810    fn on_next(&mut self, node: &Next) {
1811        match self.pattern.unshift() {
1812            Some(PatternItem::Args) => { visit_node_list(self, &node.args) }
1813
1814            // skip keyword_l
1815
1816            // skip expression_l
1817
1818            
1819
1820            None => {
1821                // end of the search chain, match
1822                self.result = Some(Node::Next(node.clone()));
1823            }
1824            Some(_) => {
1825                // end of the search chain, no match
1826            }
1827        }
1828    }
1829
1830    fn on_nil(&mut self, node: &Nil) {
1831        match self.pattern.unshift() {
1832            // skip expression_l
1833
1834            
1835
1836            None => {
1837                // end of the search chain, match
1838                self.result = Some(Node::Nil(node.clone()));
1839            }
1840            Some(_) => {
1841                // end of the search chain, no match
1842            }
1843        }
1844    }
1845
1846    fn on_nth_ref(&mut self, node: &NthRef) {
1847        match self.pattern.unshift() {
1848            // skip name
1849
1850            // skip expression_l
1851
1852            
1853
1854            None => {
1855                // end of the search chain, match
1856                self.result = Some(Node::NthRef(node.clone()));
1857            }
1858            Some(_) => {
1859                // end of the search chain, no match
1860            }
1861        }
1862    }
1863
1864    fn on_numblock(&mut self, node: &Numblock) {
1865        match self.pattern.unshift() {
1866            Some(PatternItem::MethodCall) => { self.visit(&node.call); }
1867
1868            // skip numargs
1869
1870            Some(PatternItem::Body) => { self.visit(&node.body); }
1871
1872            // skip begin_l
1873
1874            // skip end_l
1875
1876            // skip expression_l
1877
1878            
1879
1880            None => {
1881                // end of the search chain, match
1882                self.result = Some(Node::Numblock(node.clone()));
1883            }
1884            Some(_) => {
1885                // end of the search chain, no match
1886            }
1887        }
1888    }
1889
1890    fn on_op_asgn(&mut self, node: &OpAsgn) {
1891        match self.pattern.unshift() {
1892            Some(PatternItem::Recv) => { self.visit(&node.recv); }
1893
1894            // skip operator
1895
1896            Some(PatternItem::Value) => { self.visit(&node.value); }
1897
1898            // skip operator_l
1899
1900            // skip expression_l
1901
1902            
1903
1904            None => {
1905                // end of the search chain, match
1906                self.result = Some(Node::OpAsgn(node.clone()));
1907            }
1908            Some(_) => {
1909                // end of the search chain, no match
1910            }
1911        }
1912    }
1913
1914    fn on_optarg(&mut self, node: &Optarg) {
1915        match self.pattern.unshift() {
1916            // skip name
1917
1918            Some(PatternItem::DefaultValue) => { self.visit(&node.default); }
1919
1920            // skip name_l
1921
1922            // skip operator_l
1923
1924            // skip expression_l
1925
1926            
1927
1928            None => {
1929                // end of the search chain, match
1930                self.result = Some(Node::Optarg(node.clone()));
1931            }
1932            Some(_) => {
1933                // end of the search chain, no match
1934            }
1935        }
1936    }
1937
1938    fn on_or(&mut self, node: &Or) {
1939        match self.pattern.unshift() {
1940            Some(PatternItem::Lhs) => { self.visit(&node.lhs); }
1941
1942            Some(PatternItem::Rhs) => { self.visit(&node.rhs); }
1943
1944            // skip operator_l
1945
1946            // skip expression_l
1947
1948            
1949
1950            None => {
1951                // end of the search chain, match
1952                self.result = Some(Node::Or(node.clone()));
1953            }
1954            Some(_) => {
1955                // end of the search chain, no match
1956            }
1957        }
1958    }
1959
1960    fn on_or_asgn(&mut self, node: &OrAsgn) {
1961        match self.pattern.unshift() {
1962            Some(PatternItem::Recv) => { self.visit(&node.recv); }
1963
1964            Some(PatternItem::Value) => { self.visit(&node.value); }
1965
1966            // skip operator_l
1967
1968            // skip expression_l
1969
1970            
1971
1972            None => {
1973                // end of the search chain, match
1974                self.result = Some(Node::OrAsgn(node.clone()));
1975            }
1976            Some(_) => {
1977                // end of the search chain, no match
1978            }
1979        }
1980    }
1981
1982    fn on_pair(&mut self, node: &Pair) {
1983        match self.pattern.unshift() {
1984            Some(PatternItem::Key) => { self.visit(&node.key); }
1985
1986            Some(PatternItem::Value) => { self.visit(&node.value); }
1987
1988            // skip operator_l
1989
1990            // skip expression_l
1991
1992            
1993
1994            None => {
1995                // end of the search chain, match
1996                self.result = Some(Node::Pair(node.clone()));
1997            }
1998            Some(_) => {
1999                // end of the search chain, no match
2000            }
2001        }
2002    }
2003
2004    fn on_pin(&mut self, node: &Pin) {
2005        match self.pattern.unshift() {
2006            Some(PatternItem::Var) => { self.visit(&node.var); }
2007
2008            // skip selector_l
2009
2010            // skip expression_l
2011
2012            
2013
2014            None => {
2015                // end of the search chain, match
2016                self.result = Some(Node::Pin(node.clone()));
2017            }
2018            Some(_) => {
2019                // end of the search chain, no match
2020            }
2021        }
2022    }
2023
2024    fn on_postexe(&mut self, node: &Postexe) {
2025        match self.pattern.unshift() {
2026            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
2027
2028            // skip keyword_l
2029
2030            // skip begin_l
2031
2032            // skip end_l
2033
2034            // skip expression_l
2035
2036            
2037
2038            None => {
2039                // end of the search chain, match
2040                self.result = Some(Node::Postexe(node.clone()));
2041            }
2042            Some(_) => {
2043                // end of the search chain, no match
2044            }
2045        }
2046    }
2047
2048    fn on_preexe(&mut self, node: &Preexe) {
2049        match self.pattern.unshift() {
2050            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
2051
2052            // skip keyword_l
2053
2054            // skip begin_l
2055
2056            // skip end_l
2057
2058            // skip expression_l
2059
2060            
2061
2062            None => {
2063                // end of the search chain, match
2064                self.result = Some(Node::Preexe(node.clone()));
2065            }
2066            Some(_) => {
2067                // end of the search chain, no match
2068            }
2069        }
2070    }
2071
2072    fn on_procarg0(&mut self, node: &Procarg0) {
2073        match self.pattern.unshift() {
2074            Some(PatternItem::Arglist) => { visit_node_list(self, &node.args) }
2075
2076            // skip begin_l
2077
2078            // skip end_l
2079
2080            // skip expression_l
2081
2082            
2083
2084            None => {
2085                // end of the search chain, match
2086                self.result = Some(Node::Procarg0(node.clone()));
2087            }
2088            Some(_) => {
2089                // end of the search chain, no match
2090            }
2091        }
2092    }
2093
2094    fn on_rational(&mut self, node: &Rational) {
2095        match self.pattern.unshift() {
2096            // skip value
2097
2098            // skip operator_l
2099
2100            // skip expression_l
2101
2102            
2103
2104            None => {
2105                // end of the search chain, match
2106                self.result = Some(Node::Rational(node.clone()));
2107            }
2108            Some(_) => {
2109                // end of the search chain, no match
2110            }
2111        }
2112    }
2113
2114    fn on_redo(&mut self, node: &Redo) {
2115        match self.pattern.unshift() {
2116            // skip expression_l
2117
2118            
2119
2120            None => {
2121                // end of the search chain, match
2122                self.result = Some(Node::Redo(node.clone()));
2123            }
2124            Some(_) => {
2125                // end of the search chain, no match
2126            }
2127        }
2128    }
2129
2130    fn on_regexp(&mut self, node: &Regexp) {
2131        match self.pattern.unshift() {
2132            Some(PatternItem::Parts) => { visit_node_list(self, &node.parts) }
2133
2134            Some(PatternItem::Options) => { if let Some(inner) = node.options.as_ref() { self.visit(inner); } }
2135
2136            // skip begin_l
2137
2138            // skip end_l
2139
2140            // skip expression_l
2141
2142            
2143
2144            None => {
2145                // end of the search chain, match
2146                self.result = Some(Node::Regexp(node.clone()));
2147            }
2148            Some(_) => {
2149                // end of the search chain, no match
2150            }
2151        }
2152    }
2153
2154    fn on_reg_opt(&mut self, node: &RegOpt) {
2155        match self.pattern.unshift() {
2156            // skip options
2157
2158            // skip expression_l
2159
2160            
2161
2162            None => {
2163                // end of the search chain, match
2164                self.result = Some(Node::RegOpt(node.clone()));
2165            }
2166            Some(_) => {
2167                // end of the search chain, no match
2168            }
2169        }
2170    }
2171
2172    fn on_rescue(&mut self, node: &Rescue) {
2173        match self.pattern.unshift() {
2174            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
2175
2176            Some(PatternItem::RescueBodies) => { visit_node_list(self, &node.rescue_bodies) }
2177
2178            Some(PatternItem::ElseBody) => { if let Some(inner) = node.else_.as_ref() { self.visit(inner); } }
2179
2180            // skip else_l
2181
2182            // skip expression_l
2183
2184            
2185
2186            None => {
2187                // end of the search chain, match
2188                self.result = Some(Node::Rescue(node.clone()));
2189            }
2190            Some(_) => {
2191                // end of the search chain, no match
2192            }
2193        }
2194    }
2195
2196    fn on_rescue_body(&mut self, node: &RescueBody) {
2197        match self.pattern.unshift() {
2198            Some(PatternItem::ExcList) => { if let Some(inner) = node.exc_list.as_ref() { self.visit(inner); } }
2199
2200            Some(PatternItem::ExcVar) => { if let Some(inner) = node.exc_var.as_ref() { self.visit(inner); } }
2201
2202            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
2203
2204            // skip keyword_l
2205
2206            // skip assoc_l
2207
2208            // skip begin_l
2209
2210            // skip expression_l
2211
2212            
2213
2214            None => {
2215                // end of the search chain, match
2216                self.result = Some(Node::RescueBody(node.clone()));
2217            }
2218            Some(_) => {
2219                // end of the search chain, no match
2220            }
2221        }
2222    }
2223
2224    fn on_restarg(&mut self, node: &Restarg) {
2225        match self.pattern.unshift() {
2226            // skip name
2227
2228            // skip operator_l
2229
2230            // skip name_l
2231
2232            // skip expression_l
2233
2234            
2235
2236            None => {
2237                // end of the search chain, match
2238                self.result = Some(Node::Restarg(node.clone()));
2239            }
2240            Some(_) => {
2241                // end of the search chain, no match
2242            }
2243        }
2244    }
2245
2246    fn on_retry(&mut self, node: &Retry) {
2247        match self.pattern.unshift() {
2248            // skip expression_l
2249
2250            
2251
2252            None => {
2253                // end of the search chain, match
2254                self.result = Some(Node::Retry(node.clone()));
2255            }
2256            Some(_) => {
2257                // end of the search chain, no match
2258            }
2259        }
2260    }
2261
2262    fn on_return(&mut self, node: &Return) {
2263        match self.pattern.unshift() {
2264            Some(PatternItem::Args) => { visit_node_list(self, &node.args) }
2265
2266            // skip keyword_l
2267
2268            // skip expression_l
2269
2270            
2271
2272            None => {
2273                // end of the search chain, match
2274                self.result = Some(Node::Return(node.clone()));
2275            }
2276            Some(_) => {
2277                // end of the search chain, no match
2278            }
2279        }
2280    }
2281
2282    fn on_s_class(&mut self, node: &SClass) {
2283        match self.pattern.unshift() {
2284            Some(PatternItem::Expr) => { self.visit(&node.expr); }
2285
2286            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
2287
2288            // skip keyword_l
2289
2290            // skip operator_l
2291
2292            // skip end_l
2293
2294            // skip expression_l
2295
2296            
2297
2298            None => {
2299                // end of the search chain, match
2300                self.result = Some(Node::SClass(node.clone()));
2301            }
2302            Some(_) => {
2303                // end of the search chain, no match
2304            }
2305        }
2306    }
2307
2308    fn on_self_(&mut self, node: &Self_) {
2309        match self.pattern.unshift() {
2310            // skip expression_l
2311
2312            
2313
2314            None => {
2315                // end of the search chain, match
2316                self.result = Some(Node::Self_(node.clone()));
2317            }
2318            Some(_) => {
2319                // end of the search chain, no match
2320            }
2321        }
2322    }
2323
2324    fn on_send(&mut self, node: &Send) {
2325        match self.pattern.unshift() {
2326            Some(PatternItem::Recv) => { if let Some(inner) = node.recv.as_ref() { self.visit(inner); } }
2327
2328            // skip method_name
2329
2330            Some(PatternItem::Args) => { visit_node_list(self, &node.args) }
2331
2332            // skip dot_l
2333
2334            // skip selector_l
2335
2336            // skip begin_l
2337
2338            // skip end_l
2339
2340            // skip operator_l
2341
2342            // skip expression_l
2343
2344            
2345
2346            None => {
2347                // end of the search chain, match
2348                self.result = Some(Node::Send(node.clone()));
2349            }
2350            Some(_) => {
2351                // end of the search chain, no match
2352            }
2353        }
2354    }
2355
2356    fn on_shadowarg(&mut self, node: &Shadowarg) {
2357        match self.pattern.unshift() {
2358            // skip name
2359
2360            // skip expression_l
2361
2362            
2363
2364            None => {
2365                // end of the search chain, match
2366                self.result = Some(Node::Shadowarg(node.clone()));
2367            }
2368            Some(_) => {
2369                // end of the search chain, no match
2370            }
2371        }
2372    }
2373
2374    fn on_splat(&mut self, node: &Splat) {
2375        match self.pattern.unshift() {
2376            Some(PatternItem::Value) => { if let Some(inner) = node.value.as_ref() { self.visit(inner); } }
2377
2378            // skip operator_l
2379
2380            // skip expression_l
2381
2382            
2383
2384            None => {
2385                // end of the search chain, match
2386                self.result = Some(Node::Splat(node.clone()));
2387            }
2388            Some(_) => {
2389                // end of the search chain, no match
2390            }
2391        }
2392    }
2393
2394    fn on_str(&mut self, node: &Str) {
2395        match self.pattern.unshift() {
2396            // skip value
2397
2398            // skip begin_l
2399
2400            // skip end_l
2401
2402            // skip expression_l
2403
2404            
2405
2406            None => {
2407                // end of the search chain, match
2408                self.result = Some(Node::Str(node.clone()));
2409            }
2410            Some(_) => {
2411                // end of the search chain, no match
2412            }
2413        }
2414    }
2415
2416    fn on_super(&mut self, node: &Super) {
2417        match self.pattern.unshift() {
2418            Some(PatternItem::Args) => { visit_node_list(self, &node.args) }
2419
2420            // skip keyword_l
2421
2422            // skip begin_l
2423
2424            // skip end_l
2425
2426            // skip expression_l
2427
2428            
2429
2430            None => {
2431                // end of the search chain, match
2432                self.result = Some(Node::Super(node.clone()));
2433            }
2434            Some(_) => {
2435                // end of the search chain, no match
2436            }
2437        }
2438    }
2439
2440    fn on_sym(&mut self, node: &Sym) {
2441        match self.pattern.unshift() {
2442            // skip name
2443
2444            // skip begin_l
2445
2446            // skip end_l
2447
2448            // skip expression_l
2449
2450            
2451
2452            None => {
2453                // end of the search chain, match
2454                self.result = Some(Node::Sym(node.clone()));
2455            }
2456            Some(_) => {
2457                // end of the search chain, no match
2458            }
2459        }
2460    }
2461
2462    fn on_true(&mut self, node: &True) {
2463        match self.pattern.unshift() {
2464            // skip expression_l
2465
2466            
2467
2468            None => {
2469                // end of the search chain, match
2470                self.result = Some(Node::True(node.clone()));
2471            }
2472            Some(_) => {
2473                // end of the search chain, no match
2474            }
2475        }
2476    }
2477
2478    fn on_undef(&mut self, node: &Undef) {
2479        match self.pattern.unshift() {
2480            Some(PatternItem::Args) => { visit_node_list(self, &node.names) }
2481
2482            // skip keyword_l
2483
2484            // skip expression_l
2485
2486            
2487
2488            None => {
2489                // end of the search chain, match
2490                self.result = Some(Node::Undef(node.clone()));
2491            }
2492            Some(_) => {
2493                // end of the search chain, no match
2494            }
2495        }
2496    }
2497
2498    fn on_unless_guard(&mut self, node: &UnlessGuard) {
2499        match self.pattern.unshift() {
2500            Some(PatternItem::Cond) => { self.visit(&node.cond); }
2501
2502            // skip keyword_l
2503
2504            // skip expression_l
2505
2506            
2507
2508            None => {
2509                // end of the search chain, match
2510                self.result = Some(Node::UnlessGuard(node.clone()));
2511            }
2512            Some(_) => {
2513                // end of the search chain, no match
2514            }
2515        }
2516    }
2517
2518    fn on_until(&mut self, node: &Until) {
2519        match self.pattern.unshift() {
2520            Some(PatternItem::Cond) => { self.visit(&node.cond); }
2521
2522            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
2523
2524            // skip keyword_l
2525
2526            // skip begin_l
2527
2528            // skip end_l
2529
2530            // skip expression_l
2531
2532            
2533
2534            None => {
2535                // end of the search chain, match
2536                self.result = Some(Node::Until(node.clone()));
2537            }
2538            Some(_) => {
2539                // end of the search chain, no match
2540            }
2541        }
2542    }
2543
2544    fn on_until_post(&mut self, node: &UntilPost) {
2545        match self.pattern.unshift() {
2546            Some(PatternItem::Cond) => { self.visit(&node.cond); }
2547
2548            Some(PatternItem::Body) => { self.visit(&node.body); }
2549
2550            // skip keyword_l
2551
2552            // skip expression_l
2553
2554            
2555
2556            None => {
2557                // end of the search chain, match
2558                self.result = Some(Node::UntilPost(node.clone()));
2559            }
2560            Some(_) => {
2561                // end of the search chain, no match
2562            }
2563        }
2564    }
2565
2566    fn on_when(&mut self, node: &When) {
2567        match self.pattern.unshift() {
2568            Some(PatternItem::Args) => { visit_node_list(self, &node.patterns) }
2569
2570            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
2571
2572            // skip keyword_l
2573
2574            // skip begin_l
2575
2576            // skip expression_l
2577
2578            
2579
2580            None => {
2581                // end of the search chain, match
2582                self.result = Some(Node::When(node.clone()));
2583            }
2584            Some(_) => {
2585                // end of the search chain, no match
2586            }
2587        }
2588    }
2589
2590    fn on_while(&mut self, node: &While) {
2591        match self.pattern.unshift() {
2592            Some(PatternItem::Cond) => { self.visit(&node.cond); }
2593
2594            Some(PatternItem::Body) => { if let Some(inner) = node.body.as_ref() { self.visit(inner); } }
2595
2596            // skip keyword_l
2597
2598            // skip begin_l
2599
2600            // skip end_l
2601
2602            // skip expression_l
2603
2604            
2605
2606            None => {
2607                // end of the search chain, match
2608                self.result = Some(Node::While(node.clone()));
2609            }
2610            Some(_) => {
2611                // end of the search chain, no match
2612            }
2613        }
2614    }
2615
2616    fn on_while_post(&mut self, node: &WhilePost) {
2617        match self.pattern.unshift() {
2618            Some(PatternItem::Cond) => { self.visit(&node.cond); }
2619
2620            Some(PatternItem::Body) => { self.visit(&node.body); }
2621
2622            // skip keyword_l
2623
2624            // skip expression_l
2625
2626            
2627
2628            None => {
2629                // end of the search chain, match
2630                self.result = Some(Node::WhilePost(node.clone()));
2631            }
2632            Some(_) => {
2633                // end of the search chain, no match
2634            }
2635        }
2636    }
2637
2638    fn on_x_heredoc(&mut self, node: &XHeredoc) {
2639        match self.pattern.unshift() {
2640            Some(PatternItem::Parts) => { visit_node_list(self, &node.parts) }
2641
2642            // skip heredoc_body_l
2643
2644            // skip heredoc_end_l
2645
2646            // skip expression_l
2647
2648            
2649
2650            None => {
2651                // end of the search chain, match
2652                self.result = Some(Node::XHeredoc(node.clone()));
2653            }
2654            Some(_) => {
2655                // end of the search chain, no match
2656            }
2657        }
2658    }
2659
2660    fn on_xstr(&mut self, node: &Xstr) {
2661        match self.pattern.unshift() {
2662            Some(PatternItem::Parts) => { visit_node_list(self, &node.parts) }
2663
2664            // skip begin_l
2665
2666            // skip end_l
2667
2668            // skip expression_l
2669
2670            
2671
2672            None => {
2673                // end of the search chain, match
2674                self.result = Some(Node::Xstr(node.clone()));
2675            }
2676            Some(_) => {
2677                // end of the search chain, no match
2678            }
2679        }
2680    }
2681
2682    fn on_yield(&mut self, node: &Yield) {
2683        match self.pattern.unshift() {
2684            Some(PatternItem::Args) => { visit_node_list(self, &node.args) }
2685
2686            // skip keyword_l
2687
2688            // skip begin_l
2689
2690            // skip end_l
2691
2692            // skip expression_l
2693
2694            
2695
2696            None => {
2697                // end of the search chain, match
2698                self.result = Some(Node::Yield(node.clone()));
2699            }
2700            Some(_) => {
2701                // end of the search chain, no match
2702            }
2703        }
2704    }
2705
2706    fn on_z_super(&mut self, node: &ZSuper) {
2707        match self.pattern.unshift() {
2708            // skip expression_l
2709
2710            
2711
2712            None => {
2713                // end of the search chain, match
2714                self.result = Some(Node::ZSuper(node.clone()));
2715            }
2716            Some(_) => {
2717                // end of the search chain, no match
2718            }
2719        }
2720    }
2721
2722
2723    fn visit(&mut self, node: &Node) {
2724        match node {
2725            
2726            Node::Alias(inner) => {
2727                self.on_alias(inner);
2728            }
2729            
2730            Node::And(inner) => {
2731                self.on_and(inner);
2732            }
2733            
2734            Node::AndAsgn(inner) => {
2735                self.on_and_asgn(inner);
2736            }
2737            
2738            Node::Arg(inner) => {
2739                self.on_arg(inner);
2740            }
2741            
2742            Node::Args(inner) => {
2743                self.on_args(inner);
2744            }
2745            
2746            Node::Array(inner) => {
2747                self.on_array(inner);
2748            }
2749            
2750            Node::ArrayPattern(inner) => {
2751                self.on_array_pattern(inner);
2752            }
2753            
2754            Node::ArrayPatternWithTail(inner) => {
2755                self.on_array_pattern_with_tail(inner);
2756            }
2757            
2758            Node::BackRef(inner) => {
2759                self.on_back_ref(inner);
2760            }
2761            
2762            Node::Begin(inner) => {
2763                self.on_begin(inner);
2764            }
2765            
2766            Node::Block(inner) => {
2767                self.on_block(inner);
2768            }
2769            
2770            Node::Blockarg(inner) => {
2771                self.on_blockarg(inner);
2772            }
2773            
2774            Node::BlockPass(inner) => {
2775                self.on_block_pass(inner);
2776            }
2777            
2778            Node::Break(inner) => {
2779                self.on_break(inner);
2780            }
2781            
2782            Node::Case(inner) => {
2783                self.on_case(inner);
2784            }
2785            
2786            Node::CaseMatch(inner) => {
2787                self.on_case_match(inner);
2788            }
2789            
2790            Node::Casgn(inner) => {
2791                self.on_casgn(inner);
2792            }
2793            
2794            Node::Cbase(inner) => {
2795                self.on_cbase(inner);
2796            }
2797            
2798            Node::Class(inner) => {
2799                self.on_class(inner);
2800            }
2801            
2802            Node::Complex(inner) => {
2803                self.on_complex(inner);
2804            }
2805            
2806            Node::Const(inner) => {
2807                self.on_const(inner);
2808            }
2809            
2810            Node::ConstPattern(inner) => {
2811                self.on_const_pattern(inner);
2812            }
2813            
2814            Node::CSend(inner) => {
2815                self.on_c_send(inner);
2816            }
2817            
2818            Node::Cvar(inner) => {
2819                self.on_cvar(inner);
2820            }
2821            
2822            Node::Cvasgn(inner) => {
2823                self.on_cvasgn(inner);
2824            }
2825            
2826            Node::Def(inner) => {
2827                self.on_def(inner);
2828            }
2829            
2830            Node::Defined(inner) => {
2831                self.on_defined(inner);
2832            }
2833            
2834            Node::Defs(inner) => {
2835                self.on_defs(inner);
2836            }
2837            
2838            Node::Dstr(inner) => {
2839                self.on_dstr(inner);
2840            }
2841            
2842            Node::Dsym(inner) => {
2843                self.on_dsym(inner);
2844            }
2845            
2846            Node::EFlipFlop(inner) => {
2847                self.on_e_flip_flop(inner);
2848            }
2849            
2850            Node::EmptyElse(inner) => {
2851                self.on_empty_else(inner);
2852            }
2853            
2854            Node::Encoding(inner) => {
2855                self.on_encoding(inner);
2856            }
2857            
2858            Node::Ensure(inner) => {
2859                self.on_ensure(inner);
2860            }
2861            
2862            Node::Erange(inner) => {
2863                self.on_erange(inner);
2864            }
2865            
2866            Node::False(inner) => {
2867                self.on_false(inner);
2868            }
2869            
2870            Node::File(inner) => {
2871                self.on_file(inner);
2872            }
2873            
2874            Node::FindPattern(inner) => {
2875                self.on_find_pattern(inner);
2876            }
2877            
2878            Node::Float(inner) => {
2879                self.on_float(inner);
2880            }
2881            
2882            Node::For(inner) => {
2883                self.on_for(inner);
2884            }
2885            
2886            Node::ForwardArg(inner) => {
2887                self.on_forward_arg(inner);
2888            }
2889            
2890            Node::ForwardedArgs(inner) => {
2891                self.on_forwarded_args(inner);
2892            }
2893            
2894            Node::Gvar(inner) => {
2895                self.on_gvar(inner);
2896            }
2897            
2898            Node::Gvasgn(inner) => {
2899                self.on_gvasgn(inner);
2900            }
2901            
2902            Node::Hash(inner) => {
2903                self.on_hash(inner);
2904            }
2905            
2906            Node::HashPattern(inner) => {
2907                self.on_hash_pattern(inner);
2908            }
2909            
2910            Node::Heredoc(inner) => {
2911                self.on_heredoc(inner);
2912            }
2913            
2914            Node::If(inner) => {
2915                self.on_if(inner);
2916            }
2917            
2918            Node::IfGuard(inner) => {
2919                self.on_if_guard(inner);
2920            }
2921            
2922            Node::IFlipFlop(inner) => {
2923                self.on_i_flip_flop(inner);
2924            }
2925            
2926            Node::IfMod(inner) => {
2927                self.on_if_mod(inner);
2928            }
2929            
2930            Node::IfTernary(inner) => {
2931                self.on_if_ternary(inner);
2932            }
2933            
2934            Node::Index(inner) => {
2935                self.on_index(inner);
2936            }
2937            
2938            Node::IndexAsgn(inner) => {
2939                self.on_index_asgn(inner);
2940            }
2941            
2942            Node::InPattern(inner) => {
2943                self.on_in_pattern(inner);
2944            }
2945            
2946            Node::Int(inner) => {
2947                self.on_int(inner);
2948            }
2949            
2950            Node::Irange(inner) => {
2951                self.on_irange(inner);
2952            }
2953            
2954            Node::Ivar(inner) => {
2955                self.on_ivar(inner);
2956            }
2957            
2958            Node::Ivasgn(inner) => {
2959                self.on_ivasgn(inner);
2960            }
2961            
2962            Node::Kwarg(inner) => {
2963                self.on_kwarg(inner);
2964            }
2965            
2966            Node::Kwargs(inner) => {
2967                self.on_kwargs(inner);
2968            }
2969            
2970            Node::KwBegin(inner) => {
2971                self.on_kw_begin(inner);
2972            }
2973            
2974            Node::Kwnilarg(inner) => {
2975                self.on_kwnilarg(inner);
2976            }
2977            
2978            Node::Kwoptarg(inner) => {
2979                self.on_kwoptarg(inner);
2980            }
2981            
2982            Node::Kwrestarg(inner) => {
2983                self.on_kwrestarg(inner);
2984            }
2985            
2986            Node::Kwsplat(inner) => {
2987                self.on_kwsplat(inner);
2988            }
2989            
2990            Node::Lambda(inner) => {
2991                self.on_lambda(inner);
2992            }
2993            
2994            Node::Line(inner) => {
2995                self.on_line(inner);
2996            }
2997            
2998            Node::Lvar(inner) => {
2999                self.on_lvar(inner);
3000            }
3001            
3002            Node::Lvasgn(inner) => {
3003                self.on_lvasgn(inner);
3004            }
3005            
3006            Node::Masgn(inner) => {
3007                self.on_masgn(inner);
3008            }
3009            
3010            Node::MatchAlt(inner) => {
3011                self.on_match_alt(inner);
3012            }
3013            
3014            Node::MatchAs(inner) => {
3015                self.on_match_as(inner);
3016            }
3017            
3018            Node::MatchCurrentLine(inner) => {
3019                self.on_match_current_line(inner);
3020            }
3021            
3022            Node::MatchNilPattern(inner) => {
3023                self.on_match_nil_pattern(inner);
3024            }
3025            
3026            Node::MatchPattern(inner) => {
3027                self.on_match_pattern(inner);
3028            }
3029            
3030            Node::MatchPatternP(inner) => {
3031                self.on_match_pattern_p(inner);
3032            }
3033            
3034            Node::MatchRest(inner) => {
3035                self.on_match_rest(inner);
3036            }
3037            
3038            Node::MatchVar(inner) => {
3039                self.on_match_var(inner);
3040            }
3041            
3042            Node::MatchWithLvasgn(inner) => {
3043                self.on_match_with_lvasgn(inner);
3044            }
3045            
3046            Node::Mlhs(inner) => {
3047                self.on_mlhs(inner);
3048            }
3049            
3050            Node::Module(inner) => {
3051                self.on_module(inner);
3052            }
3053            
3054            Node::Next(inner) => {
3055                self.on_next(inner);
3056            }
3057            
3058            Node::Nil(inner) => {
3059                self.on_nil(inner);
3060            }
3061            
3062            Node::NthRef(inner) => {
3063                self.on_nth_ref(inner);
3064            }
3065            
3066            Node::Numblock(inner) => {
3067                self.on_numblock(inner);
3068            }
3069            
3070            Node::OpAsgn(inner) => {
3071                self.on_op_asgn(inner);
3072            }
3073            
3074            Node::Optarg(inner) => {
3075                self.on_optarg(inner);
3076            }
3077            
3078            Node::Or(inner) => {
3079                self.on_or(inner);
3080            }
3081            
3082            Node::OrAsgn(inner) => {
3083                self.on_or_asgn(inner);
3084            }
3085            
3086            Node::Pair(inner) => {
3087                self.on_pair(inner);
3088            }
3089            
3090            Node::Pin(inner) => {
3091                self.on_pin(inner);
3092            }
3093            
3094            Node::Postexe(inner) => {
3095                self.on_postexe(inner);
3096            }
3097            
3098            Node::Preexe(inner) => {
3099                self.on_preexe(inner);
3100            }
3101            
3102            Node::Procarg0(inner) => {
3103                self.on_procarg0(inner);
3104            }
3105            
3106            Node::Rational(inner) => {
3107                self.on_rational(inner);
3108            }
3109            
3110            Node::Redo(inner) => {
3111                self.on_redo(inner);
3112            }
3113            
3114            Node::Regexp(inner) => {
3115                self.on_regexp(inner);
3116            }
3117            
3118            Node::RegOpt(inner) => {
3119                self.on_reg_opt(inner);
3120            }
3121            
3122            Node::Rescue(inner) => {
3123                self.on_rescue(inner);
3124            }
3125            
3126            Node::RescueBody(inner) => {
3127                self.on_rescue_body(inner);
3128            }
3129            
3130            Node::Restarg(inner) => {
3131                self.on_restarg(inner);
3132            }
3133            
3134            Node::Retry(inner) => {
3135                self.on_retry(inner);
3136            }
3137            
3138            Node::Return(inner) => {
3139                self.on_return(inner);
3140            }
3141            
3142            Node::SClass(inner) => {
3143                self.on_s_class(inner);
3144            }
3145            
3146            Node::Self_(inner) => {
3147                self.on_self_(inner);
3148            }
3149            
3150            Node::Send(inner) => {
3151                self.on_send(inner);
3152            }
3153            
3154            Node::Shadowarg(inner) => {
3155                self.on_shadowarg(inner);
3156            }
3157            
3158            Node::Splat(inner) => {
3159                self.on_splat(inner);
3160            }
3161            
3162            Node::Str(inner) => {
3163                self.on_str(inner);
3164            }
3165            
3166            Node::Super(inner) => {
3167                self.on_super(inner);
3168            }
3169            
3170            Node::Sym(inner) => {
3171                self.on_sym(inner);
3172            }
3173            
3174            Node::True(inner) => {
3175                self.on_true(inner);
3176            }
3177            
3178            Node::Undef(inner) => {
3179                self.on_undef(inner);
3180            }
3181            
3182            Node::UnlessGuard(inner) => {
3183                self.on_unless_guard(inner);
3184            }
3185            
3186            Node::Until(inner) => {
3187                self.on_until(inner);
3188            }
3189            
3190            Node::UntilPost(inner) => {
3191                self.on_until_post(inner);
3192            }
3193            
3194            Node::When(inner) => {
3195                self.on_when(inner);
3196            }
3197            
3198            Node::While(inner) => {
3199                self.on_while(inner);
3200            }
3201            
3202            Node::WhilePost(inner) => {
3203                self.on_while_post(inner);
3204            }
3205            
3206            Node::XHeredoc(inner) => {
3207                self.on_x_heredoc(inner);
3208            }
3209            
3210            Node::Xstr(inner) => {
3211                self.on_xstr(inner);
3212            }
3213            
3214            Node::Yield(inner) => {
3215                self.on_yield(inner);
3216            }
3217            
3218            Node::ZSuper(inner) => {
3219                self.on_z_super(inner);
3220            }
3221            
3222        }
3223    }
3224}
3225
3226fn visit_node_list(finder: &mut Finder, nodes: &[Node]) {
3227    if let Some(PatternItem::Idx(idx)) = finder.pattern.unshift() {
3228        if let Some(item) = nodes.get(idx) {
3229            finder.visit(item)
3230        }
3231    } else {
3232        // end of the search chain, no match
3233    }
3234}