prism 1.3.0 → 1.5.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 (87) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -1
  3. data/Makefile +2 -1
  4. data/README.md +1 -0
  5. data/config.yml +273 -37
  6. data/docs/parser_translation.md +8 -23
  7. data/docs/releasing.md +1 -1
  8. data/docs/ripper_translation.md +1 -1
  9. data/docs/ruby_api.md +1 -1
  10. data/ext/prism/api_node.c +1816 -1303
  11. data/ext/prism/extension.c +244 -110
  12. data/ext/prism/extension.h +4 -4
  13. data/include/prism/ast.h +291 -49
  14. data/include/prism/defines.h +4 -1
  15. data/include/prism/diagnostic.h +4 -0
  16. data/include/prism/options.h +89 -3
  17. data/include/prism/regexp.h +2 -2
  18. data/include/prism/util/pm_buffer.h +18 -0
  19. data/include/prism/util/pm_integer.h +4 -0
  20. data/include/prism/util/pm_list.h +6 -0
  21. data/include/prism/util/pm_string.h +12 -2
  22. data/include/prism/version.h +2 -2
  23. data/include/prism.h +41 -16
  24. data/lib/prism/compiler.rb +456 -151
  25. data/lib/prism/desugar_compiler.rb +1 -0
  26. data/lib/prism/dispatcher.rb +16 -0
  27. data/lib/prism/dot_visitor.rb +21 -1
  28. data/lib/prism/dsl.rb +13 -2
  29. data/lib/prism/ffi.rb +62 -34
  30. data/lib/prism/inspect_visitor.rb +5 -1
  31. data/lib/prism/lex_compat.rb +1 -0
  32. data/lib/prism/mutation_compiler.rb +3 -0
  33. data/lib/prism/node.rb +554 -345
  34. data/lib/prism/node_ext.rb +4 -1
  35. data/lib/prism/pack.rb +2 -0
  36. data/lib/prism/parse_result/comments.rb +1 -0
  37. data/lib/prism/parse_result/errors.rb +1 -0
  38. data/lib/prism/parse_result/newlines.rb +2 -1
  39. data/lib/prism/parse_result.rb +53 -0
  40. data/lib/prism/pattern.rb +1 -0
  41. data/lib/prism/polyfill/append_as_bytes.rb +15 -0
  42. data/lib/prism/polyfill/scan_byte.rb +14 -0
  43. data/lib/prism/polyfill/warn.rb +42 -0
  44. data/lib/prism/reflection.rb +5 -2
  45. data/lib/prism/relocation.rb +1 -0
  46. data/lib/prism/serialize.rb +1275 -783
  47. data/lib/prism/string_query.rb +1 -0
  48. data/lib/prism/translation/parser/builder.rb +62 -0
  49. data/lib/prism/translation/parser/compiler.rb +230 -152
  50. data/lib/prism/translation/parser/lexer.rb +446 -64
  51. data/lib/prism/translation/parser.rb +64 -4
  52. data/lib/prism/translation/parser33.rb +1 -0
  53. data/lib/prism/translation/parser34.rb +1 -0
  54. data/lib/prism/translation/parser35.rb +13 -0
  55. data/lib/prism/translation/parser_current.rb +24 -0
  56. data/lib/prism/translation/ripper/sexp.rb +1 -0
  57. data/lib/prism/translation/ripper.rb +30 -4
  58. data/lib/prism/translation/ruby_parser.rb +291 -7
  59. data/lib/prism/translation.rb +3 -0
  60. data/lib/prism/visitor.rb +457 -152
  61. data/lib/prism.rb +5 -3
  62. data/prism.gemspec +9 -1
  63. data/rbi/prism/dsl.rbi +9 -6
  64. data/rbi/prism/node.rbi +43 -16
  65. data/rbi/prism/parse_result.rbi +17 -0
  66. data/rbi/prism/translation/parser35.rbi +6 -0
  67. data/rbi/prism.rbi +39 -36
  68. data/sig/prism/dispatcher.rbs +3 -0
  69. data/sig/prism/dsl.rbs +7 -5
  70. data/sig/prism/node.rbs +461 -37
  71. data/sig/prism/node_ext.rbs +84 -17
  72. data/sig/prism/parse_result/comments.rbs +38 -0
  73. data/sig/prism/parse_result.rbs +14 -0
  74. data/sig/prism/reflection.rbs +1 -1
  75. data/sig/prism/serialize.rbs +4 -2
  76. data/sig/prism.rbs +22 -1
  77. data/src/diagnostic.c +9 -3
  78. data/src/node.c +23 -0
  79. data/src/options.c +33 -2
  80. data/src/prettyprint.c +32 -0
  81. data/src/prism.c +620 -242
  82. data/src/serialize.c +8 -0
  83. data/src/token_type.c +36 -34
  84. data/src/util/pm_buffer.c +40 -0
  85. data/src/util/pm_constant_pool.c +6 -2
  86. data/src/util/pm_strncasecmp.c +13 -1
  87. metadata +11 -7
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # :markup: markdown
2
3
 
3
4
  begin
4
5
  require "ruby_parser"
@@ -15,7 +16,7 @@ module Prism
15
16
  # A prism visitor that builds Sexp objects.
16
17
  class Compiler < ::Prism::Compiler
17
18
  # This is the name of the file that we are compiling. We set it on every
18
- # Sexp object that is generated, and also use it to compile __FILE__
19
+ # Sexp object that is generated, and also use it to compile `__FILE__`
19
20
  # nodes.
20
21
  attr_reader :file
21
22
 
@@ -34,26 +35,34 @@ module Prism
34
35
  @in_pattern = in_pattern
35
36
  end
36
37
 
38
+ # ```
37
39
  # alias foo bar
38
40
  # ^^^^^^^^^^^^^
41
+ # ```
39
42
  def visit_alias_method_node(node)
40
43
  s(node, :alias, visit(node.new_name), visit(node.old_name))
41
44
  end
42
45
 
46
+ # ```
43
47
  # alias $foo $bar
44
48
  # ^^^^^^^^^^^^^^^
49
+ # ```
45
50
  def visit_alias_global_variable_node(node)
46
51
  s(node, :valias, node.new_name.name, node.old_name.name)
47
52
  end
48
53
 
54
+ # ```
49
55
  # foo => bar | baz
50
56
  # ^^^^^^^^^
57
+ # ```
51
58
  def visit_alternation_pattern_node(node)
52
59
  s(node, :or, visit(node.left), visit(node.right))
53
60
  end
54
61
 
62
+ # ```
55
63
  # a and b
56
64
  # ^^^^^^^
65
+ # ```
57
66
  def visit_and_node(node)
58
67
  left = visit(node.left)
59
68
 
@@ -70,8 +79,10 @@ module Prism
70
79
  end
71
80
  end
72
81
 
82
+ # ```
73
83
  # []
74
84
  # ^^
85
+ # ```
75
86
  def visit_array_node(node)
76
87
  if in_pattern
77
88
  s(node, :array_pat, nil).concat(visit_all(node.elements))
@@ -80,8 +91,10 @@ module Prism
80
91
  end
81
92
  end
82
93
 
94
+ # ```
83
95
  # foo => [bar]
84
96
  # ^^^^^
97
+ # ```
85
98
  def visit_array_pattern_node(node)
86
99
  if node.constant.nil? && node.requireds.empty? && node.rest.nil? && node.posts.empty?
87
100
  s(node, :array_pat)
@@ -103,23 +116,29 @@ module Prism
103
116
  end
104
117
  end
105
118
 
119
+ # ```
106
120
  # foo(bar)
107
121
  # ^^^
122
+ # ```
108
123
  def visit_arguments_node(node)
109
124
  raise "Cannot visit arguments directly"
110
125
  end
111
126
 
127
+ # ```
112
128
  # { a: 1 }
113
129
  # ^^^^
130
+ # ```
114
131
  def visit_assoc_node(node)
115
132
  [visit(node.key), visit(node.value)]
116
133
  end
117
134
 
135
+ # ```
118
136
  # def foo(**); bar(**); end
119
137
  # ^^
120
138
  #
121
139
  # { **foo }
122
140
  # ^^^^^
141
+ # ```
123
142
  def visit_assoc_splat_node(node)
124
143
  if node.value.nil?
125
144
  [s(node, :kwsplat)]
@@ -128,14 +147,18 @@ module Prism
128
147
  end
129
148
  end
130
149
 
150
+ # ```
131
151
  # $+
132
152
  # ^^
153
+ # ```
133
154
  def visit_back_reference_read_node(node)
134
155
  s(node, :back_ref, node.name.name.delete_prefix("$").to_sym)
135
156
  end
136
157
 
158
+ # ```
137
159
  # begin end
138
160
  # ^^^^^^^^^
161
+ # ```
139
162
  def visit_begin_node(node)
140
163
  result = node.statements.nil? ? s(node, :nil) : visit(node.statements)
141
164
 
@@ -167,16 +190,20 @@ module Prism
167
190
  result
168
191
  end
169
192
 
193
+ # ```
170
194
  # foo(&bar)
171
195
  # ^^^^
196
+ # ```
172
197
  def visit_block_argument_node(node)
173
198
  s(node, :block_pass).tap do |result|
174
199
  result << visit(node.expression) unless node.expression.nil?
175
200
  end
176
201
  end
177
202
 
203
+ # ```
178
204
  # foo { |; bar| }
179
205
  # ^^^
206
+ # ```
180
207
  def visit_block_local_variable_node(node)
181
208
  node.name
182
209
  end
@@ -186,8 +213,10 @@ module Prism
186
213
  s(node, :block_pass, visit(node.expression))
187
214
  end
188
215
 
216
+ # ```
189
217
  # def foo(&bar); end
190
218
  # ^^^^
219
+ # ```
191
220
  def visit_block_parameter_node(node)
192
221
  :"&#{node.name}"
193
222
  end
@@ -228,11 +257,13 @@ module Prism
228
257
  result
229
258
  end
230
259
 
260
+ # ```
231
261
  # break
232
262
  # ^^^^^
233
263
  #
234
264
  # break foo
235
265
  # ^^^^^^^^^
266
+ # ```
236
267
  def visit_break_node(node)
237
268
  if node.arguments.nil?
238
269
  s(node, :break)
@@ -243,6 +274,7 @@ module Prism
243
274
  end
244
275
  end
245
276
 
277
+ # ```
246
278
  # foo
247
279
  # ^^^
248
280
  #
@@ -251,6 +283,7 @@ module Prism
251
283
  #
252
284
  # foo.bar() {}
253
285
  # ^^^^^^^^^^^^
286
+ # ```
254
287
  def visit_call_node(node)
255
288
  case node.name
256
289
  when :!~
@@ -289,8 +322,10 @@ module Prism
289
322
  visit_block(node, result, block)
290
323
  end
291
324
 
325
+ # ```
292
326
  # foo.bar += baz
293
327
  # ^^^^^^^^^^^^^^^
328
+ # ```
294
329
  def visit_call_operator_write_node(node)
295
330
  if op_asgn?(node)
296
331
  s(node, op_asgn_type(node, :op_asgn), visit(node.receiver), visit_write_value(node.value), node.read_name, node.binary_operator)
@@ -299,8 +334,10 @@ module Prism
299
334
  end
300
335
  end
301
336
 
337
+ # ```
302
338
  # foo.bar &&= baz
303
339
  # ^^^^^^^^^^^^^^^
340
+ # ```
304
341
  def visit_call_and_write_node(node)
305
342
  if op_asgn?(node)
306
343
  s(node, op_asgn_type(node, :op_asgn), visit(node.receiver), visit_write_value(node.value), node.read_name, :"&&")
@@ -309,8 +346,10 @@ module Prism
309
346
  end
310
347
  end
311
348
 
349
+ # ```
312
350
  # foo.bar ||= baz
313
351
  # ^^^^^^^^^^^^^^^
352
+ # ```
314
353
  def visit_call_or_write_node(node)
315
354
  if op_asgn?(node)
316
355
  s(node, op_asgn_type(node, :op_asgn), visit(node.receiver), visit_write_value(node.value), node.read_name, :"||")
@@ -332,32 +371,42 @@ module Prism
332
371
  node.safe_navigation? ? :"safe_#{type}" : type
333
372
  end
334
373
 
374
+ # ```
335
375
  # foo.bar, = 1
336
376
  # ^^^^^^^
377
+ # ```
337
378
  def visit_call_target_node(node)
338
379
  s(node, :attrasgn, visit(node.receiver), node.name)
339
380
  end
340
381
 
382
+ # ```
341
383
  # foo => bar => baz
342
384
  # ^^^^^^^^^^
385
+ # ```
343
386
  def visit_capture_pattern_node(node)
344
387
  visit(node.target) << visit(node.value)
345
388
  end
346
389
 
390
+ # ```
347
391
  # case foo; when bar; end
348
392
  # ^^^^^^^^^^^^^^^^^^^^^^^
393
+ # ```
349
394
  def visit_case_node(node)
350
395
  s(node, :case, visit(node.predicate)).concat(visit_all(node.conditions)) << visit(node.else_clause)
351
396
  end
352
397
 
398
+ # ```
353
399
  # case foo; in bar; end
354
400
  # ^^^^^^^^^^^^^^^^^^^^^
401
+ # ```
355
402
  def visit_case_match_node(node)
356
403
  s(node, :case, visit(node.predicate)).concat(visit_all(node.conditions)) << visit(node.else_clause)
357
404
  end
358
405
 
406
+ # ```
359
407
  # class Foo; end
360
408
  # ^^^^^^^^^^^^^^
409
+ # ```
361
410
  def visit_class_node(node)
362
411
  name =
363
412
  if node.constant_path.is_a?(ConstantReadNode)
@@ -376,41 +425,53 @@ module Prism
376
425
  end
377
426
  end
378
427
 
428
+ # ```
379
429
  # @@foo
380
430
  # ^^^^^
431
+ # ```
381
432
  def visit_class_variable_read_node(node)
382
433
  s(node, :cvar, node.name)
383
434
  end
384
435
 
436
+ # ```
385
437
  # @@foo = 1
386
438
  # ^^^^^^^^^
387
439
  #
388
440
  # @@foo, @@bar = 1
389
441
  # ^^^^^ ^^^^^
442
+ # ```
390
443
  def visit_class_variable_write_node(node)
391
444
  s(node, class_variable_write_type, node.name, visit_write_value(node.value))
392
445
  end
393
446
 
447
+ # ```
394
448
  # @@foo += bar
395
449
  # ^^^^^^^^^^^^
450
+ # ```
396
451
  def visit_class_variable_operator_write_node(node)
397
452
  s(node, class_variable_write_type, node.name, s(node, :call, s(node, :cvar, node.name), node.binary_operator, visit_write_value(node.value)))
398
453
  end
399
454
 
455
+ # ```
400
456
  # @@foo &&= bar
401
457
  # ^^^^^^^^^^^^^
458
+ # ```
402
459
  def visit_class_variable_and_write_node(node)
403
460
  s(node, :op_asgn_and, s(node, :cvar, node.name), s(node, class_variable_write_type, node.name, visit_write_value(node.value)))
404
461
  end
405
462
 
463
+ # ```
406
464
  # @@foo ||= bar
407
465
  # ^^^^^^^^^^^^^
466
+ # ```
408
467
  def visit_class_variable_or_write_node(node)
409
468
  s(node, :op_asgn_or, s(node, :cvar, node.name), s(node, class_variable_write_type, node.name, visit_write_value(node.value)))
410
469
  end
411
470
 
471
+ # ```
412
472
  # @@foo, = bar
413
473
  # ^^^^^
474
+ # ```
414
475
  def visit_class_variable_target_node(node)
415
476
  s(node, class_variable_write_type, node.name)
416
477
  end
@@ -421,47 +482,61 @@ module Prism
421
482
  in_def ? :cvasgn : :cvdecl
422
483
  end
423
484
 
485
+ # ```
424
486
  # Foo
425
487
  # ^^^
488
+ # ```
426
489
  def visit_constant_read_node(node)
427
490
  s(node, :const, node.name)
428
491
  end
429
492
 
493
+ # ```
430
494
  # Foo = 1
431
495
  # ^^^^^^^
432
496
  #
433
497
  # Foo, Bar = 1
434
498
  # ^^^ ^^^
499
+ # ```
435
500
  def visit_constant_write_node(node)
436
501
  s(node, :cdecl, node.name, visit_write_value(node.value))
437
502
  end
438
503
 
504
+ # ```
439
505
  # Foo += bar
440
506
  # ^^^^^^^^^^^
507
+ # ```
441
508
  def visit_constant_operator_write_node(node)
442
509
  s(node, :cdecl, node.name, s(node, :call, s(node, :const, node.name), node.binary_operator, visit_write_value(node.value)))
443
510
  end
444
511
 
512
+ # ```
445
513
  # Foo &&= bar
446
514
  # ^^^^^^^^^^^^
515
+ # ```
447
516
  def visit_constant_and_write_node(node)
448
517
  s(node, :op_asgn_and, s(node, :const, node.name), s(node, :cdecl, node.name, visit(node.value)))
449
518
  end
450
519
 
520
+ # ```
451
521
  # Foo ||= bar
452
522
  # ^^^^^^^^^^^^
523
+ # ```
453
524
  def visit_constant_or_write_node(node)
454
525
  s(node, :op_asgn_or, s(node, :const, node.name), s(node, :cdecl, node.name, visit(node.value)))
455
526
  end
456
527
 
528
+ # ```
457
529
  # Foo, = bar
458
530
  # ^^^
531
+ # ```
459
532
  def visit_constant_target_node(node)
460
533
  s(node, :cdecl, node.name)
461
534
  end
462
535
 
536
+ # ```
463
537
  # Foo::Bar
464
538
  # ^^^^^^^^
539
+ # ```
465
540
  def visit_constant_path_node(node)
466
541
  if node.parent.nil?
467
542
  s(node, :colon3, node.name)
@@ -470,35 +545,45 @@ module Prism
470
545
  end
471
546
  end
472
547
 
548
+ # ```
473
549
  # Foo::Bar = 1
474
550
  # ^^^^^^^^^^^^
475
551
  #
476
552
  # Foo::Foo, Bar::Bar = 1
477
553
  # ^^^^^^^^ ^^^^^^^^
554
+ # ```
478
555
  def visit_constant_path_write_node(node)
479
556
  s(node, :cdecl, visit(node.target), visit_write_value(node.value))
480
557
  end
481
558
 
559
+ # ```
482
560
  # Foo::Bar += baz
483
561
  # ^^^^^^^^^^^^^^^
562
+ # ```
484
563
  def visit_constant_path_operator_write_node(node)
485
564
  s(node, :op_asgn, visit(node.target), node.binary_operator, visit_write_value(node.value))
486
565
  end
487
566
 
567
+ # ```
488
568
  # Foo::Bar &&= baz
489
569
  # ^^^^^^^^^^^^^^^^
570
+ # ```
490
571
  def visit_constant_path_and_write_node(node)
491
572
  s(node, :op_asgn_and, visit(node.target), visit_write_value(node.value))
492
573
  end
493
574
 
575
+ # ```
494
576
  # Foo::Bar ||= baz
495
577
  # ^^^^^^^^^^^^^^^^
578
+ # ```
496
579
  def visit_constant_path_or_write_node(node)
497
580
  s(node, :op_asgn_or, visit(node.target), visit_write_value(node.value))
498
581
  end
499
582
 
583
+ # ```
500
584
  # Foo::Bar, = baz
501
585
  # ^^^^^^^^
586
+ # ```
502
587
  def visit_constant_path_target_node(node)
503
588
  inner =
504
589
  if node.parent.nil?
@@ -510,11 +595,13 @@ module Prism
510
595
  s(node, :const, inner)
511
596
  end
512
597
 
598
+ # ```
513
599
  # def foo; end
514
600
  # ^^^^^^^^^^^^
515
601
  #
516
602
  # def self.foo; end
517
603
  # ^^^^^^^^^^^^^^^^^
604
+ # ```
518
605
  def visit_def_node(node)
519
606
  name = node.name_loc.slice.to_sym
520
607
  result =
@@ -541,55 +628,71 @@ module Prism
541
628
  end
542
629
  end
543
630
 
631
+ # ```
544
632
  # defined? a
545
633
  # ^^^^^^^^^^
546
634
  #
547
635
  # defined?(a)
548
636
  # ^^^^^^^^^^^
637
+ # ```
549
638
  def visit_defined_node(node)
550
639
  s(node, :defined, visit(node.value))
551
640
  end
552
641
 
642
+ # ```
553
643
  # if foo then bar else baz end
554
644
  # ^^^^^^^^^^^^
645
+ # ```
555
646
  def visit_else_node(node)
556
647
  visit(node.statements)
557
648
  end
558
649
 
650
+ # ```
559
651
  # "foo #{bar}"
560
652
  # ^^^^^^
653
+ # ```
561
654
  def visit_embedded_statements_node(node)
562
655
  result = s(node, :evstr)
563
656
  result << visit(node.statements) unless node.statements.nil?
564
657
  result
565
658
  end
566
659
 
660
+ # ```
567
661
  # "foo #@bar"
568
662
  # ^^^^^
663
+ # ```
569
664
  def visit_embedded_variable_node(node)
570
665
  s(node, :evstr, visit(node.variable))
571
666
  end
572
667
 
668
+ # ```
573
669
  # begin; foo; ensure; bar; end
574
670
  # ^^^^^^^^^^^^
671
+ # ```
575
672
  def visit_ensure_node(node)
576
673
  node.statements.nil? ? s(node, :nil) : visit(node.statements)
577
674
  end
578
675
 
676
+ # ```
579
677
  # false
580
678
  # ^^^^^
679
+ # ```
581
680
  def visit_false_node(node)
582
681
  s(node, :false)
583
682
  end
584
683
 
684
+ # ```
585
685
  # foo => [*, bar, *]
586
686
  # ^^^^^^^^^^^
687
+ # ```
587
688
  def visit_find_pattern_node(node)
588
689
  s(node, :find_pat, visit_pattern_constant(node.constant), :"*#{node.left.expression&.name}", *visit_all(node.requireds), :"*#{node.right.expression&.name}")
589
690
  end
590
691
 
692
+ # ```
591
693
  # if foo .. bar; end
592
694
  # ^^^^^^^^^^
695
+ # ```
593
696
  def visit_flip_flop_node(node)
594
697
  if node.left.is_a?(IntegerNode) && node.right.is_a?(IntegerNode)
595
698
  s(node, :lit, Range.new(node.left.value, node.right.value, node.exclude_end?))
@@ -598,86 +701,112 @@ module Prism
598
701
  end
599
702
  end
600
703
 
704
+ # ```
601
705
  # 1.0
602
706
  # ^^^
707
+ # ```
603
708
  def visit_float_node(node)
604
709
  s(node, :lit, node.value)
605
710
  end
606
711
 
712
+ # ```
607
713
  # for foo in bar do end
608
714
  # ^^^^^^^^^^^^^^^^^^^^^
715
+ # ```
609
716
  def visit_for_node(node)
610
717
  s(node, :for, visit(node.collection), visit(node.index), visit(node.statements))
611
718
  end
612
719
 
720
+ # ```
613
721
  # def foo(...); bar(...); end
614
722
  # ^^^
723
+ # ```
615
724
  def visit_forwarding_arguments_node(node)
616
725
  s(node, :forward_args)
617
726
  end
618
727
 
728
+ # ```
619
729
  # def foo(...); end
620
730
  # ^^^
731
+ # ```
621
732
  def visit_forwarding_parameter_node(node)
622
733
  s(node, :forward_args)
623
734
  end
624
735
 
736
+ # ```
625
737
  # super
626
738
  # ^^^^^
627
739
  #
628
740
  # super {}
629
741
  # ^^^^^^^^
742
+ # ```
630
743
  def visit_forwarding_super_node(node)
631
744
  visit_block(node, s(node, :zsuper), node.block)
632
745
  end
633
746
 
747
+ # ```
634
748
  # $foo
635
749
  # ^^^^
750
+ # ```
636
751
  def visit_global_variable_read_node(node)
637
752
  s(node, :gvar, node.name)
638
753
  end
639
754
 
755
+ # ```
640
756
  # $foo = 1
641
757
  # ^^^^^^^^
642
758
  #
643
759
  # $foo, $bar = 1
644
760
  # ^^^^ ^^^^
761
+ # ```
645
762
  def visit_global_variable_write_node(node)
646
763
  s(node, :gasgn, node.name, visit_write_value(node.value))
647
764
  end
648
765
 
766
+ # ```
649
767
  # $foo += bar
650
768
  # ^^^^^^^^^^^
769
+ # ```
651
770
  def visit_global_variable_operator_write_node(node)
652
771
  s(node, :gasgn, node.name, s(node, :call, s(node, :gvar, node.name), node.binary_operator, visit(node.value)))
653
772
  end
654
773
 
774
+ # ```
655
775
  # $foo &&= bar
656
776
  # ^^^^^^^^^^^^
777
+ # ```
657
778
  def visit_global_variable_and_write_node(node)
658
779
  s(node, :op_asgn_and, s(node, :gvar, node.name), s(node, :gasgn, node.name, visit_write_value(node.value)))
659
780
  end
660
781
 
782
+ # ```
661
783
  # $foo ||= bar
662
784
  # ^^^^^^^^^^^^
785
+ # ```
663
786
  def visit_global_variable_or_write_node(node)
664
787
  s(node, :op_asgn_or, s(node, :gvar, node.name), s(node, :gasgn, node.name, visit_write_value(node.value)))
665
788
  end
666
789
 
790
+ # ```
667
791
  # $foo, = bar
668
792
  # ^^^^
793
+ # ```
669
794
  def visit_global_variable_target_node(node)
670
795
  s(node, :gasgn, node.name)
671
796
  end
672
797
 
798
+ # ```
673
799
  # {}
674
800
  # ^^
801
+ # ```
675
802
  def visit_hash_node(node)
676
803
  s(node, :hash).concat(node.elements.flat_map { |element| visit(element) })
677
804
  end
678
805
 
806
+ # ```
679
807
  # foo => {}
680
808
  # ^^
809
+ # ```
681
810
  def visit_hash_pattern_node(node)
682
811
  result = s(node, :hash_pat, visit_pattern_constant(node.constant)).concat(node.elements.flat_map { |element| visit(element) })
683
812
 
@@ -691,6 +820,7 @@ module Prism
691
820
  result
692
821
  end
693
822
 
823
+ # ```
694
824
  # if foo then bar end
695
825
  # ^^^^^^^^^^^^^^^^^^^
696
826
  #
@@ -699,6 +829,7 @@ module Prism
699
829
  #
700
830
  # foo ? bar : baz
701
831
  # ^^^^^^^^^^^^^^^
832
+ # ```
702
833
  def visit_if_node(node)
703
834
  s(node, :if, visit(node.predicate), visit(node.statements), visit(node.subsequent))
704
835
  end
@@ -708,18 +839,24 @@ module Prism
708
839
  s(node, :lit, node.value)
709
840
  end
710
841
 
842
+ # ```
711
843
  # { foo: }
712
844
  # ^^^^
845
+ # ```
713
846
  def visit_implicit_node(node)
714
847
  end
715
848
 
849
+ # ```
716
850
  # foo { |bar,| }
717
851
  # ^
852
+ # ```
718
853
  def visit_implicit_rest_node(node)
719
854
  end
720
855
 
856
+ # ```
721
857
  # case foo; in bar; end
722
858
  # ^^^^^^^^^^^^^^^^^^^^^
859
+ # ```
723
860
  def visit_in_node(node)
724
861
  pattern =
725
862
  if node.pattern.is_a?(ConstantPathNode)
@@ -731,8 +868,10 @@ module Prism
731
868
  s(node, :in, pattern).concat(node.statements.nil? ? [nil] : visit_all(node.statements.body))
732
869
  end
733
870
 
871
+ # ```
734
872
  # foo[bar] += baz
735
873
  # ^^^^^^^^^^^^^^^
874
+ # ```
736
875
  def visit_index_operator_write_node(node)
737
876
  arglist = nil
738
877
 
@@ -744,8 +883,10 @@ module Prism
744
883
  s(node, :op_asgn1, visit(node.receiver), arglist, node.binary_operator, visit_write_value(node.value))
745
884
  end
746
885
 
886
+ # ```
747
887
  # foo[bar] &&= baz
748
888
  # ^^^^^^^^^^^^^^^^
889
+ # ```
749
890
  def visit_index_and_write_node(node)
750
891
  arglist = nil
751
892
 
@@ -757,8 +898,10 @@ module Prism
757
898
  s(node, :op_asgn1, visit(node.receiver), arglist, :"&&", visit_write_value(node.value))
758
899
  end
759
900
 
901
+ # ```
760
902
  # foo[bar] ||= baz
761
903
  # ^^^^^^^^^^^^^^^^
904
+ # ```
762
905
  def visit_index_or_write_node(node)
763
906
  arglist = nil
764
907
 
@@ -770,8 +913,10 @@ module Prism
770
913
  s(node, :op_asgn1, visit(node.receiver), arglist, :"||", visit_write_value(node.value))
771
914
  end
772
915
 
916
+ # ```
773
917
  # foo[bar], = 1
774
918
  # ^^^^^^^^
919
+ # ```
775
920
  def visit_index_target_node(node)
776
921
  arguments = visit_all(node.arguments&.arguments || [])
777
922
  arguments << visit(node.block) unless node.block.nil?
@@ -779,53 +924,69 @@ module Prism
779
924
  s(node, :attrasgn, visit(node.receiver), :[]=).concat(arguments)
780
925
  end
781
926
 
927
+ # ```
782
928
  # @foo
783
929
  # ^^^^
930
+ # ```
784
931
  def visit_instance_variable_read_node(node)
785
932
  s(node, :ivar, node.name)
786
933
  end
787
934
 
935
+ # ```
788
936
  # @foo = 1
789
937
  # ^^^^^^^^
790
938
  #
791
939
  # @foo, @bar = 1
792
940
  # ^^^^ ^^^^
941
+ # ```
793
942
  def visit_instance_variable_write_node(node)
794
943
  s(node, :iasgn, node.name, visit_write_value(node.value))
795
944
  end
796
945
 
946
+ # ```
797
947
  # @foo += bar
798
948
  # ^^^^^^^^^^^
949
+ # ```
799
950
  def visit_instance_variable_operator_write_node(node)
800
951
  s(node, :iasgn, node.name, s(node, :call, s(node, :ivar, node.name), node.binary_operator, visit_write_value(node.value)))
801
952
  end
802
953
 
954
+ # ```
803
955
  # @foo &&= bar
804
956
  # ^^^^^^^^^^^^
957
+ # ```
805
958
  def visit_instance_variable_and_write_node(node)
806
959
  s(node, :op_asgn_and, s(node, :ivar, node.name), s(node, :iasgn, node.name, visit(node.value)))
807
960
  end
808
961
 
962
+ # ```
809
963
  # @foo ||= bar
810
964
  # ^^^^^^^^^^^^
965
+ # ```
811
966
  def visit_instance_variable_or_write_node(node)
812
967
  s(node, :op_asgn_or, s(node, :ivar, node.name), s(node, :iasgn, node.name, visit(node.value)))
813
968
  end
814
969
 
970
+ # ```
815
971
  # @foo, = bar
816
972
  # ^^^^
973
+ # ```
817
974
  def visit_instance_variable_target_node(node)
818
975
  s(node, :iasgn, node.name)
819
976
  end
820
977
 
978
+ # ```
821
979
  # 1
822
980
  # ^
981
+ # ```
823
982
  def visit_integer_node(node)
824
983
  s(node, :lit, node.value)
825
984
  end
826
985
 
986
+ # ```
827
987
  # if /foo #{bar}/ then end
828
988
  # ^^^^^^^^^^^^
989
+ # ```
829
990
  def visit_interpolated_match_last_line_node(node)
830
991
  parts = visit_interpolated_parts(node.parts)
831
992
  regexp =
@@ -841,8 +1002,10 @@ module Prism
841
1002
  s(node, :match, regexp)
842
1003
  end
843
1004
 
1005
+ # ```
844
1006
  # /foo #{bar}/
845
1007
  # ^^^^^^^^^^^^
1008
+ # ```
846
1009
  def visit_interpolated_regular_expression_node(node)
847
1010
  parts = visit_interpolated_parts(node.parts)
848
1011
 
@@ -856,22 +1019,28 @@ module Prism
856
1019
  end
857
1020
  end
858
1021
 
1022
+ # ```
859
1023
  # "foo #{bar}"
860
1024
  # ^^^^^^^^^^^^
1025
+ # ```
861
1026
  def visit_interpolated_string_node(node)
862
1027
  parts = visit_interpolated_parts(node.parts)
863
1028
  parts.length == 1 ? s(node, :str, parts.first) : s(node, :dstr).concat(parts)
864
1029
  end
865
1030
 
1031
+ # ```
866
1032
  # :"foo #{bar}"
867
1033
  # ^^^^^^^^^^^^^
1034
+ # ```
868
1035
  def visit_interpolated_symbol_node(node)
869
1036
  parts = visit_interpolated_parts(node.parts)
870
1037
  parts.length == 1 ? s(node, :lit, parts.first.to_sym) : s(node, :dsym).concat(parts)
871
1038
  end
872
1039
 
1040
+ # ```
873
1041
  # `foo #{bar}`
874
1042
  # ^^^^^^^^^^^^
1043
+ # ```
875
1044
  def visit_interpolated_x_string_node(node)
876
1045
  source = node.heredoc? ? node.parts.first : node
877
1046
  parts = visit_interpolated_parts(node.parts)
@@ -929,9 +1098,9 @@ module Prism
929
1098
  if result == :space
930
1099
  # continue
931
1100
  elsif result.is_a?(String)
932
- results[0] << result
1101
+ results[0] = "#{results[0]}#{result}"
933
1102
  elsif result.is_a?(Array) && result[0] == :str
934
- results[0] << result[1]
1103
+ results[0] = "#{results[0]}#{result[1]}"
935
1104
  else
936
1105
  results << result
937
1106
  state = :interpolated_content
@@ -940,7 +1109,7 @@ module Prism
940
1109
  if result == :space
941
1110
  # continue
942
1111
  elsif visited[index - 1] != :space && result.is_a?(Array) && result[0] == :str && results[-1][0] == :str && (results[-1].line_max == result.line)
943
- results[-1][1] << result[1]
1112
+ results[-1][1] = "#{results[-1][1]}#{result[1]}"
944
1113
  results[-1].line_max = result.line_max
945
1114
  else
946
1115
  results << result
@@ -951,23 +1120,29 @@ module Prism
951
1120
  results
952
1121
  end
953
1122
 
1123
+ # ```
954
1124
  # -> { it }
955
1125
  # ^^
1126
+ # ```
956
1127
  def visit_it_local_variable_read_node(node)
957
1128
  s(node, :call, nil, :it)
958
1129
  end
959
1130
 
1131
+ # ```
960
1132
  # foo(bar: baz)
961
1133
  # ^^^^^^^^
1134
+ # ```
962
1135
  def visit_keyword_hash_node(node)
963
1136
  s(node, :hash).concat(node.elements.flat_map { |element| visit(element) })
964
1137
  end
965
1138
 
1139
+ # ```
966
1140
  # def foo(**bar); end
967
1141
  # ^^^^^
968
1142
  #
969
1143
  # def foo(**); end
970
1144
  # ^^
1145
+ # ```
971
1146
  def visit_keyword_rest_parameter_node(node)
972
1147
  :"**#{node.name}"
973
1148
  end
@@ -976,8 +1151,8 @@ module Prism
976
1151
  def visit_lambda_node(node)
977
1152
  parameters =
978
1153
  case node.parameters
979
- when nil, NumberedParametersNode
980
- s(node, :args)
1154
+ when nil, ItParametersNode, NumberedParametersNode
1155
+ 0
981
1156
  else
982
1157
  visit(node.parameters)
983
1158
  end
@@ -989,8 +1164,10 @@ module Prism
989
1164
  end
990
1165
  end
991
1166
 
1167
+ # ```
992
1168
  # foo
993
1169
  # ^^^
1170
+ # ```
994
1171
  def visit_local_variable_read_node(node)
995
1172
  if node.name.match?(/^_\d$/)
996
1173
  s(node, :call, nil, node.name)
@@ -999,59 +1176,77 @@ module Prism
999
1176
  end
1000
1177
  end
1001
1178
 
1179
+ # ```
1002
1180
  # foo = 1
1003
1181
  # ^^^^^^^
1004
1182
  #
1005
1183
  # foo, bar = 1
1006
1184
  # ^^^ ^^^
1185
+ # ```
1007
1186
  def visit_local_variable_write_node(node)
1008
1187
  s(node, :lasgn, node.name, visit_write_value(node.value))
1009
1188
  end
1010
1189
 
1190
+ # ```
1011
1191
  # foo += bar
1012
1192
  # ^^^^^^^^^^
1193
+ # ```
1013
1194
  def visit_local_variable_operator_write_node(node)
1014
1195
  s(node, :lasgn, node.name, s(node, :call, s(node, :lvar, node.name), node.binary_operator, visit_write_value(node.value)))
1015
1196
  end
1016
1197
 
1198
+ # ```
1017
1199
  # foo &&= bar
1018
1200
  # ^^^^^^^^^^^
1201
+ # ```
1019
1202
  def visit_local_variable_and_write_node(node)
1020
1203
  s(node, :op_asgn_and, s(node, :lvar, node.name), s(node, :lasgn, node.name, visit_write_value(node.value)))
1021
1204
  end
1022
1205
 
1206
+ # ```
1023
1207
  # foo ||= bar
1024
1208
  # ^^^^^^^^^^^
1209
+ # ```
1025
1210
  def visit_local_variable_or_write_node(node)
1026
1211
  s(node, :op_asgn_or, s(node, :lvar, node.name), s(node, :lasgn, node.name, visit_write_value(node.value)))
1027
1212
  end
1028
1213
 
1214
+ # ```
1029
1215
  # foo, = bar
1030
1216
  # ^^^
1217
+ # ```
1031
1218
  def visit_local_variable_target_node(node)
1032
1219
  s(node, :lasgn, node.name)
1033
1220
  end
1034
1221
 
1222
+ # ```
1035
1223
  # if /foo/ then end
1036
1224
  # ^^^^^
1225
+ # ```
1037
1226
  def visit_match_last_line_node(node)
1038
1227
  s(node, :match, s(node, :lit, Regexp.new(node.unescaped, node.options)))
1039
1228
  end
1040
1229
 
1230
+ # ```
1041
1231
  # foo in bar
1042
1232
  # ^^^^^^^^^^
1233
+ # ```
1043
1234
  def visit_match_predicate_node(node)
1044
1235
  s(node, :case, visit(node.value), s(node, :in, node.pattern.accept(copy_compiler(in_pattern: true)), nil), nil)
1045
1236
  end
1046
1237
 
1238
+ # ```
1047
1239
  # foo => bar
1048
1240
  # ^^^^^^^^^^
1241
+ # ```
1049
1242
  def visit_match_required_node(node)
1050
1243
  s(node, :case, visit(node.value), s(node, :in, node.pattern.accept(copy_compiler(in_pattern: true)), nil), nil)
1051
1244
  end
1052
1245
 
1246
+ # ```
1053
1247
  # /(?<foo>foo)/ =~ bar
1054
1248
  # ^^^^^^^^^^^^^^^^^^^^
1249
+ # ```
1055
1250
  def visit_match_write_node(node)
1056
1251
  s(node, :match2, visit(node.call.receiver), visit(node.call.arguments.arguments.first))
1057
1252
  end
@@ -1063,8 +1258,10 @@ module Prism
1063
1258
  raise "Cannot visit missing node directly"
1064
1259
  end
1065
1260
 
1261
+ # ```
1066
1262
  # module Foo; end
1067
1263
  # ^^^^^^^^^^^^^^^
1264
+ # ```
1068
1265
  def visit_module_node(node)
1069
1266
  name =
1070
1267
  if node.constant_path.is_a?(ConstantReadNode)
@@ -1083,8 +1280,10 @@ module Prism
1083
1280
  end
1084
1281
  end
1085
1282
 
1283
+ # ```
1086
1284
  # foo, bar = baz
1087
1285
  # ^^^^^^^^
1286
+ # ```
1088
1287
  def visit_multi_target_node(node)
1089
1288
  targets = [*node.lefts]
1090
1289
  targets << node.rest if !node.rest.nil? && !node.rest.is_a?(ImplicitRestNode)
@@ -1093,8 +1292,10 @@ module Prism
1093
1292
  s(node, :masgn, s(node, :array).concat(visit_all(targets)))
1094
1293
  end
1095
1294
 
1295
+ # ```
1096
1296
  # foo, bar = baz
1097
1297
  # ^^^^^^^^^^^^^^
1298
+ # ```
1098
1299
  def visit_multi_write_node(node)
1099
1300
  targets = [*node.lefts]
1100
1301
  targets << node.rest if !node.rest.nil? && !node.rest.is_a?(ImplicitRestNode)
@@ -1114,11 +1315,13 @@ module Prism
1114
1315
  s(node, :masgn, s(node, :array).concat(visit_all(targets)), value)
1115
1316
  end
1116
1317
 
1318
+ # ```
1117
1319
  # next
1118
1320
  # ^^^^
1119
1321
  #
1120
1322
  # next foo
1121
1323
  # ^^^^^^^^
1324
+ # ```
1122
1325
  def visit_next_node(node)
1123
1326
  if node.arguments.nil?
1124
1327
  s(node, :next)
@@ -1130,44 +1333,58 @@ module Prism
1130
1333
  end
1131
1334
  end
1132
1335
 
1336
+ # ```
1133
1337
  # nil
1134
1338
  # ^^^
1339
+ # ```
1135
1340
  def visit_nil_node(node)
1136
1341
  s(node, :nil)
1137
1342
  end
1138
1343
 
1344
+ # ```
1139
1345
  # def foo(**nil); end
1140
1346
  # ^^^^^
1347
+ # ```
1141
1348
  def visit_no_keywords_parameter_node(node)
1142
1349
  in_pattern ? s(node, :kwrest, :"**nil") : :"**nil"
1143
1350
  end
1144
1351
 
1352
+ # ```
1145
1353
  # -> { _1 + _2 }
1146
1354
  # ^^^^^^^^^^^^^^
1355
+ # ```
1147
1356
  def visit_numbered_parameters_node(node)
1148
1357
  raise "Cannot visit numbered parameters directly"
1149
1358
  end
1150
1359
 
1360
+ # ```
1151
1361
  # $1
1152
1362
  # ^^
1363
+ # ```
1153
1364
  def visit_numbered_reference_read_node(node)
1154
1365
  s(node, :nth_ref, node.number)
1155
1366
  end
1156
1367
 
1368
+ # ```
1157
1369
  # def foo(bar: baz); end
1158
1370
  # ^^^^^^^^
1371
+ # ```
1159
1372
  def visit_optional_keyword_parameter_node(node)
1160
1373
  s(node, :kwarg, node.name, visit(node.value))
1161
1374
  end
1162
1375
 
1376
+ # ```
1163
1377
  # def foo(bar = 1); end
1164
1378
  # ^^^^^^^
1379
+ # ```
1165
1380
  def visit_optional_parameter_node(node)
1166
1381
  s(node, :lasgn, node.name, visit(node.value))
1167
1382
  end
1168
1383
 
1384
+ # ```
1169
1385
  # a or b
1170
1386
  # ^^^^^^
1387
+ # ```
1171
1388
  def visit_or_node(node)
1172
1389
  left = visit(node.left)
1173
1390
 
@@ -1184,8 +1401,10 @@ module Prism
1184
1401
  end
1185
1402
  end
1186
1403
 
1404
+ # ```
1187
1405
  # def foo(bar, *baz); end
1188
1406
  # ^^^^^^^^^
1407
+ # ```
1189
1408
  def visit_parameters_node(node)
1190
1409
  children =
1191
1410
  node.compact_child_nodes.map do |element|
@@ -1199,8 +1418,10 @@ module Prism
1199
1418
  s(node, :args).concat(children)
1200
1419
  end
1201
1420
 
1421
+ # ```
1202
1422
  # def foo((bar, baz)); end
1203
1423
  # ^^^^^^^^^^
1424
+ # ```
1204
1425
  private def visit_destructured_parameter(node)
1205
1426
  children =
1206
1427
  [*node.lefts, *node.rest, *node.rights].map do |child|
@@ -1219,11 +1440,13 @@ module Prism
1219
1440
  s(node, :masgn).concat(children)
1220
1441
  end
1221
1442
 
1443
+ # ```
1222
1444
  # ()
1223
1445
  # ^^
1224
1446
  #
1225
1447
  # (1)
1226
1448
  # ^^^
1449
+ # ```
1227
1450
  def visit_parentheses_node(node)
1228
1451
  if node.body.nil?
1229
1452
  s(node, :nil)
@@ -1232,14 +1455,18 @@ module Prism
1232
1455
  end
1233
1456
  end
1234
1457
 
1458
+ # ```
1235
1459
  # foo => ^(bar)
1236
1460
  # ^^^^^^
1461
+ # ```
1237
1462
  def visit_pinned_expression_node(node)
1238
1463
  node.expression.accept(copy_compiler(in_pattern: false))
1239
1464
  end
1240
1465
 
1466
+ # ```
1241
1467
  # foo = 1 and bar => ^foo
1242
1468
  # ^^^^
1469
+ # ```
1243
1470
  def visit_pinned_variable_node(node)
1244
1471
  if node.variable.is_a?(LocalVariableReadNode) && node.variable.name.match?(/^_\d$/)
1245
1472
  s(node, :lvar, node.variable.name)
@@ -1263,8 +1490,10 @@ module Prism
1263
1490
  visit(node.statements)
1264
1491
  end
1265
1492
 
1493
+ # ```
1266
1494
  # 0..5
1267
1495
  # ^^^^
1496
+ # ```
1268
1497
  def visit_range_node(node)
1269
1498
  if !in_pattern && !node.left.nil? && !node.right.nil? && ([node.left.type, node.right.type] - %i[nil_node integer_node]).empty?
1270
1499
  left = node.left.value if node.left.is_a?(IntegerNode)
@@ -1285,44 +1514,58 @@ module Prism
1285
1514
  end
1286
1515
  end
1287
1516
 
1517
+ # ```
1288
1518
  # 1r
1289
1519
  # ^^
1520
+ # ```
1290
1521
  def visit_rational_node(node)
1291
1522
  s(node, :lit, node.value)
1292
1523
  end
1293
1524
 
1525
+ # ```
1294
1526
  # redo
1295
1527
  # ^^^^
1528
+ # ```
1296
1529
  def visit_redo_node(node)
1297
1530
  s(node, :redo)
1298
1531
  end
1299
1532
 
1533
+ # ```
1300
1534
  # /foo/
1301
1535
  # ^^^^^
1536
+ # ```
1302
1537
  def visit_regular_expression_node(node)
1303
1538
  s(node, :lit, Regexp.new(node.unescaped, node.options))
1304
1539
  end
1305
1540
 
1541
+ # ```
1306
1542
  # def foo(bar:); end
1307
1543
  # ^^^^
1544
+ # ```
1308
1545
  def visit_required_keyword_parameter_node(node)
1309
1546
  s(node, :kwarg, node.name)
1310
1547
  end
1311
1548
 
1549
+ # ```
1312
1550
  # def foo(bar); end
1313
1551
  # ^^^
1552
+ # ```
1314
1553
  def visit_required_parameter_node(node)
1315
1554
  node.name
1316
1555
  end
1317
1556
 
1557
+ # ```
1318
1558
  # foo rescue bar
1319
1559
  # ^^^^^^^^^^^^^^
1560
+ # ```
1320
1561
  def visit_rescue_modifier_node(node)
1321
1562
  s(node, :rescue, visit(node.expression), s(node.rescue_expression, :resbody, s(node.rescue_expression, :array), visit(node.rescue_expression)))
1322
1563
  end
1323
1564
 
1565
+ # ```
1324
1566
  # begin; rescue; end
1325
1567
  # ^^^^^^^
1568
+ # ```
1326
1569
  def visit_rescue_node(node)
1327
1570
  exceptions =
1328
1571
  if node.exceptions.length == 1 && node.exceptions.first.is_a?(SplatNode)
@@ -1338,26 +1581,32 @@ module Prism
1338
1581
  s(node, :resbody, exceptions).concat(node.statements.nil? ? [nil] : visit_all(node.statements.body))
1339
1582
  end
1340
1583
 
1584
+ # ```
1341
1585
  # def foo(*bar); end
1342
1586
  # ^^^^
1343
1587
  #
1344
1588
  # def foo(*); end
1345
1589
  # ^
1590
+ # ```
1346
1591
  def visit_rest_parameter_node(node)
1347
1592
  :"*#{node.name}"
1348
1593
  end
1349
1594
 
1595
+ # ```
1350
1596
  # retry
1351
1597
  # ^^^^^
1598
+ # ```
1352
1599
  def visit_retry_node(node)
1353
1600
  s(node, :retry)
1354
1601
  end
1355
1602
 
1603
+ # ```
1356
1604
  # return
1357
1605
  # ^^^^^^
1358
1606
  #
1359
1607
  # return 1
1360
1608
  # ^^^^^^^^
1609
+ # ```
1361
1610
  def visit_return_node(node)
1362
1611
  if node.arguments.nil?
1363
1612
  s(node, :return)
@@ -1369,8 +1618,10 @@ module Prism
1369
1618
  end
1370
1619
  end
1371
1620
 
1621
+ # ```
1372
1622
  # self
1373
1623
  # ^^^^
1624
+ # ```
1374
1625
  def visit_self_node(node)
1375
1626
  s(node, :self)
1376
1627
  end
@@ -1380,33 +1631,42 @@ module Prism
1380
1631
  visit(node.write)
1381
1632
  end
1382
1633
 
1634
+ # ```
1383
1635
  # class << self; end
1384
1636
  # ^^^^^^^^^^^^^^^^^^
1637
+ # ```
1385
1638
  def visit_singleton_class_node(node)
1386
1639
  s(node, :sclass, visit(node.expression)).tap do |sexp|
1387
1640
  sexp << node.body.accept(copy_compiler(in_def: false)) unless node.body.nil?
1388
1641
  end
1389
1642
  end
1390
1643
 
1644
+ # ```
1391
1645
  # __ENCODING__
1392
1646
  # ^^^^^^^^^^^^
1647
+ # ```
1393
1648
  def visit_source_encoding_node(node)
1394
1649
  # TODO
1395
1650
  s(node, :colon2, s(node, :const, :Encoding), :UTF_8)
1396
1651
  end
1397
1652
 
1653
+ # ```
1398
1654
  # __FILE__
1399
1655
  # ^^^^^^^^
1656
+ # ```
1400
1657
  def visit_source_file_node(node)
1401
1658
  s(node, :str, node.filepath)
1402
1659
  end
1403
1660
 
1661
+ # ```
1404
1662
  # __LINE__
1405
1663
  # ^^^^^^^^
1664
+ # ```
1406
1665
  def visit_source_line_node(node)
1407
1666
  s(node, :lit, node.location.start_line)
1408
1667
  end
1409
1668
 
1669
+ # ```
1410
1670
  # foo(*bar)
1411
1671
  # ^^^^
1412
1672
  #
@@ -1415,6 +1675,7 @@ module Prism
1415
1675
  #
1416
1676
  # def foo(*); bar(*); end
1417
1677
  # ^
1678
+ # ```
1418
1679
  def visit_splat_node(node)
1419
1680
  if node.expression.nil?
1420
1681
  s(node, :splat)
@@ -1434,20 +1695,25 @@ module Prism
1434
1695
  end
1435
1696
  end
1436
1697
 
1698
+ # ```
1437
1699
  # "foo"
1438
1700
  # ^^^^^
1701
+ # ```
1439
1702
  def visit_string_node(node)
1440
1703
  unescaped = node.unescaped
1441
1704
 
1442
1705
  if node.forced_binary_encoding?
1706
+ unescaped = unescaped.dup
1443
1707
  unescaped.force_encoding(Encoding::BINARY)
1444
1708
  end
1445
1709
 
1446
1710
  s(node, :str, unescaped)
1447
1711
  end
1448
1712
 
1713
+ # ```
1449
1714
  # super(foo)
1450
1715
  # ^^^^^^^^^^
1716
+ # ```
1451
1717
  def visit_super_node(node)
1452
1718
  arguments = node.arguments&.arguments || []
1453
1719
  block = node.block
@@ -1460,60 +1726,76 @@ module Prism
1460
1726
  visit_block(node, s(node, :super).concat(visit_all(arguments)), block)
1461
1727
  end
1462
1728
 
1729
+ # ```
1463
1730
  # :foo
1464
1731
  # ^^^^
1732
+ # ```
1465
1733
  def visit_symbol_node(node)
1466
1734
  node.value == "!@" ? s(node, :lit, :"!@") : s(node, :lit, node.unescaped.to_sym)
1467
1735
  end
1468
1736
 
1737
+ # ```
1469
1738
  # true
1470
1739
  # ^^^^
1740
+ # ```
1471
1741
  def visit_true_node(node)
1472
1742
  s(node, :true)
1473
1743
  end
1474
1744
 
1745
+ # ```
1475
1746
  # undef foo
1476
1747
  # ^^^^^^^^^
1748
+ # ```
1477
1749
  def visit_undef_node(node)
1478
1750
  names = node.names.map { |name| s(node, :undef, visit(name)) }
1479
1751
  names.length == 1 ? names.first : s(node, :block).concat(names)
1480
1752
  end
1481
1753
 
1754
+ # ```
1482
1755
  # unless foo; bar end
1483
1756
  # ^^^^^^^^^^^^^^^^^^^
1484
1757
  #
1485
1758
  # bar unless foo
1486
1759
  # ^^^^^^^^^^^^^^
1760
+ # ```
1487
1761
  def visit_unless_node(node)
1488
1762
  s(node, :if, visit(node.predicate), visit(node.else_clause), visit(node.statements))
1489
1763
  end
1490
1764
 
1765
+ # ```
1491
1766
  # until foo; bar end
1492
1767
  # ^^^^^^^^^^^^^^^^^
1493
1768
  #
1494
1769
  # bar until foo
1495
1770
  # ^^^^^^^^^^^^^
1771
+ # ```
1496
1772
  def visit_until_node(node)
1497
1773
  s(node, :until, visit(node.predicate), visit(node.statements), !node.begin_modifier?)
1498
1774
  end
1499
1775
 
1776
+ # ```
1500
1777
  # case foo; when bar; end
1501
1778
  # ^^^^^^^^^^^^^
1779
+ # ```
1502
1780
  def visit_when_node(node)
1503
1781
  s(node, :when, s(node, :array).concat(visit_all(node.conditions))).concat(node.statements.nil? ? [nil] : visit_all(node.statements.body))
1504
1782
  end
1505
1783
 
1784
+ # ```
1506
1785
  # while foo; bar end
1507
1786
  # ^^^^^^^^^^^^^^^^^^
1508
1787
  #
1509
1788
  # bar while foo
1510
1789
  # ^^^^^^^^^^^^^
1790
+ # ```
1511
1791
  def visit_while_node(node)
1512
1792
  s(node, :while, visit(node.predicate), visit(node.statements), !node.begin_modifier?)
1513
1793
  end
1514
1794
 
1795
+ # ```
1515
1796
  # `foo`
1516
1797
  # ^^^^^
1798
+ # ```
1517
1799
  def visit_x_string_node(node)
1518
1800
  result = s(node, :xstr, node.unescaped)
1519
1801
 
@@ -1525,11 +1807,13 @@ module Prism
1525
1807
  result
1526
1808
  end
1527
1809
 
1810
+ # ```
1528
1811
  # yield
1529
1812
  # ^^^^^
1530
1813
  #
1531
1814
  # yield 1
1532
1815
  # ^^^^^^^
1816
+ # ```
1533
1817
  def visit_yield_node(node)
1534
1818
  s(node, :yield).concat(visit_all(node.arguments&.arguments || []))
1535
1819
  end
@@ -1558,7 +1842,7 @@ module Prism
1558
1842
  else
1559
1843
  parameters =
1560
1844
  case block.parameters
1561
- when nil, NumberedParametersNode
1845
+ when nil, ItParametersNode, NumberedParametersNode
1562
1846
  0
1563
1847
  else
1564
1848
  visit(block.parameters)