File: mutation_compiler.rb

package info (click to toggle)
ruby3.4 3.4.5-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 154,784 kB
  • sloc: ruby: 1,259,653; ansic: 829,955; yacc: 28,233; pascal: 7,359; sh: 3,864; python: 1,799; cpp: 1,158; asm: 808; makefile: 801; javascript: 414; lisp: 109; perl: 62; awk: 36; sed: 4; xml: 4
file content (769 lines) | stat: -rw-r--r-- 21,583 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
# frozen_string_literal: true

=begin
This file is generated by the templates/template.rb script and should not be
modified manually. See templates/lib/prism/mutation_compiler.rb.erb
if you are looking to modify the template
=end

module Prism
  # This visitor walks through the tree and copies each node as it is being
  # visited. This is useful for consumers that want to mutate the tree, as you
  # can change subtrees in place without effecting the rest of the tree.
  class MutationCompiler < Compiler
    # Copy a AliasGlobalVariableNode node
    def visit_alias_global_variable_node(node)
      node.copy(new_name: visit(node.new_name), old_name: visit(node.old_name))
    end

    # Copy a AliasMethodNode node
    def visit_alias_method_node(node)
      node.copy(new_name: visit(node.new_name), old_name: visit(node.old_name))
    end

    # Copy a AlternationPatternNode node
    def visit_alternation_pattern_node(node)
      node.copy(left: visit(node.left), right: visit(node.right))
    end

    # Copy a AndNode node
    def visit_and_node(node)
      node.copy(left: visit(node.left), right: visit(node.right))
    end

    # Copy a ArgumentsNode node
    def visit_arguments_node(node)
      node.copy(arguments: visit_all(node.arguments))
    end

    # Copy a ArrayNode node
    def visit_array_node(node)
      node.copy(elements: visit_all(node.elements))
    end

    # Copy a ArrayPatternNode node
    def visit_array_pattern_node(node)
      node.copy(constant: visit(node.constant), requireds: visit_all(node.requireds), rest: visit(node.rest), posts: visit_all(node.posts))
    end

    # Copy a AssocNode node
    def visit_assoc_node(node)
      node.copy(key: visit(node.key), value: visit(node.value))
    end

    # Copy a AssocSplatNode node
    def visit_assoc_splat_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a BackReferenceReadNode node
    def visit_back_reference_read_node(node)
      node.copy
    end

    # Copy a BeginNode node
    def visit_begin_node(node)
      node.copy(statements: visit(node.statements), rescue_clause: visit(node.rescue_clause), else_clause: visit(node.else_clause), ensure_clause: visit(node.ensure_clause))
    end

    # Copy a BlockArgumentNode node
    def visit_block_argument_node(node)
      node.copy(expression: visit(node.expression))
    end

    # Copy a BlockLocalVariableNode node
    def visit_block_local_variable_node(node)
      node.copy
    end

    # Copy a BlockNode node
    def visit_block_node(node)
      node.copy(parameters: visit(node.parameters), body: visit(node.body))
    end

    # Copy a BlockParameterNode node
    def visit_block_parameter_node(node)
      node.copy
    end

    # Copy a BlockParametersNode node
    def visit_block_parameters_node(node)
      node.copy(parameters: visit(node.parameters), locals: visit_all(node.locals))
    end

    # Copy a BreakNode node
    def visit_break_node(node)
      node.copy(arguments: visit(node.arguments))
    end

    # Copy a CallAndWriteNode node
    def visit_call_and_write_node(node)
      node.copy(receiver: visit(node.receiver), value: visit(node.value))
    end

    # Copy a CallNode node
    def visit_call_node(node)
      node.copy(receiver: visit(node.receiver), arguments: visit(node.arguments), block: visit(node.block))
    end

    # Copy a CallOperatorWriteNode node
    def visit_call_operator_write_node(node)
      node.copy(receiver: visit(node.receiver), value: visit(node.value))
    end

    # Copy a CallOrWriteNode node
    def visit_call_or_write_node(node)
      node.copy(receiver: visit(node.receiver), value: visit(node.value))
    end

    # Copy a CallTargetNode node
    def visit_call_target_node(node)
      node.copy(receiver: visit(node.receiver))
    end

    # Copy a CapturePatternNode node
    def visit_capture_pattern_node(node)
      node.copy(value: visit(node.value), target: visit(node.target))
    end

    # Copy a CaseMatchNode node
    def visit_case_match_node(node)
      node.copy(predicate: visit(node.predicate), conditions: visit_all(node.conditions), else_clause: visit(node.else_clause))
    end

    # Copy a CaseNode node
    def visit_case_node(node)
      node.copy(predicate: visit(node.predicate), conditions: visit_all(node.conditions), else_clause: visit(node.else_clause))
    end

    # Copy a ClassNode node
    def visit_class_node(node)
      node.copy(constant_path: visit(node.constant_path), superclass: visit(node.superclass), body: visit(node.body))
    end

    # Copy a ClassVariableAndWriteNode node
    def visit_class_variable_and_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a ClassVariableOperatorWriteNode node
    def visit_class_variable_operator_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a ClassVariableOrWriteNode node
    def visit_class_variable_or_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a ClassVariableReadNode node
    def visit_class_variable_read_node(node)
      node.copy
    end

    # Copy a ClassVariableTargetNode node
    def visit_class_variable_target_node(node)
      node.copy
    end

    # Copy a ClassVariableWriteNode node
    def visit_class_variable_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a ConstantAndWriteNode node
    def visit_constant_and_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a ConstantOperatorWriteNode node
    def visit_constant_operator_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a ConstantOrWriteNode node
    def visit_constant_or_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a ConstantPathAndWriteNode node
    def visit_constant_path_and_write_node(node)
      node.copy(target: visit(node.target), value: visit(node.value))
    end

    # Copy a ConstantPathNode node
    def visit_constant_path_node(node)
      node.copy(parent: visit(node.parent))
    end

    # Copy a ConstantPathOperatorWriteNode node
    def visit_constant_path_operator_write_node(node)
      node.copy(target: visit(node.target), value: visit(node.value))
    end

    # Copy a ConstantPathOrWriteNode node
    def visit_constant_path_or_write_node(node)
      node.copy(target: visit(node.target), value: visit(node.value))
    end

    # Copy a ConstantPathTargetNode node
    def visit_constant_path_target_node(node)
      node.copy(parent: visit(node.parent))
    end

    # Copy a ConstantPathWriteNode node
    def visit_constant_path_write_node(node)
      node.copy(target: visit(node.target), value: visit(node.value))
    end

    # Copy a ConstantReadNode node
    def visit_constant_read_node(node)
      node.copy
    end

    # Copy a ConstantTargetNode node
    def visit_constant_target_node(node)
      node.copy
    end

    # Copy a ConstantWriteNode node
    def visit_constant_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a DefNode node
    def visit_def_node(node)
      node.copy(receiver: visit(node.receiver), parameters: visit(node.parameters), body: visit(node.body))
    end

    # Copy a DefinedNode node
    def visit_defined_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a ElseNode node
    def visit_else_node(node)
      node.copy(statements: visit(node.statements))
    end

    # Copy a EmbeddedStatementsNode node
    def visit_embedded_statements_node(node)
      node.copy(statements: visit(node.statements))
    end

    # Copy a EmbeddedVariableNode node
    def visit_embedded_variable_node(node)
      node.copy(variable: visit(node.variable))
    end

    # Copy a EnsureNode node
    def visit_ensure_node(node)
      node.copy(statements: visit(node.statements))
    end

    # Copy a FalseNode node
    def visit_false_node(node)
      node.copy
    end

    # Copy a FindPatternNode node
    def visit_find_pattern_node(node)
      node.copy(constant: visit(node.constant), left: visit(node.left), requireds: visit_all(node.requireds), right: visit(node.right))
    end

    # Copy a FlipFlopNode node
    def visit_flip_flop_node(node)
      node.copy(left: visit(node.left), right: visit(node.right))
    end

    # Copy a FloatNode node
    def visit_float_node(node)
      node.copy
    end

    # Copy a ForNode node
    def visit_for_node(node)
      node.copy(index: visit(node.index), collection: visit(node.collection), statements: visit(node.statements))
    end

    # Copy a ForwardingArgumentsNode node
    def visit_forwarding_arguments_node(node)
      node.copy
    end

    # Copy a ForwardingParameterNode node
    def visit_forwarding_parameter_node(node)
      node.copy
    end

    # Copy a ForwardingSuperNode node
    def visit_forwarding_super_node(node)
      node.copy(block: visit(node.block))
    end

    # Copy a GlobalVariableAndWriteNode node
    def visit_global_variable_and_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a GlobalVariableOperatorWriteNode node
    def visit_global_variable_operator_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a GlobalVariableOrWriteNode node
    def visit_global_variable_or_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a GlobalVariableReadNode node
    def visit_global_variable_read_node(node)
      node.copy
    end

    # Copy a GlobalVariableTargetNode node
    def visit_global_variable_target_node(node)
      node.copy
    end

    # Copy a GlobalVariableWriteNode node
    def visit_global_variable_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a HashNode node
    def visit_hash_node(node)
      node.copy(elements: visit_all(node.elements))
    end

    # Copy a HashPatternNode node
    def visit_hash_pattern_node(node)
      node.copy(constant: visit(node.constant), elements: visit_all(node.elements), rest: visit(node.rest))
    end

    # Copy a IfNode node
    def visit_if_node(node)
      node.copy(predicate: visit(node.predicate), statements: visit(node.statements), subsequent: visit(node.subsequent))
    end

    # Copy a ImaginaryNode node
    def visit_imaginary_node(node)
      node.copy(numeric: visit(node.numeric))
    end

    # Copy a ImplicitNode node
    def visit_implicit_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a ImplicitRestNode node
    def visit_implicit_rest_node(node)
      node.copy
    end

    # Copy a InNode node
    def visit_in_node(node)
      node.copy(pattern: visit(node.pattern), statements: visit(node.statements))
    end

    # Copy a IndexAndWriteNode node
    def visit_index_and_write_node(node)
      node.copy(receiver: visit(node.receiver), arguments: visit(node.arguments), block: visit(node.block), value: visit(node.value))
    end

    # Copy a IndexOperatorWriteNode node
    def visit_index_operator_write_node(node)
      node.copy(receiver: visit(node.receiver), arguments: visit(node.arguments), block: visit(node.block), value: visit(node.value))
    end

    # Copy a IndexOrWriteNode node
    def visit_index_or_write_node(node)
      node.copy(receiver: visit(node.receiver), arguments: visit(node.arguments), block: visit(node.block), value: visit(node.value))
    end

    # Copy a IndexTargetNode node
    def visit_index_target_node(node)
      node.copy(receiver: visit(node.receiver), arguments: visit(node.arguments), block: visit(node.block))
    end

    # Copy a InstanceVariableAndWriteNode node
    def visit_instance_variable_and_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a InstanceVariableOperatorWriteNode node
    def visit_instance_variable_operator_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a InstanceVariableOrWriteNode node
    def visit_instance_variable_or_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a InstanceVariableReadNode node
    def visit_instance_variable_read_node(node)
      node.copy
    end

    # Copy a InstanceVariableTargetNode node
    def visit_instance_variable_target_node(node)
      node.copy
    end

    # Copy a InstanceVariableWriteNode node
    def visit_instance_variable_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a IntegerNode node
    def visit_integer_node(node)
      node.copy
    end

    # Copy a InterpolatedMatchLastLineNode node
    def visit_interpolated_match_last_line_node(node)
      node.copy(parts: visit_all(node.parts))
    end

    # Copy a InterpolatedRegularExpressionNode node
    def visit_interpolated_regular_expression_node(node)
      node.copy(parts: visit_all(node.parts))
    end

    # Copy a InterpolatedStringNode node
    def visit_interpolated_string_node(node)
      node.copy(parts: visit_all(node.parts))
    end

    # Copy a InterpolatedSymbolNode node
    def visit_interpolated_symbol_node(node)
      node.copy(parts: visit_all(node.parts))
    end

    # Copy a InterpolatedXStringNode node
    def visit_interpolated_x_string_node(node)
      node.copy(parts: visit_all(node.parts))
    end

    # Copy a ItLocalVariableReadNode node
    def visit_it_local_variable_read_node(node)
      node.copy
    end

    # Copy a ItParametersNode node
    def visit_it_parameters_node(node)
      node.copy
    end

    # Copy a KeywordHashNode node
    def visit_keyword_hash_node(node)
      node.copy(elements: visit_all(node.elements))
    end

    # Copy a KeywordRestParameterNode node
    def visit_keyword_rest_parameter_node(node)
      node.copy
    end

    # Copy a LambdaNode node
    def visit_lambda_node(node)
      node.copy(parameters: visit(node.parameters), body: visit(node.body))
    end

    # Copy a LocalVariableAndWriteNode node
    def visit_local_variable_and_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a LocalVariableOperatorWriteNode node
    def visit_local_variable_operator_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a LocalVariableOrWriteNode node
    def visit_local_variable_or_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a LocalVariableReadNode node
    def visit_local_variable_read_node(node)
      node.copy
    end

    # Copy a LocalVariableTargetNode node
    def visit_local_variable_target_node(node)
      node.copy
    end

    # Copy a LocalVariableWriteNode node
    def visit_local_variable_write_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a MatchLastLineNode node
    def visit_match_last_line_node(node)
      node.copy
    end

    # Copy a MatchPredicateNode node
    def visit_match_predicate_node(node)
      node.copy(value: visit(node.value), pattern: visit(node.pattern))
    end

    # Copy a MatchRequiredNode node
    def visit_match_required_node(node)
      node.copy(value: visit(node.value), pattern: visit(node.pattern))
    end

    # Copy a MatchWriteNode node
    def visit_match_write_node(node)
      node.copy(call: visit(node.call), targets: visit_all(node.targets))
    end

    # Copy a MissingNode node
    def visit_missing_node(node)
      node.copy
    end

    # Copy a ModuleNode node
    def visit_module_node(node)
      node.copy(constant_path: visit(node.constant_path), body: visit(node.body))
    end

    # Copy a MultiTargetNode node
    def visit_multi_target_node(node)
      node.copy(lefts: visit_all(node.lefts), rest: visit(node.rest), rights: visit_all(node.rights))
    end

    # Copy a MultiWriteNode node
    def visit_multi_write_node(node)
      node.copy(lefts: visit_all(node.lefts), rest: visit(node.rest), rights: visit_all(node.rights), value: visit(node.value))
    end

    # Copy a NextNode node
    def visit_next_node(node)
      node.copy(arguments: visit(node.arguments))
    end

    # Copy a NilNode node
    def visit_nil_node(node)
      node.copy
    end

    # Copy a NoKeywordsParameterNode node
    def visit_no_keywords_parameter_node(node)
      node.copy
    end

    # Copy a NumberedParametersNode node
    def visit_numbered_parameters_node(node)
      node.copy
    end

    # Copy a NumberedReferenceReadNode node
    def visit_numbered_reference_read_node(node)
      node.copy
    end

    # Copy a OptionalKeywordParameterNode node
    def visit_optional_keyword_parameter_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a OptionalParameterNode node
    def visit_optional_parameter_node(node)
      node.copy(value: visit(node.value))
    end

    # Copy a OrNode node
    def visit_or_node(node)
      node.copy(left: visit(node.left), right: visit(node.right))
    end

    # Copy a ParametersNode node
    def visit_parameters_node(node)
      node.copy(requireds: visit_all(node.requireds), optionals: visit_all(node.optionals), rest: visit(node.rest), posts: visit_all(node.posts), keywords: visit_all(node.keywords), keyword_rest: visit(node.keyword_rest), block: visit(node.block))
    end

    # Copy a ParenthesesNode node
    def visit_parentheses_node(node)
      node.copy(body: visit(node.body))
    end

    # Copy a PinnedExpressionNode node
    def visit_pinned_expression_node(node)
      node.copy(expression: visit(node.expression))
    end

    # Copy a PinnedVariableNode node
    def visit_pinned_variable_node(node)
      node.copy(variable: visit(node.variable))
    end

    # Copy a PostExecutionNode node
    def visit_post_execution_node(node)
      node.copy(statements: visit(node.statements))
    end

    # Copy a PreExecutionNode node
    def visit_pre_execution_node(node)
      node.copy(statements: visit(node.statements))
    end

    # Copy a ProgramNode node
    def visit_program_node(node)
      node.copy(statements: visit(node.statements))
    end

    # Copy a RangeNode node
    def visit_range_node(node)
      node.copy(left: visit(node.left), right: visit(node.right))
    end

    # Copy a RationalNode node
    def visit_rational_node(node)
      node.copy
    end

    # Copy a RedoNode node
    def visit_redo_node(node)
      node.copy
    end

    # Copy a RegularExpressionNode node
    def visit_regular_expression_node(node)
      node.copy
    end

    # Copy a RequiredKeywordParameterNode node
    def visit_required_keyword_parameter_node(node)
      node.copy
    end

    # Copy a RequiredParameterNode node
    def visit_required_parameter_node(node)
      node.copy
    end

    # Copy a RescueModifierNode node
    def visit_rescue_modifier_node(node)
      node.copy(expression: visit(node.expression), rescue_expression: visit(node.rescue_expression))
    end

    # Copy a RescueNode node
    def visit_rescue_node(node)
      node.copy(exceptions: visit_all(node.exceptions), reference: visit(node.reference), statements: visit(node.statements), subsequent: visit(node.subsequent))
    end

    # Copy a RestParameterNode node
    def visit_rest_parameter_node(node)
      node.copy
    end

    # Copy a RetryNode node
    def visit_retry_node(node)
      node.copy
    end

    # Copy a ReturnNode node
    def visit_return_node(node)
      node.copy(arguments: visit(node.arguments))
    end

    # Copy a SelfNode node
    def visit_self_node(node)
      node.copy
    end

    # Copy a ShareableConstantNode node
    def visit_shareable_constant_node(node)
      node.copy(write: visit(node.write))
    end

    # Copy a SingletonClassNode node
    def visit_singleton_class_node(node)
      node.copy(expression: visit(node.expression), body: visit(node.body))
    end

    # Copy a SourceEncodingNode node
    def visit_source_encoding_node(node)
      node.copy
    end

    # Copy a SourceFileNode node
    def visit_source_file_node(node)
      node.copy
    end

    # Copy a SourceLineNode node
    def visit_source_line_node(node)
      node.copy
    end

    # Copy a SplatNode node
    def visit_splat_node(node)
      node.copy(expression: visit(node.expression))
    end

    # Copy a StatementsNode node
    def visit_statements_node(node)
      node.copy(body: visit_all(node.body))
    end

    # Copy a StringNode node
    def visit_string_node(node)
      node.copy
    end

    # Copy a SuperNode node
    def visit_super_node(node)
      node.copy(arguments: visit(node.arguments), block: visit(node.block))
    end

    # Copy a SymbolNode node
    def visit_symbol_node(node)
      node.copy
    end

    # Copy a TrueNode node
    def visit_true_node(node)
      node.copy
    end

    # Copy a UndefNode node
    def visit_undef_node(node)
      node.copy(names: visit_all(node.names))
    end

    # Copy a UnlessNode node
    def visit_unless_node(node)
      node.copy(predicate: visit(node.predicate), statements: visit(node.statements), else_clause: visit(node.else_clause))
    end

    # Copy a UntilNode node
    def visit_until_node(node)
      node.copy(predicate: visit(node.predicate), statements: visit(node.statements))
    end

    # Copy a WhenNode node
    def visit_when_node(node)
      node.copy(conditions: visit_all(node.conditions), statements: visit(node.statements))
    end

    # Copy a WhileNode node
    def visit_while_node(node)
      node.copy(predicate: visit(node.predicate), statements: visit(node.statements))
    end

    # Copy a XStringNode node
    def visit_x_string_node(node)
      node.copy
    end

    # Copy a YieldNode node
    def visit_yield_node(node)
      node.copy(arguments: visit(node.arguments))
    end
  end
end