syntax_tree 2.0.0 → 2.1.1

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.
@@ -0,0 +1,1213 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SyntaxTree
4
+ class Visitor
5
+ class PrettyPrintVisitor < Visitor
6
+ attr_reader :q
7
+
8
+ def initialize(q)
9
+ @q = q
10
+ end
11
+
12
+ def visit_aref(node)
13
+ node("aref") do
14
+ field("collection", node.collection)
15
+ field("index", node.index)
16
+ comments(node)
17
+ end
18
+ end
19
+
20
+ def visit_aref_field(node)
21
+ node("aref_field") do
22
+ field("collection", node.collection)
23
+ field("index", node.index)
24
+ comments(node)
25
+ end
26
+ end
27
+
28
+ def visit_alias(node)
29
+ node("alias") do
30
+ field("left", node.left)
31
+ field("right", node.right)
32
+ comments(node)
33
+ end
34
+ end
35
+
36
+ def visit_arg_block(node)
37
+ node("arg_block") do
38
+ field("value", node.value) if node.value
39
+ comments(node)
40
+ end
41
+ end
42
+
43
+ def visit_arg_paren(node)
44
+ node("arg_paren") do
45
+ field("arguments", node.arguments)
46
+ comments(node)
47
+ end
48
+ end
49
+
50
+ def visit_arg_star(node)
51
+ node("arg_star") do
52
+ field("value", node.value)
53
+ comments(node)
54
+ end
55
+ end
56
+
57
+ def visit_args(node)
58
+ node("args") do
59
+ list("parts", node.parts)
60
+ comments(node)
61
+ end
62
+ end
63
+
64
+ def visit_args_forward(node)
65
+ visit_token("args_forward", node)
66
+ end
67
+
68
+ def visit_array(node)
69
+ node("array") do
70
+ field("contents", node.contents)
71
+ comments(node)
72
+ end
73
+ end
74
+
75
+ def visit_aryptn(node)
76
+ node("aryptn") do
77
+ field("constant", node.constant) if node.constant
78
+ list("requireds", node.requireds) if node.requireds.any?
79
+ field("rest", node.rest) if node.rest
80
+ list("posts", node.posts) if node.posts.any?
81
+ comments(node)
82
+ end
83
+ end
84
+
85
+ def visit_assign(node)
86
+ node("assign") do
87
+ field("target", node.target)
88
+ field("value", node.value)
89
+ comments(node)
90
+ end
91
+ end
92
+
93
+ def visit_assoc(node)
94
+ node("assoc") do
95
+ field("key", node.key)
96
+ field("value", node.value) if node.value
97
+ comments(node)
98
+ end
99
+ end
100
+
101
+ def visit_assoc_splat(node)
102
+ node("assoc_splat") do
103
+ field("value", node.value)
104
+ comments(node)
105
+ end
106
+ end
107
+
108
+ def visit_backref(node)
109
+ visit_token("backref", node)
110
+ end
111
+
112
+ def visit_backtick(node)
113
+ visit_token("backtick", node)
114
+ end
115
+
116
+ def visit_bare_assoc_hash(node)
117
+ node("bare_assoc_hash") do
118
+ list("assocs", node.assocs)
119
+ comments(node)
120
+ end
121
+ end
122
+
123
+ def visit_BEGIN(node)
124
+ node("BEGIN") do
125
+ field("statements", node.statements)
126
+ comments(node)
127
+ end
128
+ end
129
+
130
+ def visit_begin(node)
131
+ node("begin") do
132
+ field("bodystmt", node.bodystmt)
133
+ comments(node)
134
+ end
135
+ end
136
+
137
+ def visit_binary(node)
138
+ node("binary") do
139
+ field("left", node.left)
140
+ text("operator", node.operator)
141
+ field("right", node.right)
142
+ comments(node)
143
+ end
144
+ end
145
+
146
+ def visit_blockarg(node)
147
+ node("blockarg") do
148
+ field("name", node.name) if node.name
149
+ comments(node)
150
+ end
151
+ end
152
+
153
+ def visit_block_var(node)
154
+ node("block_var") do
155
+ field("params", node.params)
156
+ list("locals", node.locals) if node.locals.any?
157
+ comments(node)
158
+ end
159
+ end
160
+
161
+ def visit_bodystmt(node)
162
+ node("bodystmt") do
163
+ field("statements", node.statements)
164
+ field("rescue_clause", node.rescue_clause) if node.rescue_clause
165
+ field("else_clause", node.else_clause) if node.else_clause
166
+ field("ensure_clause", node.ensure_clause) if node.ensure_clause
167
+ comments(node)
168
+ end
169
+ end
170
+
171
+ def visit_brace_block(node)
172
+ node("brace_block") do
173
+ field("block_var", node.block_var) if node.block_var
174
+ field("statements", node.statements)
175
+ comments(node)
176
+ end
177
+ end
178
+
179
+ def visit_break(node)
180
+ node("break") do
181
+ field("arguments", node.arguments)
182
+ comments(node)
183
+ end
184
+ end
185
+
186
+ def visit_call(node)
187
+ node("call") do
188
+ field("receiver", node.receiver)
189
+ field("operator", node.operator)
190
+ field("message", node.message)
191
+ field("arguments", node.arguments) if node.arguments
192
+ comments(node)
193
+ end
194
+ end
195
+
196
+ def visit_case(node)
197
+ node("case") do
198
+ field("keyword", node.keyword)
199
+ field("value", node.value) if node.value
200
+ field("consequent", node.consequent)
201
+ comments(node)
202
+ end
203
+ end
204
+
205
+ def visit_CHAR(node)
206
+ visit_token("CHAR", node)
207
+ end
208
+
209
+ def visit_class(node)
210
+ node("class") do
211
+ field("constant", node.constant)
212
+ field("superclass", node.superclass) if node.superclass
213
+ field("bodystmt", node.bodystmt)
214
+ comments(node)
215
+ end
216
+ end
217
+
218
+ def visit_comma(node)
219
+ node("comma") do
220
+ field("value", node)
221
+ end
222
+ end
223
+
224
+ def visit_command(node)
225
+ node("command") do
226
+ field("message", node.message)
227
+ field("arguments", node.arguments)
228
+ comments(node)
229
+ end
230
+ end
231
+
232
+ def visit_command_call(node)
233
+ node("command_call") do
234
+ field("receiver", node.receiver)
235
+ field("operator", node.operator)
236
+ field("message", node.message)
237
+ field("arguments", node.arguments) if node.arguments
238
+ comments(node)
239
+ end
240
+ end
241
+
242
+ def visit_comment(node)
243
+ node("comment") do
244
+ field("value", node.value)
245
+ end
246
+ end
247
+
248
+ def visit_const(node)
249
+ visit_token("const", node)
250
+ end
251
+
252
+ def visit_const_path_field(node)
253
+ node("const_path_field") do
254
+ field("parent", node.parent)
255
+ field("constant", node.constant)
256
+ comments(node)
257
+ end
258
+ end
259
+
260
+ def visit_const_path_ref(node)
261
+ node("const_path_ref") do
262
+ field("parent", node.parent)
263
+ field("constant", node.constant)
264
+ comments(node)
265
+ end
266
+ end
267
+
268
+ def visit_const_ref(node)
269
+ node("const_ref") do
270
+ field("constant", node.constant)
271
+ comments(node)
272
+ end
273
+ end
274
+
275
+ def visit_cvar(node)
276
+ visit_token("cvar", node)
277
+ end
278
+
279
+ def visit_def(node)
280
+ node("def") do
281
+ field("name", node.name)
282
+ field("params", node.params)
283
+ field("bodystmt", node.bodystmt)
284
+ comments(node)
285
+ end
286
+ end
287
+
288
+ def visit_def_endless(node)
289
+ node("def_endless") do
290
+ if node.target
291
+ field("target", node.target)
292
+ field("operator", node.operator)
293
+ end
294
+
295
+ field("name", node.name)
296
+ field("paren", node.paren) if node.paren
297
+ field("statement", node.statement)
298
+ comments(node)
299
+ end
300
+ end
301
+
302
+ def visit_defined(node)
303
+ node("defined") do
304
+ field("value", node.value)
305
+ comments(node)
306
+ end
307
+ end
308
+
309
+ def visit_defs(node)
310
+ node("defs") do
311
+ field("target", node.target)
312
+ field("operator", node.operator)
313
+ field("name", node.name)
314
+ field("params", node.params)
315
+ field("bodystmt", node.bodystmt)
316
+ comments(node)
317
+ end
318
+ end
319
+
320
+ def visit_do_block(node)
321
+ node("do_block") do
322
+ field("block_var", node.block_var) if node.block_var
323
+ field("bodystmt", node.bodystmt)
324
+ comments(node)
325
+ end
326
+ end
327
+
328
+ def visit_dot2(node)
329
+ node("dot2") do
330
+ field("left", node.left) if node.left
331
+ field("right", node.right) if node.right
332
+ comments(node)
333
+ end
334
+ end
335
+
336
+ def visit_dot3(node)
337
+ node("dot3") do
338
+ field("left", node.left) if node.left
339
+ field("right", node.right) if node.right
340
+ comments(node)
341
+ end
342
+ end
343
+
344
+ def visit_dyna_symbol(node)
345
+ node("dyna_symbol") do
346
+ list("parts", node.parts)
347
+ comments(node)
348
+ end
349
+ end
350
+
351
+ def visit_END(node)
352
+ node("END") do
353
+ field("statements", node.statements)
354
+ comments(node)
355
+ end
356
+ end
357
+
358
+ def visit_else(node)
359
+ node("else") do
360
+ field("statements", node.statements)
361
+ comments(node)
362
+ end
363
+ end
364
+
365
+ def visit_elsif(node)
366
+ node("elsif") do
367
+ field("predicate", node.predicate)
368
+ field("statements", node.statements)
369
+ field("consequent", node.consequent) if node.consequent
370
+ comments(node)
371
+ end
372
+ end
373
+
374
+ def visit_embdoc(node)
375
+ node("embdoc") do
376
+ field("value", node.value)
377
+ end
378
+ end
379
+
380
+ def visit_embexpr_beg(node)
381
+ node("embexpr_beg") do
382
+ field("value", node.value)
383
+ end
384
+ end
385
+
386
+ def visit_embexpr_end(node)
387
+ node("embexpr_end") do
388
+ field("value", node.value)
389
+ end
390
+ end
391
+
392
+ def visit_embvar(node)
393
+ node("embvar") do
394
+ field("value", node.value)
395
+ end
396
+ end
397
+
398
+ def visit_ensure(node)
399
+ node("ensure") do
400
+ field("statements", node.statements)
401
+ comments(node)
402
+ end
403
+ end
404
+
405
+ def visit_excessed_comma(node)
406
+ visit_token("excessed_comma", node)
407
+ end
408
+
409
+ def visit_fcall(node)
410
+ node("fcall") do
411
+ field("value", node.value)
412
+ field("arguments", node.arguments) if node.arguments
413
+ comments(node)
414
+ end
415
+ end
416
+
417
+ def visit_field(node)
418
+ node("field") do
419
+ field("parent", node.parent)
420
+ field("operator", node.operator)
421
+ field("name", node.name)
422
+ comments(node)
423
+ end
424
+ end
425
+
426
+ def visit_float(node)
427
+ visit_token("float", node)
428
+ end
429
+
430
+ def visit_fndptn(node)
431
+ node("fndptn") do
432
+ field("constant", node.constant) if node.constant
433
+ field("left", node.left)
434
+ list("values", node.values)
435
+ field("right", node.right)
436
+ comments(node)
437
+ end
438
+ end
439
+
440
+ def visit_for(node)
441
+ node("for") do
442
+ field("index", node.index)
443
+ field("collection", node.collection)
444
+ field("statements", node.statements)
445
+ comments(node)
446
+ end
447
+ end
448
+
449
+ def visit_gvar(node)
450
+ visit_token("gvar", node)
451
+ end
452
+
453
+ def visit_hash(node)
454
+ node("hash") do
455
+ list("assocs", node.assocs) if node.assocs.any?
456
+ comments(node)
457
+ end
458
+ end
459
+
460
+ def visit_heredoc(node)
461
+ node("heredoc") do
462
+ list("parts", node.parts)
463
+ comments(node)
464
+ end
465
+ end
466
+
467
+ def visit_heredoc_beg(node)
468
+ visit_token("heredoc_beg", node)
469
+ end
470
+
471
+ def visit_hshptn(node)
472
+ node("hshptn") do
473
+ field("constant", node.constant) if node.constant
474
+
475
+ if node.keywords.any?
476
+ q.breakable
477
+ q.group(2, "(", ")") do
478
+ q.seplist(node.keywords) do |(key, value)|
479
+ q.group(2, "(", ")") do
480
+ key.pretty_print(q)
481
+
482
+ if value
483
+ q.breakable
484
+ value.pretty_print(q)
485
+ end
486
+ end
487
+ end
488
+ end
489
+ end
490
+
491
+ field("keyword_rest", node.keyword_rest) if node.keyword_rest
492
+ comments(node)
493
+ end
494
+ end
495
+
496
+ def visit_ident(node)
497
+ visit_token("ident", node)
498
+ end
499
+
500
+ def visit_if(node)
501
+ node("if") do
502
+ field("predicate", node.predicate)
503
+ field("statements", node.statements)
504
+ field("consequent", node.consequent) if node.consequent
505
+ comments(node)
506
+ end
507
+ end
508
+
509
+ def visit_if_mod(node)
510
+ node("if_mod") do
511
+ field("statement", node.statement)
512
+ field("predicate", node.predicate)
513
+ comments(node)
514
+ end
515
+ end
516
+
517
+ def visit_if_op(node)
518
+ node("ifop") do
519
+ field("predicate", node.predicate)
520
+ field("truthy", node.truthy)
521
+ field("falsy", node.falsy)
522
+ comments(node)
523
+ end
524
+ end
525
+
526
+ def visit_imaginary(node)
527
+ visit_token("imaginary", node)
528
+ end
529
+
530
+ def visit_in(node)
531
+ node("in") do
532
+ field("pattern", node.pattern)
533
+ field("statements", node.statements)
534
+ field("consequent", node.consequent) if node.consequent
535
+ comments(node)
536
+ end
537
+ end
538
+
539
+ def visit_int(node)
540
+ visit_token("int", node)
541
+ end
542
+
543
+ def visit_ivar(node)
544
+ visit_token("ivar", node)
545
+ end
546
+
547
+ def visit_kw(node)
548
+ visit_token("kw", node)
549
+ end
550
+
551
+ def visit_kwrest_param(node)
552
+ node("kwrest_param") do
553
+ field("name", node.name)
554
+ comments(node)
555
+ end
556
+ end
557
+
558
+ def visit_label(node)
559
+ node("label") do
560
+ q.breakable
561
+ q.text(":")
562
+ q.text(node.value[0...-1])
563
+ comments(node)
564
+ end
565
+ end
566
+
567
+ def visit_label_end(node)
568
+ node("label_end") do
569
+ field("value", node.value)
570
+ end
571
+ end
572
+
573
+ def visit_lambda(node)
574
+ node("lambda") do
575
+ field("params", node.params)
576
+ field("statements", node.statements)
577
+ comments(node)
578
+ end
579
+ end
580
+
581
+ def visit_lbrace(node)
582
+ visit_token("lbrace", node)
583
+ end
584
+
585
+ def visit_lbracket(node)
586
+ visit_token("lbracket", node)
587
+ end
588
+
589
+ def visit_lparen(node)
590
+ visit_token("lparen", node)
591
+ end
592
+
593
+ def visit_massign(node)
594
+ node("massign") do
595
+ field("target", node.target)
596
+ field("value", node.value)
597
+ comments(node)
598
+ end
599
+ end
600
+
601
+ def visit_method_add_block(node)
602
+ node("method_add_block") do
603
+ field("call", node.call)
604
+ field("block", node.block)
605
+ comments(node)
606
+ end
607
+ end
608
+
609
+ def visit_mlhs(node)
610
+ node("mlhs") do
611
+ list("parts", node.parts)
612
+ comments(node)
613
+ end
614
+ end
615
+
616
+ def visit_mlhs_paren(node)
617
+ node("mlhs_paren") do
618
+ field("contents", node.contents)
619
+ comments(node)
620
+ end
621
+ end
622
+
623
+ def visit_module(node)
624
+ node("module") do
625
+ field("constant", node.constant)
626
+ field("bodystmt", node.bodystmt)
627
+ comments(node)
628
+ end
629
+ end
630
+
631
+ def visit_mrhs(node)
632
+ node("mrhs") do
633
+ list("parts", node.parts)
634
+ comments(node)
635
+ end
636
+ end
637
+
638
+ def visit_next(node)
639
+ node("next") do
640
+ field("arguments", node.arguments)
641
+ comments(node)
642
+ end
643
+ end
644
+
645
+ def visit_not(node)
646
+ node("not") do
647
+ field("statement", node.statement)
648
+ comments(node)
649
+ end
650
+ end
651
+
652
+ def visit_op(node)
653
+ visit_token("op", node)
654
+ end
655
+
656
+ def visit_opassign(node)
657
+ node("opassign") do
658
+ field("target", node.target)
659
+ field("operator", node.operator)
660
+ field("value", node.value)
661
+ comments(node)
662
+ end
663
+ end
664
+
665
+ def visit_params(node)
666
+ node("params") do
667
+ list("requireds", node.requireds) if node.requireds.any?
668
+
669
+ if node.optionals.any?
670
+ q.breakable
671
+ q.group(2, "(", ")") do
672
+ q.seplist(node.optionals) do |(name, default)|
673
+ name.pretty_print(q)
674
+ q.text("=")
675
+ q.group(2) do
676
+ q.breakable("")
677
+ default.pretty_print(q)
678
+ end
679
+ end
680
+ end
681
+ end
682
+
683
+ field("rest", node.rest) if node.rest
684
+ list("posts", node.posts) if node.posts.any?
685
+
686
+ if node.keywords.any?
687
+ q.breakable
688
+ q.group(2, "(", ")") do
689
+ q.seplist(node.keywords) do |(name, default)|
690
+ name.pretty_print(q)
691
+
692
+ if default
693
+ q.text("=")
694
+ q.group(2) do
695
+ q.breakable("")
696
+ default.pretty_print(q)
697
+ end
698
+ end
699
+ end
700
+ end
701
+ end
702
+
703
+ field("keyword_rest", node.keyword_rest) if node.keyword_rest
704
+ field("block", node.block) if node.block
705
+ comments(node)
706
+ end
707
+ end
708
+
709
+ def visit_paren(node)
710
+ node("paren") do
711
+ field("contents", node.contents)
712
+ comments(node)
713
+ end
714
+ end
715
+
716
+ def visit_period(node)
717
+ visit_token("period", node)
718
+ end
719
+
720
+ def visit_pinned_begin(node)
721
+ node("pinned_begin") do
722
+ field("statement", node.statement)
723
+ comments(node)
724
+ end
725
+ end
726
+
727
+ def visit_pinned_var_ref(node)
728
+ node("pinned_var_ref") do
729
+ field("value", node.value)
730
+ comments(node)
731
+ end
732
+ end
733
+
734
+ def visit_program(node)
735
+ node("program") do
736
+ field("statements", node.statements)
737
+ comments(node)
738
+ end
739
+ end
740
+
741
+ def visit_qsymbols(node)
742
+ node("qsymbols") do
743
+ list("elements", node.elements)
744
+ comments(node)
745
+ end
746
+ end
747
+
748
+ def visit_qsymbols_beg(node)
749
+ node("qsymbols_beg") do
750
+ field("value", node.value)
751
+ end
752
+ end
753
+
754
+ def visit_qwords(node)
755
+ node("qwords") do
756
+ list("elements", node.elements)
757
+ comments(node)
758
+ end
759
+ end
760
+
761
+ def visit_qwords_beg(node)
762
+ node("qwords_beg") do
763
+ field("value", node.value)
764
+ end
765
+ end
766
+
767
+ def visit_rassign(node)
768
+ node("rassign") do
769
+ field("value", node.value)
770
+ field("operator", node.operator)
771
+ field("pattern", node.pattern)
772
+ comments(node)
773
+ end
774
+ end
775
+
776
+ def visit_rational(node)
777
+ visit_token("rational", node)
778
+ end
779
+
780
+ def visit_rbrace(node)
781
+ node("rbrace") do
782
+ field("value", node.value)
783
+ end
784
+ end
785
+
786
+ def visit_rbracket(node)
787
+ node("rbracket") do
788
+ field("value", node.value)
789
+ end
790
+ end
791
+
792
+ def visit_redo(node)
793
+ visit_token("redo", node)
794
+ end
795
+
796
+ def visit_regexp_beg(node)
797
+ node("regexp_beg") do
798
+ field("value", node.value)
799
+ end
800
+ end
801
+
802
+ def visit_regexp_content(node)
803
+ node("regexp_content") do
804
+ list("parts", node.parts)
805
+ end
806
+ end
807
+
808
+ def visit_regexp_end(node)
809
+ node("regexp_end") do
810
+ field("value", node.value)
811
+ end
812
+ end
813
+
814
+ def visit_regexp_literal(node)
815
+ node("regexp_literal") do
816
+ list("parts", node.parts)
817
+ comments(node)
818
+ end
819
+ end
820
+
821
+ def visit_rescue(node)
822
+ node("rescue") do
823
+ field("exception", node.exception) if node.exception
824
+ field("statements", node.statements)
825
+ field("consequent", node.consequent) if node.consequent
826
+ comments(node)
827
+ end
828
+ end
829
+
830
+ def visit_rescue_ex(node)
831
+ node("rescue_ex") do
832
+ field("exceptions", node.exceptions)
833
+ field("variable", node.variable)
834
+ comments(node)
835
+ end
836
+ end
837
+
838
+ def visit_rescue_mod(node)
839
+ node("rescue_mod") do
840
+ field("statement", node.statement)
841
+ field("value", node.value)
842
+ comments(node)
843
+ end
844
+ end
845
+
846
+ def visit_rest_param(node)
847
+ node("rest_param") do
848
+ field("name", node.name)
849
+ comments(node)
850
+ end
851
+ end
852
+
853
+ def visit_retry(node)
854
+ visit_token("retry", node)
855
+ end
856
+
857
+ def visit_return(node)
858
+ node("return") do
859
+ field("arguments", node.arguments)
860
+ comments(node)
861
+ end
862
+ end
863
+
864
+ def visit_return0(node)
865
+ visit_token("return0", node)
866
+ end
867
+
868
+ def visit_rparen(node)
869
+ node("rparen") do
870
+ field("value", node.value)
871
+ end
872
+ end
873
+
874
+ def visit_sclass(node)
875
+ node("sclass") do
876
+ field("target", node.target)
877
+ field("bodystmt", node.bodystmt)
878
+ comments(node)
879
+ end
880
+ end
881
+
882
+ def visit_statements(node)
883
+ node("statements") do
884
+ list("body", node.body)
885
+ comments(node)
886
+ end
887
+ end
888
+
889
+ def visit_string_concat(node)
890
+ node("string_concat") do
891
+ field("left", node.left)
892
+ field("right", node.right)
893
+ comments(node)
894
+ end
895
+ end
896
+
897
+ def visit_string_content(node)
898
+ node("string_content") do
899
+ list("parts", node.parts)
900
+ end
901
+ end
902
+
903
+ def visit_string_dvar(node)
904
+ node("string_dvar") do
905
+ field("variable", node.variable)
906
+ comments(node)
907
+ end
908
+ end
909
+
910
+ def visit_string_embexpr(node)
911
+ node("string_embexpr") do
912
+ field("statements", node.statements)
913
+ comments(node)
914
+ end
915
+ end
916
+
917
+ def visit_string_literal(node)
918
+ node("string_literal") do
919
+ list("parts", node.parts)
920
+ comments(node)
921
+ end
922
+ end
923
+
924
+ def visit_super(node)
925
+ node("super") do
926
+ field("arguments", node.arguments)
927
+ comments(node)
928
+ end
929
+ end
930
+
931
+ def visit_symbeg(node)
932
+ node("symbeg") do
933
+ field("value", node.value)
934
+ end
935
+ end
936
+
937
+ def visit_symbol_content(node)
938
+ node("symbol_content") do
939
+ field("value", node.value)
940
+ end
941
+ end
942
+
943
+ def visit_symbol_literal(node)
944
+ node("symbol_literal") do
945
+ field("value", node.value)
946
+ comments(node)
947
+ end
948
+ end
949
+
950
+ def visit_symbols(node)
951
+ node("symbols") do
952
+ list("elements", node.elements)
953
+ comments(node)
954
+ end
955
+ end
956
+
957
+ def visit_symbols_beg(node)
958
+ node("symbols_beg") do
959
+ field("value", node.value)
960
+ end
961
+ end
962
+
963
+ def visit_tlambda(node)
964
+ node("tlambda") do
965
+ field("value", node.value)
966
+ end
967
+ end
968
+
969
+ def visit_tlambeg(node)
970
+ node("tlambeg") do
971
+ field("value", node.value)
972
+ end
973
+ end
974
+
975
+ def visit_top_const_field(node)
976
+ node("top_const_field") do
977
+ field("constant", node.constant)
978
+ comments(node)
979
+ end
980
+ end
981
+
982
+ def visit_top_const_ref(node)
983
+ node("top_const_ref") do
984
+ field("constant", node.constant)
985
+ comments(node)
986
+ end
987
+ end
988
+
989
+ def visit_tstring_beg(node)
990
+ node("tstring_beg") do
991
+ field("value", node.value)
992
+ end
993
+ end
994
+
995
+ def visit_tstring_content(node)
996
+ visit_token("tstring_content", node)
997
+ end
998
+
999
+ def visit_tstring_end(node)
1000
+ node("tstring_end") do
1001
+ field("value", node.value)
1002
+ end
1003
+ end
1004
+
1005
+ def visit_unary(node)
1006
+ node("unary") do
1007
+ field("operator", node.operator)
1008
+ field("statement", node.statement)
1009
+ comments(node)
1010
+ end
1011
+ end
1012
+
1013
+ def visit_undef(node)
1014
+ node("undef") do
1015
+ list("symbols", node.symbols)
1016
+ comments(node)
1017
+ end
1018
+ end
1019
+
1020
+ def visit_unless(node)
1021
+ node("unless") do
1022
+ field("predicate", node.predicate)
1023
+ field("statements", node.statements)
1024
+ field("consequent", node.consequent) if node.consequent
1025
+ comments(node)
1026
+ end
1027
+ end
1028
+
1029
+ def visit_unless_mod(node)
1030
+ node("unless_mod") do
1031
+ field("statement", node.statement)
1032
+ field("predicate", node.predicate)
1033
+ comments(node)
1034
+ end
1035
+ end
1036
+
1037
+ def visit_until(node)
1038
+ node("until") do
1039
+ field("predicate", node.predicate)
1040
+ field("statements", node.statements)
1041
+ comments(node)
1042
+ end
1043
+ end
1044
+
1045
+ def visit_until_mod(node)
1046
+ node("until_mod") do
1047
+ field("statement", node.statement)
1048
+ field("predicate", node.predicate)
1049
+ comments(node)
1050
+ end
1051
+ end
1052
+
1053
+ def visit_var_alias(node)
1054
+ node("var_alias") do
1055
+ field("left", node.left)
1056
+ field("right", node.right)
1057
+ comments(node)
1058
+ end
1059
+ end
1060
+
1061
+ def visit_var_field(node)
1062
+ node("var_field") do
1063
+ field("value", node.value)
1064
+ comments(node)
1065
+ end
1066
+ end
1067
+
1068
+ def visit_var_ref(node)
1069
+ node("var_ref") do
1070
+ field("value", node.value)
1071
+ comments(node)
1072
+ end
1073
+ end
1074
+
1075
+ def visit_vcall(node)
1076
+ node("vcall") do
1077
+ field("value", node.value)
1078
+ comments(node)
1079
+ end
1080
+ end
1081
+
1082
+ def visit_void_stmt(node)
1083
+ node("void_stmt") do
1084
+ comments(node)
1085
+ end
1086
+ end
1087
+
1088
+ def visit_when(node)
1089
+ node("when") do
1090
+ field("arguments", node.arguments)
1091
+ field("statements", node.statements)
1092
+ field("consequent", node.consequent) if node.consequent
1093
+ comments(node)
1094
+ end
1095
+ end
1096
+
1097
+ def visit_while(node)
1098
+ node("while") do
1099
+ field("predicate", node.predicate)
1100
+ field("statements", node.statements)
1101
+ comments(node)
1102
+ end
1103
+ end
1104
+
1105
+ def visit_while_mod(node)
1106
+ node("while_mod") do
1107
+ field("statement", node.statement)
1108
+ field("predicate", node.predicate)
1109
+ comments(node)
1110
+ end
1111
+ end
1112
+
1113
+ def visit_word(node)
1114
+ node("word") do
1115
+ list("parts", node.parts)
1116
+ comments(node)
1117
+ end
1118
+ end
1119
+
1120
+ def visit_words(node)
1121
+ node("words") do
1122
+ list("elements", node.elements)
1123
+ comments(node)
1124
+ end
1125
+ end
1126
+
1127
+ def visit_words_beg(node)
1128
+ node("words_beg") do
1129
+ field("value", node.value)
1130
+ end
1131
+ end
1132
+
1133
+ def visit_xstring(node)
1134
+ node("xstring") do
1135
+ list("parts", node.parts)
1136
+ end
1137
+ end
1138
+
1139
+ def visit_xstring_literal(node)
1140
+ node("xstring_literal") do
1141
+ list("parts", node.parts)
1142
+ comments(node)
1143
+ end
1144
+ end
1145
+
1146
+ def visit_yield(node)
1147
+ node("yield") do
1148
+ field("arguments", node.arguments)
1149
+ comments(node)
1150
+ end
1151
+ end
1152
+
1153
+ def visit_yield0(node)
1154
+ visit_token("yield0", node)
1155
+ end
1156
+
1157
+ def visit_zsuper(node)
1158
+ visit_token("zsuper", node)
1159
+ end
1160
+
1161
+ def visit___end__(node)
1162
+ visit_token("__end__", node)
1163
+ end
1164
+
1165
+ private
1166
+
1167
+ def comments(node)
1168
+ return if node.comments.empty?
1169
+
1170
+ q.breakable
1171
+ q.group(2, "(", ")") do
1172
+ q.seplist(node.comments) { |comment| comment.pretty_print(q) }
1173
+ end
1174
+ end
1175
+
1176
+ def field(_name, value)
1177
+ q.breakable
1178
+
1179
+ # I don't entirely know why this is necessary, but in Ruby 2.7 there is
1180
+ # an issue with calling q.pp on strings that somehow involves inspect
1181
+ # keys. I'm purposefully avoiding the inspect key stuff here because I
1182
+ # know the tree does not contain any cycles.
1183
+ value.is_a?(String) ? q.text(value.inspect) : value.pretty_print(q)
1184
+ end
1185
+
1186
+ def list(_name, values)
1187
+ q.breakable
1188
+ q.group(2, "(", ")") do
1189
+ q.seplist(values) { |value| value.pretty_print(q) }
1190
+ end
1191
+ end
1192
+
1193
+ def node(type)
1194
+ q.group(2, "(", ")") do
1195
+ q.text(type)
1196
+ yield
1197
+ end
1198
+ end
1199
+
1200
+ def text(_name, value)
1201
+ q.breakable
1202
+ q.text(value)
1203
+ end
1204
+
1205
+ def visit_token(type, node)
1206
+ node(type) do
1207
+ field("value", node.value)
1208
+ comments(node)
1209
+ end
1210
+ end
1211
+ end
1212
+ end
1213
+ end