prism 2.0.0.rc2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -2
  3. data/docs/serialization.md +19 -6
  4. data/ext/prism/api_node.c +80 -80
  5. data/ext/prism/extension.c +34 -67
  6. data/ext/prism/extension.h +1 -1
  7. data/include/prism/arena.h +8 -0
  8. data/include/prism/arena.hpp +42 -0
  9. data/include/prism/ast.h +11 -1
  10. data/include/prism/ast.hpp +641 -0
  11. data/include/prism/buffer.h +8 -0
  12. data/include/prism/buffer.hpp +55 -0
  13. data/include/prism/comments.h +17 -0
  14. data/include/prism/compiler/branch.h +26 -0
  15. data/include/prism/compiler/cplusplus.hpp +16 -0
  16. data/include/prism/compiler/exceptions.hpp +17 -0
  17. data/include/prism/compiler/format.h +2 -0
  18. data/include/prism/compiler/lifetimebound.hpp +25 -0
  19. data/include/prism/constant_pool.h +25 -0
  20. data/include/prism/diagnostic.h +18 -0
  21. data/include/prism/errors_format.h +8 -0
  22. data/include/prism/internal/node.h +8 -4
  23. data/include/prism/internal/stringy.h +1 -6
  24. data/include/prism/json.h +8 -0
  25. data/include/prism/line_offset_list.h +8 -0
  26. data/include/prism/magic_comments.h +18 -0
  27. data/include/prism/node.h +55 -10
  28. data/include/prism/node.hpp +272 -0
  29. data/include/prism/node_type.hpp +38 -0
  30. data/include/prism/options.h +10 -1
  31. data/include/prism/options.hpp +43 -0
  32. data/include/prism/parser.h +72 -64
  33. data/include/prism/parser.hpp +274 -0
  34. data/include/prism/prettyprint.h +8 -0
  35. data/include/prism/serialize.h +8 -0
  36. data/include/prism/source.h +8 -0
  37. data/include/prism/stream.h +8 -0
  38. data/include/prism/string_query.h +8 -0
  39. data/include/prism/stringy.h +16 -27
  40. data/include/prism/stringy.hpp +31 -0
  41. data/include/prism/version.h +9 -1
  42. data/include/prism.h +0 -8
  43. data/include/prism.hpp +24 -0
  44. data/lib/prism/serialize.rb +2549 -3281
  45. data/prism.gemspec +14 -1
  46. data/rbi/generated/prism/node.rbi +736 -0
  47. data/rbi/generated/prism/serialize.rbi +6 -5
  48. data/sig/generated/prism/node.rbs +736 -0
  49. data/sig/generated/prism/serialize.rbs +7 -5
  50. data/src/comments.c +2 -2
  51. data/src/diagnostic.c +8 -0
  52. data/src/node.c +216 -368
  53. data/src/options.c +7 -13
  54. data/src/parser.c +52 -48
  55. data/src/prism.c +175 -194
  56. data/src/regexp.c +0 -1
  57. data/src/serialize.c +2300 -1950
  58. data/src/source.c +8 -2
  59. data/src/stringy.c +3 -33
  60. metadata +14 -1
data/src/node.c CHANGED
@@ -51,8 +51,8 @@ pm_node_list_grow(pm_arena_t *arena, pm_node_list_t *list, size_t size) {
51
51
  }
52
52
 
53
53
  /**
54
- * Slow path for pm_node_list_append: grow the list and append the node.
55
- * Do not call directly - use pm_node_list_append instead.
54
+ * Slow path for pm_node_list_append_inline: grow the list and append the node.
55
+ * Do not call directly - use pm_node_list_append_inline instead.
56
56
  */
57
57
  void
58
58
  pm_node_list_append_slow(pm_arena_t *arena, pm_node_list_t *list, pm_node_t *node) {
@@ -60,6 +60,14 @@ pm_node_list_append_slow(pm_arena_t *arena, pm_node_list_t *list, pm_node_t *nod
60
60
  list->nodes[list->size++] = node;
61
61
  }
62
62
 
63
+ /**
64
+ * Append a new node onto the end of the node list.
65
+ */
66
+ void
67
+ pm_node_list_append(pm_arena_t *arena, pm_node_list_t *list, pm_node_t *node) {
68
+ pm_node_list_append_inline(arena, list, node);
69
+ }
70
+
63
71
  /**
64
72
  * Prepend a new node onto the beginning of the node list.
65
73
  */
@@ -400,33 +408,35 @@ pm_node_type(pm_node_type_t node_type)
400
408
 
401
409
  /**
402
410
  * Visit each of the nodes in this subtree using the given visitor callback. The
403
- * callback function will be called for each node in the subtree. If it returns
404
- * false, then that node's children will not be visited. If it returns true,
405
- * then the children will be visited. The data parameter is treated as an opaque
406
- * pointer and is passed to the visitor callback for consumers to use as they
407
- * see fit.
411
+ * callback function will be called for each node in the subtree, and its
412
+ * return value determines whether the walk visits that node's children, skips
413
+ * them, or stops entirely. The data parameter is treated as an opaque pointer
414
+ * and is passed to the visitor callback for consumers to use as they see fit.
408
415
  */
409
- void
410
- pm_visit_node(const pm_node_t *node, bool (*visitor)(const pm_node_t *node, void *data), void *data) {
411
- if (visitor(node, data)) pm_visit_child_nodes(node, visitor, data);
416
+ bool
417
+ pm_visit_node(const pm_node_t *node, pm_visit_callback_t visitor, void *data) {
418
+ pm_visit_result_t result = visitor(node, data);
419
+ if (result == PM_VISIT_DESCEND) return pm_visit_child_nodes(node, visitor, data);
420
+ return result != PM_VISIT_STOP;
412
421
  }
413
422
 
414
423
  /**
415
424
  * Visit the children of the given node with the given callback. This is the
416
425
  * default behavior for walking the tree that is called from pm_visit_node if
417
- * the callback returns true.
426
+ * the callback returns PM_VISIT_DESCEND. A stop from any child returns false
427
+ * immediately, so that it propagates up through every enclosing call.
418
428
  */
419
- void
420
- pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *node, void *data), void *data) {
429
+ bool
430
+ pm_visit_child_nodes(const pm_node_t *node, pm_visit_callback_t visitor, void *data) {
421
431
  switch (PM_NODE_TYPE(node)) {
422
432
  case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
423
433
  const pm_alias_global_variable_node_t *cast = (const pm_alias_global_variable_node_t *) node;
424
434
 
425
435
  // Visit the new_name field
426
- pm_visit_node((const pm_node_t *) cast->new_name, visitor, data);
436
+ if (!pm_visit_node((const pm_node_t *) cast->new_name, visitor, data)) return false;
427
437
 
428
438
  // Visit the old_name field
429
- pm_visit_node((const pm_node_t *) cast->old_name, visitor, data);
439
+ if (!pm_visit_node((const pm_node_t *) cast->old_name, visitor, data)) return false;
430
440
 
431
441
  break;
432
442
  }
@@ -434,10 +444,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
434
444
  const pm_alias_method_node_t *cast = (const pm_alias_method_node_t *) node;
435
445
 
436
446
  // Visit the new_name field
437
- pm_visit_node((const pm_node_t *) cast->new_name, visitor, data);
447
+ if (!pm_visit_node((const pm_node_t *) cast->new_name, visitor, data)) return false;
438
448
 
439
449
  // Visit the old_name field
440
- pm_visit_node((const pm_node_t *) cast->old_name, visitor, data);
450
+ if (!pm_visit_node((const pm_node_t *) cast->old_name, visitor, data)) return false;
441
451
 
442
452
  break;
443
453
  }
@@ -445,10 +455,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
445
455
  const pm_alternation_pattern_node_t *cast = (const pm_alternation_pattern_node_t *) node;
446
456
 
447
457
  // Visit the left field
448
- pm_visit_node((const pm_node_t *) cast->left, visitor, data);
458
+ if (!pm_visit_node((const pm_node_t *) cast->left, visitor, data)) return false;
449
459
 
450
460
  // Visit the right field
451
- pm_visit_node((const pm_node_t *) cast->right, visitor, data);
461
+ if (!pm_visit_node((const pm_node_t *) cast->right, visitor, data)) return false;
452
462
 
453
463
  break;
454
464
  }
@@ -456,10 +466,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
456
466
  const pm_and_node_t *cast = (const pm_and_node_t *) node;
457
467
 
458
468
  // Visit the left field
459
- pm_visit_node((const pm_node_t *) cast->left, visitor, data);
469
+ if (!pm_visit_node((const pm_node_t *) cast->left, visitor, data)) return false;
460
470
 
461
471
  // Visit the right field
462
- pm_visit_node((const pm_node_t *) cast->right, visitor, data);
472
+ if (!pm_visit_node((const pm_node_t *) cast->right, visitor, data)) return false;
463
473
 
464
474
  break;
465
475
  }
@@ -469,7 +479,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
469
479
  // Visit the arguments field
470
480
  const pm_node_list_t *arguments = &cast->arguments;
471
481
  for (size_t index = 0; index < arguments->size; index++) {
472
- pm_visit_node(arguments->nodes[index], visitor, data);
482
+ if (!pm_visit_node(arguments->nodes[index], visitor, data)) return false;
473
483
  }
474
484
 
475
485
  break;
@@ -480,7 +490,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
480
490
  // Visit the elements field
481
491
  const pm_node_list_t *elements = &cast->elements;
482
492
  for (size_t index = 0; index < elements->size; index++) {
483
- pm_visit_node(elements->nodes[index], visitor, data);
493
+ if (!pm_visit_node(elements->nodes[index], visitor, data)) return false;
484
494
  }
485
495
 
486
496
  break;
@@ -489,25 +499,21 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
489
499
  const pm_array_pattern_node_t *cast = (const pm_array_pattern_node_t *) node;
490
500
 
491
501
  // Visit the constant field
492
- if (cast->constant != NULL) {
493
- pm_visit_node((const pm_node_t *) cast->constant, visitor, data);
494
- }
502
+ if (cast->constant != NULL && !pm_visit_node((const pm_node_t *) cast->constant, visitor, data)) return false;
495
503
 
496
504
  // Visit the requireds field
497
505
  const pm_node_list_t *requireds = &cast->requireds;
498
506
  for (size_t index = 0; index < requireds->size; index++) {
499
- pm_visit_node(requireds->nodes[index], visitor, data);
507
+ if (!pm_visit_node(requireds->nodes[index], visitor, data)) return false;
500
508
  }
501
509
 
502
510
  // Visit the rest field
503
- if (cast->rest != NULL) {
504
- pm_visit_node((const pm_node_t *) cast->rest, visitor, data);
505
- }
511
+ if (cast->rest != NULL && !pm_visit_node((const pm_node_t *) cast->rest, visitor, data)) return false;
506
512
 
507
513
  // Visit the posts field
508
514
  const pm_node_list_t *posts = &cast->posts;
509
515
  for (size_t index = 0; index < posts->size; index++) {
510
- pm_visit_node(posts->nodes[index], visitor, data);
516
+ if (!pm_visit_node(posts->nodes[index], visitor, data)) return false;
511
517
  }
512
518
 
513
519
  break;
@@ -516,10 +522,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
516
522
  const pm_assoc_node_t *cast = (const pm_assoc_node_t *) node;
517
523
 
518
524
  // Visit the key field
519
- pm_visit_node((const pm_node_t *) cast->key, visitor, data);
525
+ if (!pm_visit_node((const pm_node_t *) cast->key, visitor, data)) return false;
520
526
 
521
527
  // Visit the value field
522
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
528
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
523
529
 
524
530
  break;
525
531
  }
@@ -527,9 +533,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
527
533
  const pm_assoc_splat_node_t *cast = (const pm_assoc_splat_node_t *) node;
528
534
 
529
535
  // Visit the value field
530
- if (cast->value != NULL) {
531
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
532
- }
536
+ if (cast->value != NULL && !pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
533
537
 
534
538
  break;
535
539
  }
@@ -539,24 +543,16 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
539
543
  const pm_begin_node_t *cast = (const pm_begin_node_t *) node;
540
544
 
541
545
  // Visit the statements field
542
- if (cast->statements != NULL) {
543
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
544
- }
546
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
545
547
 
546
548
  // Visit the rescue_clause field
547
- if (cast->rescue_clause != NULL) {
548
- pm_visit_node((const pm_node_t *) cast->rescue_clause, visitor, data);
549
- }
549
+ if (cast->rescue_clause != NULL && !pm_visit_node((const pm_node_t *) cast->rescue_clause, visitor, data)) return false;
550
550
 
551
551
  // Visit the else_clause field
552
- if (cast->else_clause != NULL) {
553
- pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data);
554
- }
552
+ if (cast->else_clause != NULL && !pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data)) return false;
555
553
 
556
554
  // Visit the ensure_clause field
557
- if (cast->ensure_clause != NULL) {
558
- pm_visit_node((const pm_node_t *) cast->ensure_clause, visitor, data);
559
- }
555
+ if (cast->ensure_clause != NULL && !pm_visit_node((const pm_node_t *) cast->ensure_clause, visitor, data)) return false;
560
556
 
561
557
  break;
562
558
  }
@@ -564,9 +560,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
564
560
  const pm_block_argument_node_t *cast = (const pm_block_argument_node_t *) node;
565
561
 
566
562
  // Visit the expression field
567
- if (cast->expression != NULL) {
568
- pm_visit_node((const pm_node_t *) cast->expression, visitor, data);
569
- }
563
+ if (cast->expression != NULL && !pm_visit_node((const pm_node_t *) cast->expression, visitor, data)) return false;
570
564
 
571
565
  break;
572
566
  }
@@ -576,14 +570,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
576
570
  const pm_block_node_t *cast = (const pm_block_node_t *) node;
577
571
 
578
572
  // Visit the parameters field
579
- if (cast->parameters != NULL) {
580
- pm_visit_node((const pm_node_t *) cast->parameters, visitor, data);
581
- }
573
+ if (cast->parameters != NULL && !pm_visit_node((const pm_node_t *) cast->parameters, visitor, data)) return false;
582
574
 
583
575
  // Visit the body field
584
- if (cast->body != NULL) {
585
- pm_visit_node((const pm_node_t *) cast->body, visitor, data);
586
- }
576
+ if (cast->body != NULL && !pm_visit_node((const pm_node_t *) cast->body, visitor, data)) return false;
587
577
 
588
578
  break;
589
579
  }
@@ -593,14 +583,12 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
593
583
  const pm_block_parameters_node_t *cast = (const pm_block_parameters_node_t *) node;
594
584
 
595
585
  // Visit the parameters field
596
- if (cast->parameters != NULL) {
597
- pm_visit_node((const pm_node_t *) cast->parameters, visitor, data);
598
- }
586
+ if (cast->parameters != NULL && !pm_visit_node((const pm_node_t *) cast->parameters, visitor, data)) return false;
599
587
 
600
588
  // Visit the locals field
601
589
  const pm_node_list_t *locals = &cast->locals;
602
590
  for (size_t index = 0; index < locals->size; index++) {
603
- pm_visit_node(locals->nodes[index], visitor, data);
591
+ if (!pm_visit_node(locals->nodes[index], visitor, data)) return false;
604
592
  }
605
593
 
606
594
  break;
@@ -609,9 +597,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
609
597
  const pm_break_node_t *cast = (const pm_break_node_t *) node;
610
598
 
611
599
  // Visit the arguments field
612
- if (cast->arguments != NULL) {
613
- pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
614
- }
600
+ if (cast->arguments != NULL && !pm_visit_node((const pm_node_t *) cast->arguments, visitor, data)) return false;
615
601
 
616
602
  break;
617
603
  }
@@ -619,12 +605,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
619
605
  const pm_call_and_write_node_t *cast = (const pm_call_and_write_node_t *) node;
620
606
 
621
607
  // Visit the receiver field
622
- if (cast->receiver != NULL) {
623
- pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
624
- }
608
+ if (cast->receiver != NULL && !pm_visit_node((const pm_node_t *) cast->receiver, visitor, data)) return false;
625
609
 
626
610
  // Visit the value field
627
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
611
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
628
612
 
629
613
  break;
630
614
  }
@@ -632,19 +616,13 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
632
616
  const pm_call_node_t *cast = (const pm_call_node_t *) node;
633
617
 
634
618
  // Visit the receiver field
635
- if (cast->receiver != NULL) {
636
- pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
637
- }
619
+ if (cast->receiver != NULL && !pm_visit_node((const pm_node_t *) cast->receiver, visitor, data)) return false;
638
620
 
639
621
  // Visit the arguments field
640
- if (cast->arguments != NULL) {
641
- pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
642
- }
622
+ if (cast->arguments != NULL && !pm_visit_node((const pm_node_t *) cast->arguments, visitor, data)) return false;
643
623
 
644
624
  // Visit the block field
645
- if (cast->block != NULL) {
646
- pm_visit_node((const pm_node_t *) cast->block, visitor, data);
647
- }
625
+ if (cast->block != NULL && !pm_visit_node((const pm_node_t *) cast->block, visitor, data)) return false;
648
626
 
649
627
  break;
650
628
  }
@@ -652,12 +630,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
652
630
  const pm_call_operator_write_node_t *cast = (const pm_call_operator_write_node_t *) node;
653
631
 
654
632
  // Visit the receiver field
655
- if (cast->receiver != NULL) {
656
- pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
657
- }
633
+ if (cast->receiver != NULL && !pm_visit_node((const pm_node_t *) cast->receiver, visitor, data)) return false;
658
634
 
659
635
  // Visit the value field
660
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
636
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
661
637
 
662
638
  break;
663
639
  }
@@ -665,12 +641,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
665
641
  const pm_call_or_write_node_t *cast = (const pm_call_or_write_node_t *) node;
666
642
 
667
643
  // Visit the receiver field
668
- if (cast->receiver != NULL) {
669
- pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
670
- }
644
+ if (cast->receiver != NULL && !pm_visit_node((const pm_node_t *) cast->receiver, visitor, data)) return false;
671
645
 
672
646
  // Visit the value field
673
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
647
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
674
648
 
675
649
  break;
676
650
  }
@@ -678,7 +652,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
678
652
  const pm_call_target_node_t *cast = (const pm_call_target_node_t *) node;
679
653
 
680
654
  // Visit the receiver field
681
- pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
655
+ if (!pm_visit_node((const pm_node_t *) cast->receiver, visitor, data)) return false;
682
656
 
683
657
  break;
684
658
  }
@@ -686,10 +660,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
686
660
  const pm_capture_pattern_node_t *cast = (const pm_capture_pattern_node_t *) node;
687
661
 
688
662
  // Visit the value field
689
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
663
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
690
664
 
691
665
  // Visit the target field
692
- pm_visit_node((const pm_node_t *) cast->target, visitor, data);
666
+ if (!pm_visit_node((const pm_node_t *) cast->target, visitor, data)) return false;
693
667
 
694
668
  break;
695
669
  }
@@ -697,20 +671,16 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
697
671
  const pm_case_match_node_t *cast = (const pm_case_match_node_t *) node;
698
672
 
699
673
  // Visit the predicate field
700
- if (cast->predicate != NULL) {
701
- pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
702
- }
674
+ if (cast->predicate != NULL && !pm_visit_node((const pm_node_t *) cast->predicate, visitor, data)) return false;
703
675
 
704
676
  // Visit the conditions field
705
677
  const pm_node_list_t *conditions = &cast->conditions;
706
678
  for (size_t index = 0; index < conditions->size; index++) {
707
- pm_visit_node(conditions->nodes[index], visitor, data);
679
+ if (!pm_visit_node(conditions->nodes[index], visitor, data)) return false;
708
680
  }
709
681
 
710
682
  // Visit the else_clause field
711
- if (cast->else_clause != NULL) {
712
- pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data);
713
- }
683
+ if (cast->else_clause != NULL && !pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data)) return false;
714
684
 
715
685
  break;
716
686
  }
@@ -718,20 +688,16 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
718
688
  const pm_case_node_t *cast = (const pm_case_node_t *) node;
719
689
 
720
690
  // Visit the predicate field
721
- if (cast->predicate != NULL) {
722
- pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
723
- }
691
+ if (cast->predicate != NULL && !pm_visit_node((const pm_node_t *) cast->predicate, visitor, data)) return false;
724
692
 
725
693
  // Visit the conditions field
726
694
  const pm_node_list_t *conditions = &cast->conditions;
727
695
  for (size_t index = 0; index < conditions->size; index++) {
728
- pm_visit_node(conditions->nodes[index], visitor, data);
696
+ if (!pm_visit_node(conditions->nodes[index], visitor, data)) return false;
729
697
  }
730
698
 
731
699
  // Visit the else_clause field
732
- if (cast->else_clause != NULL) {
733
- pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data);
734
- }
700
+ if (cast->else_clause != NULL && !pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data)) return false;
735
701
 
736
702
  break;
737
703
  }
@@ -739,17 +705,13 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
739
705
  const pm_class_node_t *cast = (const pm_class_node_t *) node;
740
706
 
741
707
  // Visit the constant_path field
742
- pm_visit_node((const pm_node_t *) cast->constant_path, visitor, data);
708
+ if (!pm_visit_node((const pm_node_t *) cast->constant_path, visitor, data)) return false;
743
709
 
744
710
  // Visit the superclass field
745
- if (cast->superclass != NULL) {
746
- pm_visit_node((const pm_node_t *) cast->superclass, visitor, data);
747
- }
711
+ if (cast->superclass != NULL && !pm_visit_node((const pm_node_t *) cast->superclass, visitor, data)) return false;
748
712
 
749
713
  // Visit the body field
750
- if (cast->body != NULL) {
751
- pm_visit_node((const pm_node_t *) cast->body, visitor, data);
752
- }
714
+ if (cast->body != NULL && !pm_visit_node((const pm_node_t *) cast->body, visitor, data)) return false;
753
715
 
754
716
  break;
755
717
  }
@@ -757,7 +719,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
757
719
  const pm_class_variable_and_write_node_t *cast = (const pm_class_variable_and_write_node_t *) node;
758
720
 
759
721
  // Visit the value field
760
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
722
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
761
723
 
762
724
  break;
763
725
  }
@@ -765,7 +727,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
765
727
  const pm_class_variable_operator_write_node_t *cast = (const pm_class_variable_operator_write_node_t *) node;
766
728
 
767
729
  // Visit the value field
768
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
730
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
769
731
 
770
732
  break;
771
733
  }
@@ -773,7 +735,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
773
735
  const pm_class_variable_or_write_node_t *cast = (const pm_class_variable_or_write_node_t *) node;
774
736
 
775
737
  // Visit the value field
776
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
738
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
777
739
 
778
740
  break;
779
741
  }
@@ -785,7 +747,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
785
747
  const pm_class_variable_write_node_t *cast = (const pm_class_variable_write_node_t *) node;
786
748
 
787
749
  // Visit the value field
788
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
750
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
789
751
 
790
752
  break;
791
753
  }
@@ -793,7 +755,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
793
755
  const pm_constant_and_write_node_t *cast = (const pm_constant_and_write_node_t *) node;
794
756
 
795
757
  // Visit the value field
796
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
758
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
797
759
 
798
760
  break;
799
761
  }
@@ -801,7 +763,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
801
763
  const pm_constant_operator_write_node_t *cast = (const pm_constant_operator_write_node_t *) node;
802
764
 
803
765
  // Visit the value field
804
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
766
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
805
767
 
806
768
  break;
807
769
  }
@@ -809,7 +771,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
809
771
  const pm_constant_or_write_node_t *cast = (const pm_constant_or_write_node_t *) node;
810
772
 
811
773
  // Visit the value field
812
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
774
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
813
775
 
814
776
  break;
815
777
  }
@@ -817,10 +779,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
817
779
  const pm_constant_path_and_write_node_t *cast = (const pm_constant_path_and_write_node_t *) node;
818
780
 
819
781
  // Visit the target field
820
- pm_visit_node((const pm_node_t *) cast->target, visitor, data);
782
+ if (!pm_visit_node((const pm_node_t *) cast->target, visitor, data)) return false;
821
783
 
822
784
  // Visit the value field
823
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
785
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
824
786
 
825
787
  break;
826
788
  }
@@ -828,9 +790,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
828
790
  const pm_constant_path_node_t *cast = (const pm_constant_path_node_t *) node;
829
791
 
830
792
  // Visit the parent field
831
- if (cast->parent != NULL) {
832
- pm_visit_node((const pm_node_t *) cast->parent, visitor, data);
833
- }
793
+ if (cast->parent != NULL && !pm_visit_node((const pm_node_t *) cast->parent, visitor, data)) return false;
834
794
 
835
795
  break;
836
796
  }
@@ -838,10 +798,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
838
798
  const pm_constant_path_operator_write_node_t *cast = (const pm_constant_path_operator_write_node_t *) node;
839
799
 
840
800
  // Visit the target field
841
- pm_visit_node((const pm_node_t *) cast->target, visitor, data);
801
+ if (!pm_visit_node((const pm_node_t *) cast->target, visitor, data)) return false;
842
802
 
843
803
  // Visit the value field
844
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
804
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
845
805
 
846
806
  break;
847
807
  }
@@ -849,10 +809,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
849
809
  const pm_constant_path_or_write_node_t *cast = (const pm_constant_path_or_write_node_t *) node;
850
810
 
851
811
  // Visit the target field
852
- pm_visit_node((const pm_node_t *) cast->target, visitor, data);
812
+ if (!pm_visit_node((const pm_node_t *) cast->target, visitor, data)) return false;
853
813
 
854
814
  // Visit the value field
855
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
815
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
856
816
 
857
817
  break;
858
818
  }
@@ -860,9 +820,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
860
820
  const pm_constant_path_target_node_t *cast = (const pm_constant_path_target_node_t *) node;
861
821
 
862
822
  // Visit the parent field
863
- if (cast->parent != NULL) {
864
- pm_visit_node((const pm_node_t *) cast->parent, visitor, data);
865
- }
823
+ if (cast->parent != NULL && !pm_visit_node((const pm_node_t *) cast->parent, visitor, data)) return false;
866
824
 
867
825
  break;
868
826
  }
@@ -870,10 +828,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
870
828
  const pm_constant_path_write_node_t *cast = (const pm_constant_path_write_node_t *) node;
871
829
 
872
830
  // Visit the target field
873
- pm_visit_node((const pm_node_t *) cast->target, visitor, data);
831
+ if (!pm_visit_node((const pm_node_t *) cast->target, visitor, data)) return false;
874
832
 
875
833
  // Visit the value field
876
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
834
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
877
835
 
878
836
  break;
879
837
  }
@@ -885,7 +843,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
885
843
  const pm_constant_write_node_t *cast = (const pm_constant_write_node_t *) node;
886
844
 
887
845
  // Visit the value field
888
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
846
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
889
847
 
890
848
  break;
891
849
  }
@@ -893,19 +851,13 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
893
851
  const pm_def_node_t *cast = (const pm_def_node_t *) node;
894
852
 
895
853
  // Visit the receiver field
896
- if (cast->receiver != NULL) {
897
- pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
898
- }
854
+ if (cast->receiver != NULL && !pm_visit_node((const pm_node_t *) cast->receiver, visitor, data)) return false;
899
855
 
900
856
  // Visit the parameters field
901
- if (cast->parameters != NULL) {
902
- pm_visit_node((const pm_node_t *) cast->parameters, visitor, data);
903
- }
857
+ if (cast->parameters != NULL && !pm_visit_node((const pm_node_t *) cast->parameters, visitor, data)) return false;
904
858
 
905
859
  // Visit the body field
906
- if (cast->body != NULL) {
907
- pm_visit_node((const pm_node_t *) cast->body, visitor, data);
908
- }
860
+ if (cast->body != NULL && !pm_visit_node((const pm_node_t *) cast->body, visitor, data)) return false;
909
861
 
910
862
  break;
911
863
  }
@@ -913,7 +865,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
913
865
  const pm_defined_node_t *cast = (const pm_defined_node_t *) node;
914
866
 
915
867
  // Visit the value field
916
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
868
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
917
869
 
918
870
  break;
919
871
  }
@@ -921,9 +873,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
921
873
  const pm_else_node_t *cast = (const pm_else_node_t *) node;
922
874
 
923
875
  // Visit the statements field
924
- if (cast->statements != NULL) {
925
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
926
- }
876
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
927
877
 
928
878
  break;
929
879
  }
@@ -931,9 +881,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
931
881
  const pm_embedded_statements_node_t *cast = (const pm_embedded_statements_node_t *) node;
932
882
 
933
883
  // Visit the statements field
934
- if (cast->statements != NULL) {
935
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
936
- }
884
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
937
885
 
938
886
  break;
939
887
  }
@@ -941,7 +889,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
941
889
  const pm_embedded_variable_node_t *cast = (const pm_embedded_variable_node_t *) node;
942
890
 
943
891
  // Visit the variable field
944
- pm_visit_node((const pm_node_t *) cast->variable, visitor, data);
892
+ if (!pm_visit_node((const pm_node_t *) cast->variable, visitor, data)) return false;
945
893
 
946
894
  break;
947
895
  }
@@ -949,9 +897,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
949
897
  const pm_ensure_node_t *cast = (const pm_ensure_node_t *) node;
950
898
 
951
899
  // Visit the statements field
952
- if (cast->statements != NULL) {
953
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
954
- }
900
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
955
901
 
956
902
  break;
957
903
  }
@@ -959,9 +905,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
959
905
  const pm_error_recovery_node_t *cast = (const pm_error_recovery_node_t *) node;
960
906
 
961
907
  // Visit the unexpected field
962
- if (cast->unexpected != NULL) {
963
- pm_visit_node((const pm_node_t *) cast->unexpected, visitor, data);
964
- }
908
+ if (cast->unexpected != NULL && !pm_visit_node((const pm_node_t *) cast->unexpected, visitor, data)) return false;
965
909
 
966
910
  break;
967
911
  }
@@ -971,21 +915,19 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
971
915
  const pm_find_pattern_node_t *cast = (const pm_find_pattern_node_t *) node;
972
916
 
973
917
  // Visit the constant field
974
- if (cast->constant != NULL) {
975
- pm_visit_node((const pm_node_t *) cast->constant, visitor, data);
976
- }
918
+ if (cast->constant != NULL && !pm_visit_node((const pm_node_t *) cast->constant, visitor, data)) return false;
977
919
 
978
920
  // Visit the left field
979
- pm_visit_node((const pm_node_t *) cast->left, visitor, data);
921
+ if (!pm_visit_node((const pm_node_t *) cast->left, visitor, data)) return false;
980
922
 
981
923
  // Visit the requireds field
982
924
  const pm_node_list_t *requireds = &cast->requireds;
983
925
  for (size_t index = 0; index < requireds->size; index++) {
984
- pm_visit_node(requireds->nodes[index], visitor, data);
926
+ if (!pm_visit_node(requireds->nodes[index], visitor, data)) return false;
985
927
  }
986
928
 
987
929
  // Visit the right field
988
- pm_visit_node((const pm_node_t *) cast->right, visitor, data);
930
+ if (!pm_visit_node((const pm_node_t *) cast->right, visitor, data)) return false;
989
931
 
990
932
  break;
991
933
  }
@@ -993,14 +935,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
993
935
  const pm_flip_flop_node_t *cast = (const pm_flip_flop_node_t *) node;
994
936
 
995
937
  // Visit the left field
996
- if (cast->left != NULL) {
997
- pm_visit_node((const pm_node_t *) cast->left, visitor, data);
998
- }
938
+ if (cast->left != NULL && !pm_visit_node((const pm_node_t *) cast->left, visitor, data)) return false;
999
939
 
1000
940
  // Visit the right field
1001
- if (cast->right != NULL) {
1002
- pm_visit_node((const pm_node_t *) cast->right, visitor, data);
1003
- }
941
+ if (cast->right != NULL && !pm_visit_node((const pm_node_t *) cast->right, visitor, data)) return false;
1004
942
 
1005
943
  break;
1006
944
  }
@@ -1010,15 +948,13 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1010
948
  const pm_for_node_t *cast = (const pm_for_node_t *) node;
1011
949
 
1012
950
  // Visit the index field
1013
- pm_visit_node((const pm_node_t *) cast->index, visitor, data);
951
+ if (!pm_visit_node((const pm_node_t *) cast->index, visitor, data)) return false;
1014
952
 
1015
953
  // Visit the collection field
1016
- pm_visit_node((const pm_node_t *) cast->collection, visitor, data);
954
+ if (!pm_visit_node((const pm_node_t *) cast->collection, visitor, data)) return false;
1017
955
 
1018
956
  // Visit the statements field
1019
- if (cast->statements != NULL) {
1020
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1021
- }
957
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
1022
958
 
1023
959
  break;
1024
960
  }
@@ -1030,9 +966,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1030
966
  const pm_forwarding_super_node_t *cast = (const pm_forwarding_super_node_t *) node;
1031
967
 
1032
968
  // Visit the block field
1033
- if (cast->block != NULL) {
1034
- pm_visit_node((const pm_node_t *) cast->block, visitor, data);
1035
- }
969
+ if (cast->block != NULL && !pm_visit_node((const pm_node_t *) cast->block, visitor, data)) return false;
1036
970
 
1037
971
  break;
1038
972
  }
@@ -1040,7 +974,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1040
974
  const pm_global_variable_and_write_node_t *cast = (const pm_global_variable_and_write_node_t *) node;
1041
975
 
1042
976
  // Visit the value field
1043
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
977
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1044
978
 
1045
979
  break;
1046
980
  }
@@ -1048,7 +982,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1048
982
  const pm_global_variable_operator_write_node_t *cast = (const pm_global_variable_operator_write_node_t *) node;
1049
983
 
1050
984
  // Visit the value field
1051
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
985
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1052
986
 
1053
987
  break;
1054
988
  }
@@ -1056,7 +990,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1056
990
  const pm_global_variable_or_write_node_t *cast = (const pm_global_variable_or_write_node_t *) node;
1057
991
 
1058
992
  // Visit the value field
1059
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
993
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1060
994
 
1061
995
  break;
1062
996
  }
@@ -1068,7 +1002,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1068
1002
  const pm_global_variable_write_node_t *cast = (const pm_global_variable_write_node_t *) node;
1069
1003
 
1070
1004
  // Visit the value field
1071
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1005
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1072
1006
 
1073
1007
  break;
1074
1008
  }
@@ -1078,7 +1012,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1078
1012
  // Visit the elements field
1079
1013
  const pm_node_list_t *elements = &cast->elements;
1080
1014
  for (size_t index = 0; index < elements->size; index++) {
1081
- pm_visit_node(elements->nodes[index], visitor, data);
1015
+ if (!pm_visit_node(elements->nodes[index], visitor, data)) return false;
1082
1016
  }
1083
1017
 
1084
1018
  break;
@@ -1087,20 +1021,16 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1087
1021
  const pm_hash_pattern_node_t *cast = (const pm_hash_pattern_node_t *) node;
1088
1022
 
1089
1023
  // Visit the constant field
1090
- if (cast->constant != NULL) {
1091
- pm_visit_node((const pm_node_t *) cast->constant, visitor, data);
1092
- }
1024
+ if (cast->constant != NULL && !pm_visit_node((const pm_node_t *) cast->constant, visitor, data)) return false;
1093
1025
 
1094
1026
  // Visit the elements field
1095
1027
  const pm_node_list_t *elements = &cast->elements;
1096
1028
  for (size_t index = 0; index < elements->size; index++) {
1097
- pm_visit_node(elements->nodes[index], visitor, data);
1029
+ if (!pm_visit_node(elements->nodes[index], visitor, data)) return false;
1098
1030
  }
1099
1031
 
1100
1032
  // Visit the rest field
1101
- if (cast->rest != NULL) {
1102
- pm_visit_node((const pm_node_t *) cast->rest, visitor, data);
1103
- }
1033
+ if (cast->rest != NULL && !pm_visit_node((const pm_node_t *) cast->rest, visitor, data)) return false;
1104
1034
 
1105
1035
  break;
1106
1036
  }
@@ -1108,17 +1038,13 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1108
1038
  const pm_if_node_t *cast = (const pm_if_node_t *) node;
1109
1039
 
1110
1040
  // Visit the predicate field
1111
- pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
1041
+ if (!pm_visit_node((const pm_node_t *) cast->predicate, visitor, data)) return false;
1112
1042
 
1113
1043
  // Visit the statements field
1114
- if (cast->statements != NULL) {
1115
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1116
- }
1044
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
1117
1045
 
1118
1046
  // Visit the subsequent field
1119
- if (cast->subsequent != NULL) {
1120
- pm_visit_node((const pm_node_t *) cast->subsequent, visitor, data);
1121
- }
1047
+ if (cast->subsequent != NULL && !pm_visit_node((const pm_node_t *) cast->subsequent, visitor, data)) return false;
1122
1048
 
1123
1049
  break;
1124
1050
  }
@@ -1126,7 +1052,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1126
1052
  const pm_imaginary_node_t *cast = (const pm_imaginary_node_t *) node;
1127
1053
 
1128
1054
  // Visit the numeric field
1129
- pm_visit_node((const pm_node_t *) cast->numeric, visitor, data);
1055
+ if (!pm_visit_node((const pm_node_t *) cast->numeric, visitor, data)) return false;
1130
1056
 
1131
1057
  break;
1132
1058
  }
@@ -1134,7 +1060,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1134
1060
  const pm_implicit_node_t *cast = (const pm_implicit_node_t *) node;
1135
1061
 
1136
1062
  // Visit the value field
1137
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1063
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1138
1064
 
1139
1065
  break;
1140
1066
  }
@@ -1144,12 +1070,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1144
1070
  const pm_in_node_t *cast = (const pm_in_node_t *) node;
1145
1071
 
1146
1072
  // Visit the pattern field
1147
- pm_visit_node((const pm_node_t *) cast->pattern, visitor, data);
1073
+ if (!pm_visit_node((const pm_node_t *) cast->pattern, visitor, data)) return false;
1148
1074
 
1149
1075
  // Visit the statements field
1150
- if (cast->statements != NULL) {
1151
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1152
- }
1076
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
1153
1077
 
1154
1078
  break;
1155
1079
  }
@@ -1157,22 +1081,16 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1157
1081
  const pm_index_and_write_node_t *cast = (const pm_index_and_write_node_t *) node;
1158
1082
 
1159
1083
  // Visit the receiver field
1160
- if (cast->receiver != NULL) {
1161
- pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
1162
- }
1084
+ if (cast->receiver != NULL && !pm_visit_node((const pm_node_t *) cast->receiver, visitor, data)) return false;
1163
1085
 
1164
1086
  // Visit the arguments field
1165
- if (cast->arguments != NULL) {
1166
- pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
1167
- }
1087
+ if (cast->arguments != NULL && !pm_visit_node((const pm_node_t *) cast->arguments, visitor, data)) return false;
1168
1088
 
1169
1089
  // Visit the block field
1170
- if (cast->block != NULL) {
1171
- pm_visit_node((const pm_node_t *) cast->block, visitor, data);
1172
- }
1090
+ if (cast->block != NULL && !pm_visit_node((const pm_node_t *) cast->block, visitor, data)) return false;
1173
1091
 
1174
1092
  // Visit the value field
1175
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1093
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1176
1094
 
1177
1095
  break;
1178
1096
  }
@@ -1180,22 +1098,16 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1180
1098
  const pm_index_operator_write_node_t *cast = (const pm_index_operator_write_node_t *) node;
1181
1099
 
1182
1100
  // Visit the receiver field
1183
- if (cast->receiver != NULL) {
1184
- pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
1185
- }
1101
+ if (cast->receiver != NULL && !pm_visit_node((const pm_node_t *) cast->receiver, visitor, data)) return false;
1186
1102
 
1187
1103
  // Visit the arguments field
1188
- if (cast->arguments != NULL) {
1189
- pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
1190
- }
1104
+ if (cast->arguments != NULL && !pm_visit_node((const pm_node_t *) cast->arguments, visitor, data)) return false;
1191
1105
 
1192
1106
  // Visit the block field
1193
- if (cast->block != NULL) {
1194
- pm_visit_node((const pm_node_t *) cast->block, visitor, data);
1195
- }
1107
+ if (cast->block != NULL && !pm_visit_node((const pm_node_t *) cast->block, visitor, data)) return false;
1196
1108
 
1197
1109
  // Visit the value field
1198
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1110
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1199
1111
 
1200
1112
  break;
1201
1113
  }
@@ -1203,22 +1115,16 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1203
1115
  const pm_index_or_write_node_t *cast = (const pm_index_or_write_node_t *) node;
1204
1116
 
1205
1117
  // Visit the receiver field
1206
- if (cast->receiver != NULL) {
1207
- pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
1208
- }
1118
+ if (cast->receiver != NULL && !pm_visit_node((const pm_node_t *) cast->receiver, visitor, data)) return false;
1209
1119
 
1210
1120
  // Visit the arguments field
1211
- if (cast->arguments != NULL) {
1212
- pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
1213
- }
1121
+ if (cast->arguments != NULL && !pm_visit_node((const pm_node_t *) cast->arguments, visitor, data)) return false;
1214
1122
 
1215
1123
  // Visit the block field
1216
- if (cast->block != NULL) {
1217
- pm_visit_node((const pm_node_t *) cast->block, visitor, data);
1218
- }
1124
+ if (cast->block != NULL && !pm_visit_node((const pm_node_t *) cast->block, visitor, data)) return false;
1219
1125
 
1220
1126
  // Visit the value field
1221
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1127
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1222
1128
 
1223
1129
  break;
1224
1130
  }
@@ -1226,17 +1132,13 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1226
1132
  const pm_index_target_node_t *cast = (const pm_index_target_node_t *) node;
1227
1133
 
1228
1134
  // Visit the receiver field
1229
- pm_visit_node((const pm_node_t *) cast->receiver, visitor, data);
1135
+ if (!pm_visit_node((const pm_node_t *) cast->receiver, visitor, data)) return false;
1230
1136
 
1231
1137
  // Visit the arguments field
1232
- if (cast->arguments != NULL) {
1233
- pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
1234
- }
1138
+ if (cast->arguments != NULL && !pm_visit_node((const pm_node_t *) cast->arguments, visitor, data)) return false;
1235
1139
 
1236
1140
  // Visit the block field
1237
- if (cast->block != NULL) {
1238
- pm_visit_node((const pm_node_t *) cast->block, visitor, data);
1239
- }
1141
+ if (cast->block != NULL && !pm_visit_node((const pm_node_t *) cast->block, visitor, data)) return false;
1240
1142
 
1241
1143
  break;
1242
1144
  }
@@ -1244,7 +1146,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1244
1146
  const pm_instance_variable_and_write_node_t *cast = (const pm_instance_variable_and_write_node_t *) node;
1245
1147
 
1246
1148
  // Visit the value field
1247
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1149
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1248
1150
 
1249
1151
  break;
1250
1152
  }
@@ -1252,7 +1154,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1252
1154
  const pm_instance_variable_operator_write_node_t *cast = (const pm_instance_variable_operator_write_node_t *) node;
1253
1155
 
1254
1156
  // Visit the value field
1255
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1157
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1256
1158
 
1257
1159
  break;
1258
1160
  }
@@ -1260,7 +1162,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1260
1162
  const pm_instance_variable_or_write_node_t *cast = (const pm_instance_variable_or_write_node_t *) node;
1261
1163
 
1262
1164
  // Visit the value field
1263
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1165
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1264
1166
 
1265
1167
  break;
1266
1168
  }
@@ -1272,7 +1174,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1272
1174
  const pm_instance_variable_write_node_t *cast = (const pm_instance_variable_write_node_t *) node;
1273
1175
 
1274
1176
  // Visit the value field
1275
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1177
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1276
1178
 
1277
1179
  break;
1278
1180
  }
@@ -1284,7 +1186,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1284
1186
  // Visit the parts field
1285
1187
  const pm_node_list_t *parts = &cast->parts;
1286
1188
  for (size_t index = 0; index < parts->size; index++) {
1287
- pm_visit_node(parts->nodes[index], visitor, data);
1189
+ if (!pm_visit_node(parts->nodes[index], visitor, data)) return false;
1288
1190
  }
1289
1191
 
1290
1192
  break;
@@ -1295,7 +1197,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1295
1197
  // Visit the parts field
1296
1198
  const pm_node_list_t *parts = &cast->parts;
1297
1199
  for (size_t index = 0; index < parts->size; index++) {
1298
- pm_visit_node(parts->nodes[index], visitor, data);
1200
+ if (!pm_visit_node(parts->nodes[index], visitor, data)) return false;
1299
1201
  }
1300
1202
 
1301
1203
  break;
@@ -1306,7 +1208,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1306
1208
  // Visit the parts field
1307
1209
  const pm_node_list_t *parts = &cast->parts;
1308
1210
  for (size_t index = 0; index < parts->size; index++) {
1309
- pm_visit_node(parts->nodes[index], visitor, data);
1211
+ if (!pm_visit_node(parts->nodes[index], visitor, data)) return false;
1310
1212
  }
1311
1213
 
1312
1214
  break;
@@ -1317,7 +1219,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1317
1219
  // Visit the parts field
1318
1220
  const pm_node_list_t *parts = &cast->parts;
1319
1221
  for (size_t index = 0; index < parts->size; index++) {
1320
- pm_visit_node(parts->nodes[index], visitor, data);
1222
+ if (!pm_visit_node(parts->nodes[index], visitor, data)) return false;
1321
1223
  }
1322
1224
 
1323
1225
  break;
@@ -1328,7 +1230,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1328
1230
  // Visit the parts field
1329
1231
  const pm_node_list_t *parts = &cast->parts;
1330
1232
  for (size_t index = 0; index < parts->size; index++) {
1331
- pm_visit_node(parts->nodes[index], visitor, data);
1233
+ if (!pm_visit_node(parts->nodes[index], visitor, data)) return false;
1332
1234
  }
1333
1235
 
1334
1236
  break;
@@ -1343,7 +1245,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1343
1245
  // Visit the elements field
1344
1246
  const pm_node_list_t *elements = &cast->elements;
1345
1247
  for (size_t index = 0; index < elements->size; index++) {
1346
- pm_visit_node(elements->nodes[index], visitor, data);
1248
+ if (!pm_visit_node(elements->nodes[index], visitor, data)) return false;
1347
1249
  }
1348
1250
 
1349
1251
  break;
@@ -1354,14 +1256,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1354
1256
  const pm_lambda_node_t *cast = (const pm_lambda_node_t *) node;
1355
1257
 
1356
1258
  // Visit the parameters field
1357
- if (cast->parameters != NULL) {
1358
- pm_visit_node((const pm_node_t *) cast->parameters, visitor, data);
1359
- }
1259
+ if (cast->parameters != NULL && !pm_visit_node((const pm_node_t *) cast->parameters, visitor, data)) return false;
1360
1260
 
1361
1261
  // Visit the body field
1362
- if (cast->body != NULL) {
1363
- pm_visit_node((const pm_node_t *) cast->body, visitor, data);
1364
- }
1262
+ if (cast->body != NULL && !pm_visit_node((const pm_node_t *) cast->body, visitor, data)) return false;
1365
1263
 
1366
1264
  break;
1367
1265
  }
@@ -1369,7 +1267,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1369
1267
  const pm_local_variable_and_write_node_t *cast = (const pm_local_variable_and_write_node_t *) node;
1370
1268
 
1371
1269
  // Visit the value field
1372
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1270
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1373
1271
 
1374
1272
  break;
1375
1273
  }
@@ -1377,7 +1275,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1377
1275
  const pm_local_variable_operator_write_node_t *cast = (const pm_local_variable_operator_write_node_t *) node;
1378
1276
 
1379
1277
  // Visit the value field
1380
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1278
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1381
1279
 
1382
1280
  break;
1383
1281
  }
@@ -1385,7 +1283,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1385
1283
  const pm_local_variable_or_write_node_t *cast = (const pm_local_variable_or_write_node_t *) node;
1386
1284
 
1387
1285
  // Visit the value field
1388
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1286
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1389
1287
 
1390
1288
  break;
1391
1289
  }
@@ -1397,7 +1295,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1397
1295
  const pm_local_variable_write_node_t *cast = (const pm_local_variable_write_node_t *) node;
1398
1296
 
1399
1297
  // Visit the value field
1400
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1298
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1401
1299
 
1402
1300
  break;
1403
1301
  }
@@ -1407,10 +1305,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1407
1305
  const pm_match_predicate_node_t *cast = (const pm_match_predicate_node_t *) node;
1408
1306
 
1409
1307
  // Visit the value field
1410
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1308
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1411
1309
 
1412
1310
  // Visit the pattern field
1413
- pm_visit_node((const pm_node_t *) cast->pattern, visitor, data);
1311
+ if (!pm_visit_node((const pm_node_t *) cast->pattern, visitor, data)) return false;
1414
1312
 
1415
1313
  break;
1416
1314
  }
@@ -1418,10 +1316,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1418
1316
  const pm_match_required_node_t *cast = (const pm_match_required_node_t *) node;
1419
1317
 
1420
1318
  // Visit the value field
1421
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1319
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1422
1320
 
1423
1321
  // Visit the pattern field
1424
- pm_visit_node((const pm_node_t *) cast->pattern, visitor, data);
1322
+ if (!pm_visit_node((const pm_node_t *) cast->pattern, visitor, data)) return false;
1425
1323
 
1426
1324
  break;
1427
1325
  }
@@ -1429,12 +1327,12 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1429
1327
  const pm_match_write_node_t *cast = (const pm_match_write_node_t *) node;
1430
1328
 
1431
1329
  // Visit the call field
1432
- pm_visit_node((const pm_node_t *) cast->call, visitor, data);
1330
+ if (!pm_visit_node((const pm_node_t *) cast->call, visitor, data)) return false;
1433
1331
 
1434
1332
  // Visit the targets field
1435
1333
  const pm_node_list_t *targets = &cast->targets;
1436
1334
  for (size_t index = 0; index < targets->size; index++) {
1437
- pm_visit_node(targets->nodes[index], visitor, data);
1335
+ if (!pm_visit_node(targets->nodes[index], visitor, data)) return false;
1438
1336
  }
1439
1337
 
1440
1338
  break;
@@ -1443,12 +1341,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1443
1341
  const pm_module_node_t *cast = (const pm_module_node_t *) node;
1444
1342
 
1445
1343
  // Visit the constant_path field
1446
- pm_visit_node((const pm_node_t *) cast->constant_path, visitor, data);
1344
+ if (!pm_visit_node((const pm_node_t *) cast->constant_path, visitor, data)) return false;
1447
1345
 
1448
1346
  // Visit the body field
1449
- if (cast->body != NULL) {
1450
- pm_visit_node((const pm_node_t *) cast->body, visitor, data);
1451
- }
1347
+ if (cast->body != NULL && !pm_visit_node((const pm_node_t *) cast->body, visitor, data)) return false;
1452
1348
 
1453
1349
  break;
1454
1350
  }
@@ -1458,18 +1354,16 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1458
1354
  // Visit the lefts field
1459
1355
  const pm_node_list_t *lefts = &cast->lefts;
1460
1356
  for (size_t index = 0; index < lefts->size; index++) {
1461
- pm_visit_node(lefts->nodes[index], visitor, data);
1357
+ if (!pm_visit_node(lefts->nodes[index], visitor, data)) return false;
1462
1358
  }
1463
1359
 
1464
1360
  // Visit the rest field
1465
- if (cast->rest != NULL) {
1466
- pm_visit_node((const pm_node_t *) cast->rest, visitor, data);
1467
- }
1361
+ if (cast->rest != NULL && !pm_visit_node((const pm_node_t *) cast->rest, visitor, data)) return false;
1468
1362
 
1469
1363
  // Visit the rights field
1470
1364
  const pm_node_list_t *rights = &cast->rights;
1471
1365
  for (size_t index = 0; index < rights->size; index++) {
1472
- pm_visit_node(rights->nodes[index], visitor, data);
1366
+ if (!pm_visit_node(rights->nodes[index], visitor, data)) return false;
1473
1367
  }
1474
1368
 
1475
1369
  break;
@@ -1480,22 +1374,20 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1480
1374
  // Visit the lefts field
1481
1375
  const pm_node_list_t *lefts = &cast->lefts;
1482
1376
  for (size_t index = 0; index < lefts->size; index++) {
1483
- pm_visit_node(lefts->nodes[index], visitor, data);
1377
+ if (!pm_visit_node(lefts->nodes[index], visitor, data)) return false;
1484
1378
  }
1485
1379
 
1486
1380
  // Visit the rest field
1487
- if (cast->rest != NULL) {
1488
- pm_visit_node((const pm_node_t *) cast->rest, visitor, data);
1489
- }
1381
+ if (cast->rest != NULL && !pm_visit_node((const pm_node_t *) cast->rest, visitor, data)) return false;
1490
1382
 
1491
1383
  // Visit the rights field
1492
1384
  const pm_node_list_t *rights = &cast->rights;
1493
1385
  for (size_t index = 0; index < rights->size; index++) {
1494
- pm_visit_node(rights->nodes[index], visitor, data);
1386
+ if (!pm_visit_node(rights->nodes[index], visitor, data)) return false;
1495
1387
  }
1496
1388
 
1497
1389
  // Visit the value field
1498
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1390
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1499
1391
 
1500
1392
  break;
1501
1393
  }
@@ -1503,9 +1395,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1503
1395
  const pm_next_node_t *cast = (const pm_next_node_t *) node;
1504
1396
 
1505
1397
  // Visit the arguments field
1506
- if (cast->arguments != NULL) {
1507
- pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
1508
- }
1398
+ if (cast->arguments != NULL && !pm_visit_node((const pm_node_t *) cast->arguments, visitor, data)) return false;
1509
1399
 
1510
1400
  break;
1511
1401
  }
@@ -1523,7 +1413,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1523
1413
  const pm_optional_keyword_parameter_node_t *cast = (const pm_optional_keyword_parameter_node_t *) node;
1524
1414
 
1525
1415
  // Visit the value field
1526
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1416
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1527
1417
 
1528
1418
  break;
1529
1419
  }
@@ -1531,7 +1421,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1531
1421
  const pm_optional_parameter_node_t *cast = (const pm_optional_parameter_node_t *) node;
1532
1422
 
1533
1423
  // Visit the value field
1534
- pm_visit_node((const pm_node_t *) cast->value, visitor, data);
1424
+ if (!pm_visit_node((const pm_node_t *) cast->value, visitor, data)) return false;
1535
1425
 
1536
1426
  break;
1537
1427
  }
@@ -1539,10 +1429,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1539
1429
  const pm_or_node_t *cast = (const pm_or_node_t *) node;
1540
1430
 
1541
1431
  // Visit the left field
1542
- pm_visit_node((const pm_node_t *) cast->left, visitor, data);
1432
+ if (!pm_visit_node((const pm_node_t *) cast->left, visitor, data)) return false;
1543
1433
 
1544
1434
  // Visit the right field
1545
- pm_visit_node((const pm_node_t *) cast->right, visitor, data);
1435
+ if (!pm_visit_node((const pm_node_t *) cast->right, visitor, data)) return false;
1546
1436
 
1547
1437
  break;
1548
1438
  }
@@ -1552,41 +1442,35 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1552
1442
  // Visit the requireds field
1553
1443
  const pm_node_list_t *requireds = &cast->requireds;
1554
1444
  for (size_t index = 0; index < requireds->size; index++) {
1555
- pm_visit_node(requireds->nodes[index], visitor, data);
1445
+ if (!pm_visit_node(requireds->nodes[index], visitor, data)) return false;
1556
1446
  }
1557
1447
 
1558
1448
  // Visit the optionals field
1559
1449
  const pm_node_list_t *optionals = &cast->optionals;
1560
1450
  for (size_t index = 0; index < optionals->size; index++) {
1561
- pm_visit_node(optionals->nodes[index], visitor, data);
1451
+ if (!pm_visit_node(optionals->nodes[index], visitor, data)) return false;
1562
1452
  }
1563
1453
 
1564
1454
  // Visit the rest field
1565
- if (cast->rest != NULL) {
1566
- pm_visit_node((const pm_node_t *) cast->rest, visitor, data);
1567
- }
1455
+ if (cast->rest != NULL && !pm_visit_node((const pm_node_t *) cast->rest, visitor, data)) return false;
1568
1456
 
1569
1457
  // Visit the posts field
1570
1458
  const pm_node_list_t *posts = &cast->posts;
1571
1459
  for (size_t index = 0; index < posts->size; index++) {
1572
- pm_visit_node(posts->nodes[index], visitor, data);
1460
+ if (!pm_visit_node(posts->nodes[index], visitor, data)) return false;
1573
1461
  }
1574
1462
 
1575
1463
  // Visit the keywords field
1576
1464
  const pm_node_list_t *keywords = &cast->keywords;
1577
1465
  for (size_t index = 0; index < keywords->size; index++) {
1578
- pm_visit_node(keywords->nodes[index], visitor, data);
1466
+ if (!pm_visit_node(keywords->nodes[index], visitor, data)) return false;
1579
1467
  }
1580
1468
 
1581
1469
  // Visit the keyword_rest field
1582
- if (cast->keyword_rest != NULL) {
1583
- pm_visit_node((const pm_node_t *) cast->keyword_rest, visitor, data);
1584
- }
1470
+ if (cast->keyword_rest != NULL && !pm_visit_node((const pm_node_t *) cast->keyword_rest, visitor, data)) return false;
1585
1471
 
1586
1472
  // Visit the block field
1587
- if (cast->block != NULL) {
1588
- pm_visit_node((const pm_node_t *) cast->block, visitor, data);
1589
- }
1473
+ if (cast->block != NULL && !pm_visit_node((const pm_node_t *) cast->block, visitor, data)) return false;
1590
1474
 
1591
1475
  break;
1592
1476
  }
@@ -1594,9 +1478,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1594
1478
  const pm_parentheses_node_t *cast = (const pm_parentheses_node_t *) node;
1595
1479
 
1596
1480
  // Visit the body field
1597
- if (cast->body != NULL) {
1598
- pm_visit_node((const pm_node_t *) cast->body, visitor, data);
1599
- }
1481
+ if (cast->body != NULL && !pm_visit_node((const pm_node_t *) cast->body, visitor, data)) return false;
1600
1482
 
1601
1483
  break;
1602
1484
  }
@@ -1604,7 +1486,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1604
1486
  const pm_pinned_expression_node_t *cast = (const pm_pinned_expression_node_t *) node;
1605
1487
 
1606
1488
  // Visit the expression field
1607
- pm_visit_node((const pm_node_t *) cast->expression, visitor, data);
1489
+ if (!pm_visit_node((const pm_node_t *) cast->expression, visitor, data)) return false;
1608
1490
 
1609
1491
  break;
1610
1492
  }
@@ -1612,7 +1494,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1612
1494
  const pm_pinned_variable_node_t *cast = (const pm_pinned_variable_node_t *) node;
1613
1495
 
1614
1496
  // Visit the variable field
1615
- pm_visit_node((const pm_node_t *) cast->variable, visitor, data);
1497
+ if (!pm_visit_node((const pm_node_t *) cast->variable, visitor, data)) return false;
1616
1498
 
1617
1499
  break;
1618
1500
  }
@@ -1620,9 +1502,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1620
1502
  const pm_post_execution_node_t *cast = (const pm_post_execution_node_t *) node;
1621
1503
 
1622
1504
  // Visit the statements field
1623
- if (cast->statements != NULL) {
1624
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1625
- }
1505
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
1626
1506
 
1627
1507
  break;
1628
1508
  }
@@ -1630,9 +1510,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1630
1510
  const pm_pre_execution_node_t *cast = (const pm_pre_execution_node_t *) node;
1631
1511
 
1632
1512
  // Visit the statements field
1633
- if (cast->statements != NULL) {
1634
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1635
- }
1513
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
1636
1514
 
1637
1515
  break;
1638
1516
  }
@@ -1640,7 +1518,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1640
1518
  const pm_program_node_t *cast = (const pm_program_node_t *) node;
1641
1519
 
1642
1520
  // Visit the statements field
1643
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1521
+ if (!pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
1644
1522
 
1645
1523
  break;
1646
1524
  }
@@ -1648,14 +1526,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1648
1526
  const pm_range_node_t *cast = (const pm_range_node_t *) node;
1649
1527
 
1650
1528
  // Visit the left field
1651
- if (cast->left != NULL) {
1652
- pm_visit_node((const pm_node_t *) cast->left, visitor, data);
1653
- }
1529
+ if (cast->left != NULL && !pm_visit_node((const pm_node_t *) cast->left, visitor, data)) return false;
1654
1530
 
1655
1531
  // Visit the right field
1656
- if (cast->right != NULL) {
1657
- pm_visit_node((const pm_node_t *) cast->right, visitor, data);
1658
- }
1532
+ if (cast->right != NULL && !pm_visit_node((const pm_node_t *) cast->right, visitor, data)) return false;
1659
1533
 
1660
1534
  break;
1661
1535
  }
@@ -1673,10 +1547,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1673
1547
  const pm_rescue_modifier_node_t *cast = (const pm_rescue_modifier_node_t *) node;
1674
1548
 
1675
1549
  // Visit the expression field
1676
- pm_visit_node((const pm_node_t *) cast->expression, visitor, data);
1550
+ if (!pm_visit_node((const pm_node_t *) cast->expression, visitor, data)) return false;
1677
1551
 
1678
1552
  // Visit the rescue_expression field
1679
- pm_visit_node((const pm_node_t *) cast->rescue_expression, visitor, data);
1553
+ if (!pm_visit_node((const pm_node_t *) cast->rescue_expression, visitor, data)) return false;
1680
1554
 
1681
1555
  break;
1682
1556
  }
@@ -1686,23 +1560,17 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1686
1560
  // Visit the exceptions field
1687
1561
  const pm_node_list_t *exceptions = &cast->exceptions;
1688
1562
  for (size_t index = 0; index < exceptions->size; index++) {
1689
- pm_visit_node(exceptions->nodes[index], visitor, data);
1563
+ if (!pm_visit_node(exceptions->nodes[index], visitor, data)) return false;
1690
1564
  }
1691
1565
 
1692
1566
  // Visit the reference field
1693
- if (cast->reference != NULL) {
1694
- pm_visit_node((const pm_node_t *) cast->reference, visitor, data);
1695
- }
1567
+ if (cast->reference != NULL && !pm_visit_node((const pm_node_t *) cast->reference, visitor, data)) return false;
1696
1568
 
1697
1569
  // Visit the statements field
1698
- if (cast->statements != NULL) {
1699
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1700
- }
1570
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
1701
1571
 
1702
1572
  // Visit the subsequent field
1703
- if (cast->subsequent != NULL) {
1704
- pm_visit_node((const pm_node_t *) cast->subsequent, visitor, data);
1705
- }
1573
+ if (cast->subsequent != NULL && !pm_visit_node((const pm_node_t *) cast->subsequent, visitor, data)) return false;
1706
1574
 
1707
1575
  break;
1708
1576
  }
@@ -1714,9 +1582,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1714
1582
  const pm_return_node_t *cast = (const pm_return_node_t *) node;
1715
1583
 
1716
1584
  // Visit the arguments field
1717
- if (cast->arguments != NULL) {
1718
- pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
1719
- }
1585
+ if (cast->arguments != NULL && !pm_visit_node((const pm_node_t *) cast->arguments, visitor, data)) return false;
1720
1586
 
1721
1587
  break;
1722
1588
  }
@@ -1726,7 +1592,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1726
1592
  const pm_shareable_constant_node_t *cast = (const pm_shareable_constant_node_t *) node;
1727
1593
 
1728
1594
  // Visit the write field
1729
- pm_visit_node((const pm_node_t *) cast->write, visitor, data);
1595
+ if (!pm_visit_node((const pm_node_t *) cast->write, visitor, data)) return false;
1730
1596
 
1731
1597
  break;
1732
1598
  }
@@ -1734,12 +1600,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1734
1600
  const pm_singleton_class_node_t *cast = (const pm_singleton_class_node_t *) node;
1735
1601
 
1736
1602
  // Visit the expression field
1737
- pm_visit_node((const pm_node_t *) cast->expression, visitor, data);
1603
+ if (!pm_visit_node((const pm_node_t *) cast->expression, visitor, data)) return false;
1738
1604
 
1739
1605
  // Visit the body field
1740
- if (cast->body != NULL) {
1741
- pm_visit_node((const pm_node_t *) cast->body, visitor, data);
1742
- }
1606
+ if (cast->body != NULL && !pm_visit_node((const pm_node_t *) cast->body, visitor, data)) return false;
1743
1607
 
1744
1608
  break;
1745
1609
  }
@@ -1753,9 +1617,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1753
1617
  const pm_splat_node_t *cast = (const pm_splat_node_t *) node;
1754
1618
 
1755
1619
  // Visit the expression field
1756
- if (cast->expression != NULL) {
1757
- pm_visit_node((const pm_node_t *) cast->expression, visitor, data);
1758
- }
1620
+ if (cast->expression != NULL && !pm_visit_node((const pm_node_t *) cast->expression, visitor, data)) return false;
1759
1621
 
1760
1622
  break;
1761
1623
  }
@@ -1765,7 +1627,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1765
1627
  // Visit the body field
1766
1628
  const pm_node_list_t *body = &cast->body;
1767
1629
  for (size_t index = 0; index < body->size; index++) {
1768
- pm_visit_node(body->nodes[index], visitor, data);
1630
+ if (!pm_visit_node(body->nodes[index], visitor, data)) return false;
1769
1631
  }
1770
1632
 
1771
1633
  break;
@@ -1776,14 +1638,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1776
1638
  const pm_super_node_t *cast = (const pm_super_node_t *) node;
1777
1639
 
1778
1640
  // Visit the arguments field
1779
- if (cast->arguments != NULL) {
1780
- pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
1781
- }
1641
+ if (cast->arguments != NULL && !pm_visit_node((const pm_node_t *) cast->arguments, visitor, data)) return false;
1782
1642
 
1783
1643
  // Visit the block field
1784
- if (cast->block != NULL) {
1785
- pm_visit_node((const pm_node_t *) cast->block, visitor, data);
1786
- }
1644
+ if (cast->block != NULL && !pm_visit_node((const pm_node_t *) cast->block, visitor, data)) return false;
1787
1645
 
1788
1646
  break;
1789
1647
  }
@@ -1797,7 +1655,7 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1797
1655
  // Visit the names field
1798
1656
  const pm_node_list_t *names = &cast->names;
1799
1657
  for (size_t index = 0; index < names->size; index++) {
1800
- pm_visit_node(names->nodes[index], visitor, data);
1658
+ if (!pm_visit_node(names->nodes[index], visitor, data)) return false;
1801
1659
  }
1802
1660
 
1803
1661
  break;
@@ -1806,17 +1664,13 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1806
1664
  const pm_unless_node_t *cast = (const pm_unless_node_t *) node;
1807
1665
 
1808
1666
  // Visit the predicate field
1809
- pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
1667
+ if (!pm_visit_node((const pm_node_t *) cast->predicate, visitor, data)) return false;
1810
1668
 
1811
1669
  // Visit the statements field
1812
- if (cast->statements != NULL) {
1813
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1814
- }
1670
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
1815
1671
 
1816
1672
  // Visit the else_clause field
1817
- if (cast->else_clause != NULL) {
1818
- pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data);
1819
- }
1673
+ if (cast->else_clause != NULL && !pm_visit_node((const pm_node_t *) cast->else_clause, visitor, data)) return false;
1820
1674
 
1821
1675
  break;
1822
1676
  }
@@ -1824,12 +1678,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1824
1678
  const pm_until_node_t *cast = (const pm_until_node_t *) node;
1825
1679
 
1826
1680
  // Visit the predicate field
1827
- pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
1681
+ if (!pm_visit_node((const pm_node_t *) cast->predicate, visitor, data)) return false;
1828
1682
 
1829
1683
  // Visit the statements field
1830
- if (cast->statements != NULL) {
1831
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1832
- }
1684
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
1833
1685
 
1834
1686
  break;
1835
1687
  }
@@ -1839,13 +1691,11 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1839
1691
  // Visit the conditions field
1840
1692
  const pm_node_list_t *conditions = &cast->conditions;
1841
1693
  for (size_t index = 0; index < conditions->size; index++) {
1842
- pm_visit_node(conditions->nodes[index], visitor, data);
1694
+ if (!pm_visit_node(conditions->nodes[index], visitor, data)) return false;
1843
1695
  }
1844
1696
 
1845
1697
  // Visit the statements field
1846
- if (cast->statements != NULL) {
1847
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1848
- }
1698
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
1849
1699
 
1850
1700
  break;
1851
1701
  }
@@ -1853,12 +1703,10 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1853
1703
  const pm_while_node_t *cast = (const pm_while_node_t *) node;
1854
1704
 
1855
1705
  // Visit the predicate field
1856
- pm_visit_node((const pm_node_t *) cast->predicate, visitor, data);
1706
+ if (!pm_visit_node((const pm_node_t *) cast->predicate, visitor, data)) return false;
1857
1707
 
1858
1708
  // Visit the statements field
1859
- if (cast->statements != NULL) {
1860
- pm_visit_node((const pm_node_t *) cast->statements, visitor, data);
1861
- }
1709
+ if (cast->statements != NULL && !pm_visit_node((const pm_node_t *) cast->statements, visitor, data)) return false;
1862
1710
 
1863
1711
  break;
1864
1712
  }
@@ -1868,15 +1716,15 @@ pm_visit_child_nodes(const pm_node_t *node, bool (*visitor)(const pm_node_t *nod
1868
1716
  const pm_yield_node_t *cast = (const pm_yield_node_t *) node;
1869
1717
 
1870
1718
  // Visit the arguments field
1871
- if (cast->arguments != NULL) {
1872
- pm_visit_node((const pm_node_t *) cast->arguments, visitor, data);
1873
- }
1719
+ if (cast->arguments != NULL && !pm_visit_node((const pm_node_t *) cast->arguments, visitor, data)) return false;
1874
1720
 
1875
1721
  break;
1876
1722
  }
1877
1723
  case PM_SCOPE_NODE:
1878
1724
  break;
1879
1725
  }
1726
+
1727
+ return true;
1880
1728
  }
1881
1729
 
1882
1730
  /**