prism 1.4.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +23 -1
- data/Makefile +2 -1
- data/README.md +1 -0
- data/config.yml +264 -37
- data/docs/parser_translation.md +8 -23
- data/docs/ripper_translation.md +1 -1
- data/ext/prism/api_node.c +2 -0
- data/ext/prism/extension.c +14 -1
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +275 -49
- data/include/prism/diagnostic.h +4 -0
- data/include/prism/options.h +43 -3
- data/include/prism/regexp.h +2 -2
- data/include/prism/util/pm_buffer.h +8 -0
- data/include/prism/util/pm_integer.h +4 -0
- data/include/prism/util/pm_list.h +6 -0
- data/include/prism/util/pm_string.h +12 -2
- data/include/prism/version.h +2 -2
- data/include/prism.h +39 -14
- data/lib/prism/compiler.rb +456 -151
- data/lib/prism/desugar_compiler.rb +1 -0
- data/lib/prism/dispatcher.rb +16 -0
- data/lib/prism/dot_visitor.rb +5 -1
- data/lib/prism/dsl.rb +3 -0
- data/lib/prism/ffi.rb +17 -7
- data/lib/prism/inspect_visitor.rb +3 -0
- data/lib/prism/lex_compat.rb +1 -0
- data/lib/prism/mutation_compiler.rb +3 -0
- data/lib/prism/node.rb +506 -335
- data/lib/prism/node_ext.rb +4 -1
- data/lib/prism/pack.rb +2 -0
- data/lib/prism/parse_result/comments.rb +1 -0
- data/lib/prism/parse_result/errors.rb +1 -0
- data/lib/prism/parse_result/newlines.rb +1 -0
- data/lib/prism/parse_result.rb +1 -0
- data/lib/prism/pattern.rb +1 -0
- data/lib/prism/polyfill/scan_byte.rb +14 -0
- data/lib/prism/polyfill/warn.rb +42 -0
- data/lib/prism/reflection.rb +3 -0
- data/lib/prism/relocation.rb +1 -0
- data/lib/prism/serialize.rb +24 -19
- data/lib/prism/string_query.rb +1 -0
- data/lib/prism/translation/parser/builder.rb +1 -0
- data/lib/prism/translation/parser/compiler.rb +47 -25
- data/lib/prism/translation/parser/lexer.rb +29 -21
- data/lib/prism/translation/parser.rb +13 -1
- data/lib/prism/translation/parser33.rb +1 -0
- data/lib/prism/translation/parser34.rb +1 -0
- data/lib/prism/translation/parser35.rb +1 -0
- data/lib/prism/translation/parser_current.rb +24 -0
- data/lib/prism/translation/ripper/sexp.rb +1 -0
- data/lib/prism/translation/ripper.rb +17 -1
- data/lib/prism/translation/ruby_parser.rb +286 -3
- data/lib/prism/translation.rb +2 -0
- data/lib/prism/visitor.rb +457 -152
- data/lib/prism.rb +2 -0
- data/prism.gemspec +5 -1
- data/rbi/prism/dsl.rbi +3 -3
- data/rbi/prism/node.rbi +21 -9
- data/sig/prism/dispatcher.rbs +3 -0
- data/sig/prism/dsl.rbs +3 -3
- data/sig/prism/node.rbs +444 -30
- data/sig/prism/node_ext.rbs +84 -17
- data/sig/prism/parse_result/comments.rbs +38 -0
- data/sig/prism/parse_result.rbs +4 -0
- data/sig/prism/reflection.rbs +1 -1
- data/src/diagnostic.c +7 -1
- data/src/node.c +2 -0
- data/src/options.c +2 -2
- data/src/prettyprint.c +2 -0
- data/src/prism.c +252 -130
- data/src/serialize.c +2 -0
- data/src/token_type.c +36 -34
- metadata +6 -2
@@ -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)
|
@@ -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
|
-
|
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,8 +1695,10 @@ 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
|
|
@@ -1447,8 +1710,10 @@ module Prism
|
|
1447
1710
|
s(node, :str, unescaped)
|
1448
1711
|
end
|
1449
1712
|
|
1713
|
+
# ```
|
1450
1714
|
# super(foo)
|
1451
1715
|
# ^^^^^^^^^^
|
1716
|
+
# ```
|
1452
1717
|
def visit_super_node(node)
|
1453
1718
|
arguments = node.arguments&.arguments || []
|
1454
1719
|
block = node.block
|
@@ -1461,60 +1726,76 @@ module Prism
|
|
1461
1726
|
visit_block(node, s(node, :super).concat(visit_all(arguments)), block)
|
1462
1727
|
end
|
1463
1728
|
|
1729
|
+
# ```
|
1464
1730
|
# :foo
|
1465
1731
|
# ^^^^
|
1732
|
+
# ```
|
1466
1733
|
def visit_symbol_node(node)
|
1467
1734
|
node.value == "!@" ? s(node, :lit, :"!@") : s(node, :lit, node.unescaped.to_sym)
|
1468
1735
|
end
|
1469
1736
|
|
1737
|
+
# ```
|
1470
1738
|
# true
|
1471
1739
|
# ^^^^
|
1740
|
+
# ```
|
1472
1741
|
def visit_true_node(node)
|
1473
1742
|
s(node, :true)
|
1474
1743
|
end
|
1475
1744
|
|
1745
|
+
# ```
|
1476
1746
|
# undef foo
|
1477
1747
|
# ^^^^^^^^^
|
1748
|
+
# ```
|
1478
1749
|
def visit_undef_node(node)
|
1479
1750
|
names = node.names.map { |name| s(node, :undef, visit(name)) }
|
1480
1751
|
names.length == 1 ? names.first : s(node, :block).concat(names)
|
1481
1752
|
end
|
1482
1753
|
|
1754
|
+
# ```
|
1483
1755
|
# unless foo; bar end
|
1484
1756
|
# ^^^^^^^^^^^^^^^^^^^
|
1485
1757
|
#
|
1486
1758
|
# bar unless foo
|
1487
1759
|
# ^^^^^^^^^^^^^^
|
1760
|
+
# ```
|
1488
1761
|
def visit_unless_node(node)
|
1489
1762
|
s(node, :if, visit(node.predicate), visit(node.else_clause), visit(node.statements))
|
1490
1763
|
end
|
1491
1764
|
|
1765
|
+
# ```
|
1492
1766
|
# until foo; bar end
|
1493
1767
|
# ^^^^^^^^^^^^^^^^^
|
1494
1768
|
#
|
1495
1769
|
# bar until foo
|
1496
1770
|
# ^^^^^^^^^^^^^
|
1771
|
+
# ```
|
1497
1772
|
def visit_until_node(node)
|
1498
1773
|
s(node, :until, visit(node.predicate), visit(node.statements), !node.begin_modifier?)
|
1499
1774
|
end
|
1500
1775
|
|
1776
|
+
# ```
|
1501
1777
|
# case foo; when bar; end
|
1502
1778
|
# ^^^^^^^^^^^^^
|
1779
|
+
# ```
|
1503
1780
|
def visit_when_node(node)
|
1504
1781
|
s(node, :when, s(node, :array).concat(visit_all(node.conditions))).concat(node.statements.nil? ? [nil] : visit_all(node.statements.body))
|
1505
1782
|
end
|
1506
1783
|
|
1784
|
+
# ```
|
1507
1785
|
# while foo; bar end
|
1508
1786
|
# ^^^^^^^^^^^^^^^^^^
|
1509
1787
|
#
|
1510
1788
|
# bar while foo
|
1511
1789
|
# ^^^^^^^^^^^^^
|
1790
|
+
# ```
|
1512
1791
|
def visit_while_node(node)
|
1513
1792
|
s(node, :while, visit(node.predicate), visit(node.statements), !node.begin_modifier?)
|
1514
1793
|
end
|
1515
1794
|
|
1795
|
+
# ```
|
1516
1796
|
# `foo`
|
1517
1797
|
# ^^^^^
|
1798
|
+
# ```
|
1518
1799
|
def visit_x_string_node(node)
|
1519
1800
|
result = s(node, :xstr, node.unescaped)
|
1520
1801
|
|
@@ -1526,11 +1807,13 @@ module Prism
|
|
1526
1807
|
result
|
1527
1808
|
end
|
1528
1809
|
|
1810
|
+
# ```
|
1529
1811
|
# yield
|
1530
1812
|
# ^^^^^
|
1531
1813
|
#
|
1532
1814
|
# yield 1
|
1533
1815
|
# ^^^^^^^
|
1816
|
+
# ```
|
1534
1817
|
def visit_yield_node(node)
|
1535
1818
|
s(node, :yield).concat(visit_all(node.arguments&.arguments || []))
|
1536
1819
|
end
|