lib-ruby-parser 4.0.3.0-arm64-darwin

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4452 @@
1
+ # This file is autogenerated by codegen/nodes.rb.liquid
2
+
3
+ # Root module
4
+ module LibRubyParser
5
+ # Module with all known Node sub-types
6
+ module Nodes
7
+ # Represents `alias to from` statement.
8
+ class Alias < Node
9
+ # Target of the `alias`.
10
+ #
11
+ # `Sym("foo")` node for `alias :foo :bar`
12
+ #
13
+ # @return [Node]
14
+ attr_reader :to
15
+ # Source of the `alias`.
16
+ #
17
+ # `Sym("bar")` node for `alias :foo :bar`
18
+ #
19
+ # @return [Node]
20
+ attr_reader :from
21
+ # Location of the `alias` keyword
22
+ #
23
+ # ```text
24
+ # alias foo bar
25
+ # ~~~~~
26
+ # ```
27
+ #
28
+ # @return [Loc]
29
+ attr_reader :keyword_l
30
+ # Location of the full expression
31
+ #
32
+ # ```text
33
+ # alias foo bar
34
+ # ~~~~~~~~~~~~~
35
+ # ```
36
+ #
37
+ # @return [Loc]
38
+ attr_reader :expression_l
39
+ end
40
+
41
+ # Represents `foo && bar` (or `foo and bar`) statement.
42
+ class And < Node
43
+ # Left hand statament of the `&&` operation.
44
+ #
45
+ # `Lvar("foo")` node for `foo && bar`
46
+ #
47
+ # @return [Node]
48
+ attr_reader :lhs
49
+ # Right hand statement of the `&&` operation.
50
+ #
51
+ # `Lvar("bar")` node for `foo && bar`
52
+ #
53
+ # @return [Node]
54
+ attr_reader :rhs
55
+ # Location of the `&&` (or `and`) operator
56
+ #
57
+ # ```text
58
+ # a && b
59
+ # ~~
60
+ # ```
61
+ #
62
+ # @return [Loc]
63
+ attr_reader :operator_l
64
+ # Location of the full expression
65
+ #
66
+ # ```text
67
+ # a && b
68
+ # ~~~~~~
69
+ # ```
70
+ #
71
+ # @return [Loc]
72
+ attr_reader :expression_l
73
+ end
74
+
75
+ # Represents `a &&= 1` statement.
76
+ class AndAsgn < Node
77
+ # Receiver of the `&&=` operation.
78
+ #
79
+ # `Lvasgn("a")` node for `a &&= 1`
80
+ #
81
+ # @return [Node]
82
+ attr_reader :recv
83
+ # Right hand statement of assignment
84
+ #
85
+ # `Int("1")` node for `a &&= 1`
86
+ #
87
+ # @return [Node]
88
+ attr_reader :value
89
+ # Location of the `&&=` operator
90
+ #
91
+ # ```text
92
+ # a &&= 1
93
+ # ~~~
94
+ # ```
95
+ #
96
+ # @return [Loc]
97
+ attr_reader :operator_l
98
+ # Location of the full expression
99
+ #
100
+ # ```text
101
+ # a &&= 1
102
+ # ~~~~~~~
103
+ # ```
104
+ #
105
+ # @return [Loc]
106
+ attr_reader :expression_l
107
+ end
108
+
109
+ # Represents a positional required block/method argument.
110
+ #
111
+ # `a` in `def m(a); end` or `proc { |a| }`
112
+ class Arg < Node
113
+ # Name of the argument
114
+ #
115
+ # @return [String]
116
+ attr_reader :name
117
+ # Location of the full expression
118
+ #
119
+ # ```text
120
+ # def m(argument); end
121
+ # ~~~~~~~~
122
+ # ```
123
+ #
124
+ # @return [Loc]
125
+ attr_reader :expression_l
126
+ end
127
+
128
+ # Represents an arguments list
129
+ #
130
+ # `Args(vec![Arg("a"), Optarg("b", Int("1"))])` in `def m(a, b = 1); end`
131
+ class Args < Node
132
+ # List of arguments
133
+ #
134
+ # @return [::Array<Node>]
135
+ attr_reader :args
136
+ # Location of the full expression
137
+ #
138
+ # ```text
139
+ # def m(a, b = 1, c:, &blk); end
140
+ # ~~~~~~~~~~~~~~~~~~~~
141
+ # ```
142
+ #
143
+ # @return [Loc]
144
+ attr_reader :expression_l
145
+ # Location of the open parenthesis
146
+ #
147
+ # ```text
148
+ # def m(a, b = 1, c:, &blk); end
149
+ # ~
150
+ # ```
151
+ #
152
+ # `None` for code like `def m; end` or `def m arg; end`
153
+ #
154
+ # @return [Loc, nil]
155
+ attr_reader :begin_l
156
+ # Location of the closing parenthesis
157
+ #
158
+ # ```text
159
+ # def m(a, b = 1, c:, &blk); end
160
+ # ~
161
+ # ```
162
+ #
163
+ # `None` for code like `def m; end` or `def m arg; end`
164
+ #
165
+ # @return [Loc, nil]
166
+ attr_reader :end_l
167
+ end
168
+
169
+ # Represents an array literal
170
+ class Array < Node
171
+ # A list of elements
172
+ #
173
+ # @return [::Array<Node>]
174
+ attr_reader :elements
175
+ # Location of the open bracket
176
+ #
177
+ # ```text
178
+ # [1, 2, 3]
179
+ # ~
180
+ # ```
181
+ #
182
+ # @return [Loc, nil]
183
+ attr_reader :begin_l
184
+ # Location of the closing bracket
185
+ #
186
+ # ```text
187
+ # [1, 2, 3]
188
+ # ~
189
+ # ```
190
+ #
191
+ # @return [Loc, nil]
192
+ attr_reader :end_l
193
+ # Location of the full expression
194
+ #
195
+ # ```text
196
+ # [1, 2, 3]
197
+ # ~~~~~~~~~
198
+ # ```
199
+ #
200
+ # @return [Loc]
201
+ attr_reader :expression_l
202
+ end
203
+
204
+ # Represents an array pattern used in pattern matching
205
+ class ArrayPattern < Node
206
+ # A list of elements
207
+ #
208
+ # @return [::Array<Node>]
209
+ attr_reader :elements
210
+ # Location of the open bracket
211
+ #
212
+ # ```text
213
+ # [1, ^a, 3 => foo]
214
+ # ~
215
+ # ```
216
+ #
217
+ # `None` for pattern like `1, 2` without brackets
218
+ #
219
+ # @return [Loc, nil]
220
+ attr_reader :begin_l
221
+ # Location of the closing bracket
222
+ #
223
+ # ```text
224
+ # [1, ^a, 3 => foo]
225
+ # ~
226
+ # ```
227
+ #
228
+ # `None` for pattern like `1, 2` without brackets
229
+ #
230
+ # @return [Loc, nil]
231
+ attr_reader :end_l
232
+ # Location of the full expression
233
+ #
234
+ # ```text
235
+ # [1, ^a, 3 => foo]
236
+ # ~~~~~~~~~~~~~~~~~
237
+ # ```
238
+ #
239
+ # @return [Loc]
240
+ attr_reader :expression_l
241
+ end
242
+
243
+ # Represents an array pattern *with trailing comma* used in pattern matching
244
+ #
245
+ # It's slightly different from `ArrayPattern`, trailing comma at the end works as `, *`
246
+ class ArrayPatternWithTail < Node
247
+ # A list of elements
248
+ #
249
+ # @return [::Array<Node>]
250
+ attr_reader :elements
251
+ # Location of the open bracket
252
+ #
253
+ # ```text
254
+ # [1, ^a, 3 => foo,]
255
+ # ~
256
+ # ```
257
+ #
258
+ # `None` for pattern like `1, 2,` without brackets
259
+ #
260
+ # @return [Loc, nil]
261
+ attr_reader :begin_l
262
+ # Location of the closing bracket
263
+ #
264
+ # ```text
265
+ # [1, ^a, 3 => foo,]
266
+ # ~
267
+ # ```
268
+ #
269
+ # `None` for pattern like `1, 2,` without brackets
270
+ #
271
+ # @return [Loc, nil]
272
+ attr_reader :end_l
273
+ # Location of the full expression
274
+ #
275
+ # ```text
276
+ # [1, ^a, 3 => foo,]
277
+ # ~~~~~~~~~~~~~~~~~~
278
+ # ```
279
+ #
280
+ # @return [Loc]
281
+ attr_reader :expression_l
282
+ end
283
+
284
+ # Represents special global variables:
285
+ # 1. `` $` ``
286
+ # 2. `$&`
287
+ # 3. `$'`
288
+ # 4. `$+`
289
+ class BackRef < Node
290
+ # Name of the variable (`"$+"` for `$+`)
291
+ #
292
+ # @return [String]
293
+ attr_reader :name
294
+ # Location of the full expression
295
+ #
296
+ # ```text
297
+ # $+
298
+ # ~~
299
+ # ```
300
+ #
301
+ # @return [Loc]
302
+ attr_reader :expression_l
303
+ end
304
+
305
+ # Represents compound statement (i.e. a multi-statement)
306
+ #
307
+ # Basically all blocks of code are wrapped into `Begin` node (e.g. method/block body, rescue/ensure handler etc)
308
+ class Begin < Node
309
+ # A list of statements
310
+ #
311
+ # @return [::Array<Node>]
312
+ attr_reader :statements
313
+ # Begin of the block
314
+ #
315
+ # ```text
316
+ # (1; 2)
317
+ # ~
318
+ # ```
319
+ #
320
+ # `None` if the block of code is "implicit", like
321
+ #
322
+ # ```text
323
+ # if true; 1; 2; end
324
+ # ```
325
+ #
326
+ # @return [Loc, nil]
327
+ attr_reader :begin_l
328
+ # End of the block
329
+ #
330
+ # ```text
331
+ # (1; 2)
332
+ # ~
333
+ # ```
334
+ #
335
+ # `None` if the block of code is "implicit", like
336
+ #
337
+ # ```text
338
+ # if true; 1; 2; end
339
+ # ```
340
+ #
341
+ # @return [Loc, nil]
342
+ attr_reader :end_l
343
+ # Location of the full expression
344
+ #
345
+ # ```text
346
+ # (1; 2)
347
+ # ~~~~~~
348
+ # ```
349
+ #
350
+ # @return [Loc]
351
+ attr_reader :expression_l
352
+ end
353
+
354
+ # Represents a Ruby block that is passed to a method (`proc { |foo| bar }`)
355
+ class Block < Node
356
+ # Method call that takes a block
357
+ #
358
+ # `Send("foo")` in `foo {}`
359
+ #
360
+ # @return [Node]
361
+ attr_reader :call
362
+ # A list of argument that block takes
363
+ #
364
+ # `vec![ Arg("a"), Optarg("b", Int("1")) ]` for `proc { |a, b = 1| }`
365
+ #
366
+ # `None` if the block takes no arguments
367
+ #
368
+ # @return [Node, nil]
369
+ attr_reader :args
370
+ # Block body, `None` if block has no body.
371
+ #
372
+ # @return [Node, nil]
373
+ attr_reader :body
374
+ # Location of the open brace
375
+ #
376
+ # ```text
377
+ # proc { }
378
+ # ~
379
+ # ```
380
+ #
381
+ # @return [Loc]
382
+ attr_reader :begin_l
383
+ # Location of the closing brace
384
+ #
385
+ # ```text
386
+ # proc { }
387
+ # ~
388
+ # ```
389
+ #
390
+ # @return [Loc]
391
+ attr_reader :end_l
392
+ # Location of the full expression
393
+ #
394
+ # ```text
395
+ # proc { }
396
+ # ~~~~~~~~
397
+ # ```
398
+ #
399
+ # @return [Loc]
400
+ attr_reader :expression_l
401
+ end
402
+
403
+ # Represents a `&blk` argument in the method definition (but not in the method call, see `BlockPass`)
404
+ class Blockarg < Node
405
+ # Name of the argument, `String("foo")` for `def m(&foo)`
406
+ #
407
+ # @return [String, nil]
408
+ attr_reader :name
409
+ # Location of the `&` operator
410
+ #
411
+ # ```text
412
+ # def m(&foo); end
413
+ # ~
414
+ # ```
415
+ #
416
+ # @return [Loc]
417
+ attr_reader :operator_l
418
+ # Location of the name
419
+ #
420
+ # ```text
421
+ # def m(&foo); end
422
+ # ~~~
423
+ # ```
424
+ #
425
+ # @return [Loc, nil]
426
+ attr_reader :name_l
427
+ # Location of the full expression
428
+ #
429
+ # ```text
430
+ # def m(&foo); end
431
+ # ~~~~
432
+ # ```
433
+ #
434
+ # @return [Loc]
435
+ attr_reader :expression_l
436
+ end
437
+
438
+ # Represents a `&blk` argument of the method call (but not of the method definition, see `BlockArg`)
439
+ class BlockPass < Node
440
+ # Value that is converted to a block
441
+ #
442
+ # `Int("1")` in `foo(&1)` (yes, it's possible)
443
+ #
444
+ # @return [Node, nil]
445
+ attr_reader :value
446
+ # Location of the `&` operator
447
+ #
448
+ # ```text
449
+ # foo(&blk)
450
+ # ~
451
+ # ```
452
+ #
453
+ # @return [Loc]
454
+ attr_reader :operator_l
455
+ # Location of the full expression
456
+ #
457
+ # ```text
458
+ # foo(&bar)
459
+ # ~~~~
460
+ # ```
461
+ #
462
+ # @return [Loc]
463
+ attr_reader :expression_l
464
+ end
465
+
466
+ # Represents a `break` keyword (with optional argument)
467
+ class Break < Node
468
+ # A list of arguments
469
+ #
470
+ # @return [::Array<Node>]
471
+ attr_reader :args
472
+ # Location of the `break` keyword
473
+ #
474
+ # ```text
475
+ # break :foo
476
+ # ~~~~~
477
+ # ```
478
+ #
479
+ # @return [Loc]
480
+ attr_reader :keyword_l
481
+ # Location of the full expression
482
+ #
483
+ # ```text
484
+ # break(:foo)
485
+ # ~~~~~~~~~~~
486
+ # ```
487
+ #
488
+ # @return [Loc]
489
+ attr_reader :expression_l
490
+ end
491
+
492
+ # Represents a `case` statement (for pattern matching see `CaseMatch` node)
493
+ class Case < Node
494
+ # Expression given to `case`, `Int("1")` for `case 1; end`
495
+ # `None` for code like
496
+ #
497
+ # ```text
498
+ # case
499
+ # when pattern
500
+ # end
501
+ # ```
502
+ #
503
+ # @return [Node, nil]
504
+ attr_reader :expr
505
+ # A list of `When` nodes (each has `patterns` and `body`)
506
+ #
507
+ # @return [::Array<Node>]
508
+ attr_reader :when_bodies
509
+ # Body of the `else` branch, `None` if there's no `else` branch
510
+ #
511
+ # @return [Node, nil]
512
+ attr_reader :else_body
513
+ # Location of the `case` keyword
514
+ #
515
+ # ```text
516
+ # case 1; end
517
+ # ~~~~
518
+ # ```
519
+ #
520
+ # @return [Loc]
521
+ attr_reader :keyword_l
522
+ # Location of the `else` keyword
523
+ #
524
+ # ```text
525
+ # case 1; else; end
526
+ # ~~~~
527
+ # ```
528
+ #
529
+ # `None` if there's no `else` branch
530
+ #
531
+ # @return [Loc, nil]
532
+ attr_reader :else_l
533
+ # Location of the `end` keyword
534
+ #
535
+ # ```text
536
+ # case 1; end
537
+ # ~~~
538
+ # ```
539
+ #
540
+ # @return [Loc]
541
+ attr_reader :end_l
542
+ # Location of the full expression
543
+ #
544
+ # ```text
545
+ # case 1; end
546
+ # ~~~~~~~~~~~
547
+ # ```
548
+ #
549
+ # @return [Loc]
550
+ attr_reader :expression_l
551
+ end
552
+
553
+ # Represents a `case` statement used for pattern matching (for regular `case` see `Case` node)
554
+ class CaseMatch < Node
555
+ # Expression given to `case`, `Int("1")` for `case 1; in 1; end`
556
+ # `None` for code like
557
+ #
558
+ # ```text
559
+ # case
560
+ # in pattern
561
+ # end
562
+ # ```
563
+ #
564
+ # @return [Node]
565
+ attr_reader :expr
566
+ # A list of `InPattern` nodes (each has `pattern`, `guard` and `body`)
567
+ #
568
+ # @return [::Array<Node>]
569
+ attr_reader :in_bodies
570
+ # Body of the `else` branch, `None` if there's no `else` branch
571
+ #
572
+ # @return [Node, nil]
573
+ attr_reader :else_body
574
+ # Location of the `case` keyword
575
+ #
576
+ # ```text
577
+ # case 1; in 2; end
578
+ # ~~~~
579
+ # ```
580
+ #
581
+ # @return [Loc]
582
+ attr_reader :keyword_l
583
+ # Location of the `else` keyword
584
+ #
585
+ # ```text
586
+ # case 1; in 2; else; end
587
+ # ~~~~
588
+ # ```
589
+ #
590
+ # `None` if there's no `else` branch
591
+ #
592
+ # @return [Loc, nil]
593
+ attr_reader :else_l
594
+ # Location of the `end` keyword
595
+ #
596
+ # ```text
597
+ # case 1; in 2; end
598
+ # ~~~
599
+ # ```
600
+ #
601
+ # @return [Loc]
602
+ attr_reader :end_l
603
+ # Location of the full expression
604
+ #
605
+ # ```text
606
+ # case 1; in 2; end
607
+ # ~~~~~~~~~~~~~~~~~
608
+ # ```
609
+ #
610
+ # @return [Loc]
611
+ attr_reader :expression_l
612
+ end
613
+
614
+ # Represents a constant assignment (i.e. `A = 1`)
615
+ class Casgn < Node
616
+ # Scope where the constant is defined:
617
+ # 1. `Some(Const("A"))` for `A::B = 1`
618
+ # 2. `None` if it's defined in the current scope (i.e. `A = 1`)
619
+ # 3. `Some(Cbase)` if it's defined in the global scope (i.e. `::A = 1`)
620
+ #
621
+ # @return [Node, nil]
622
+ attr_reader :scope
623
+ # Name of the constant, `String("A")` for `A = 1`
624
+ #
625
+ # @return [String]
626
+ attr_reader :name
627
+ # Value that is assigned to a constant, `Int("1")` for `A = 1`.
628
+ #
629
+ # **Note**: `None` if constant assignment is a part of the multi-assignment.
630
+ # In such case `value` belongs to `Masgn` node of the multi-assignment.
631
+ #
632
+ # @return [Node, nil]
633
+ attr_reader :value
634
+ # Location of the `::` operator
635
+ #
636
+ # ```text
637
+ # A::B = 1
638
+ # ~~
639
+ #
640
+ # ::A = 1
641
+ # ~~
642
+ # ```
643
+ #
644
+ # `None` if the constant is defined in the current scope
645
+ #
646
+ # @return [Loc, nil]
647
+ attr_reader :double_colon_l
648
+ # Location of the constant name
649
+ #
650
+ # ```text
651
+ # A::CONST = 1
652
+ # ~~~~~
653
+ # ```
654
+ #
655
+ # @return [Loc]
656
+ attr_reader :name_l
657
+ # Location of the `=` operator
658
+ #
659
+ # ```text
660
+ # A = 1
661
+ # ~
662
+ # ```
663
+ #
664
+ # `None` if constant assignment is a part of the multi-assignment.
665
+ # In such case `=` belongs to a `Masgn` node
666
+ #
667
+ # @return [Loc, nil]
668
+ attr_reader :operator_l
669
+ # Location of the full expression
670
+ #
671
+ # ```text
672
+ # A = 1
673
+ # ~~~~~
674
+ # ```
675
+ #
676
+ # @return [Loc]
677
+ attr_reader :expression_l
678
+ end
679
+
680
+ # Represents leading `::` part of the constant access/assignment that is used to get/set on a global namespace.
681
+ class Cbase < Node
682
+ # Location of the full expression
683
+ #
684
+ # ```text
685
+ # ::A
686
+ # ~~
687
+ # ```
688
+ #
689
+ # @return [Loc]
690
+ attr_reader :expression_l
691
+ end
692
+
693
+ # Represents a class definition (using a `class` keyword, `Class.new` is just a method call)
694
+ class Class < Node
695
+ # Name of the class, `String("Foo")` for `class Foo; end`
696
+ #
697
+ # @return [Node]
698
+ attr_reader :name
699
+ # Superclass. Can be an expression in cases like `class A < (obj.foo + 1); end`
700
+ #
701
+ # `None` if no explicit superclass given (i.e. `class Foo; end`)
702
+ #
703
+ # @return [Node, nil]
704
+ attr_reader :superclass
705
+ # Body of the method, `None` if there's no body.
706
+ #
707
+ # @return [Node, nil]
708
+ attr_reader :body
709
+ # Location of the `class` keyword.
710
+ #
711
+ # ```text
712
+ # class Foo; end
713
+ # ~~~~~
714
+ # ```
715
+ #
716
+ # @return [Loc]
717
+ attr_reader :keyword_l
718
+ # Location of the `<` operator
719
+ #
720
+ # ```text
721
+ # class A < B; end
722
+ # ~
723
+ # ```
724
+ #
725
+ # `None` if there's no explicit superclass given.
726
+ #
727
+ # @return [Loc, nil]
728
+ attr_reader :operator_l
729
+ # Location of the `end` keyword.
730
+ #
731
+ # ```text
732
+ # class Foo; end
733
+ # ~~~
734
+ # ```
735
+ #
736
+ # @return [Loc]
737
+ attr_reader :end_l
738
+ # Location of the full expression
739
+ #
740
+ # ```text
741
+ # class Foo; end
742
+ # ~~~~~~~~~~~~~~
743
+ # ```
744
+ #
745
+ # @return [Loc]
746
+ attr_reader :expression_l
747
+ end
748
+
749
+ # Represents a `Complex` literal (that returns an `Complex` number)
750
+ class Complex < Node
751
+ # Value of the complex literal, returned as a `String`, `String("1i")` for `1i`
752
+ #
753
+ # @return [String]
754
+ attr_reader :value
755
+ # Location of the `-` (but not `+`) operator. `+` is a part of the literal:
756
+ # 1. `+1i` is `String("+1i")` with `operator = None`
757
+ # 2. `-1i` is `String("1i")` with `operator = String("-")`
758
+ #
759
+ # ```text
760
+ # -1i
761
+ # ~
762
+ # ```
763
+ #
764
+ # @return [Loc, nil]
765
+ attr_reader :operator_l
766
+ # Location of the full expression
767
+ #
768
+ # ```text
769
+ # -1i
770
+ # ~~~
771
+ # ```
772
+ #
773
+ # @return [Loc]
774
+ attr_reader :expression_l
775
+ end
776
+
777
+ # Represents constant access (i.e. `Foo::Bar`)
778
+ class Const < Node
779
+ # Scope where the constant is taken from:
780
+ # 1. `Some(Const("A"))` for `A::B`
781
+ # 2. `None` if it's taken from the current scope (i.e. `A`)
782
+ # 3. `Some(Cbase)` if it's taken from the global scope (i.e. `::A`)
783
+ #
784
+ # @return [Node, nil]
785
+ attr_reader :scope
786
+ # Name of the constant, `String("Foo")` for `Foo`
787
+ #
788
+ # @return [String]
789
+ attr_reader :name
790
+ # Location of the `::` operator. `None` if constant is taken from the current scope.
791
+ #
792
+ # ```text
793
+ # A::B
794
+ # ~~
795
+ # ```
796
+ #
797
+ # @return [Loc, nil]
798
+ attr_reader :double_colon_l
799
+ # Location of the constant name
800
+ #
801
+ # ```text
802
+ # Foo::Bar
803
+ # ~~~
804
+ # ```
805
+ #
806
+ # @return [Loc]
807
+ attr_reader :name_l
808
+ # Location of the full expression
809
+ #
810
+ # ```text
811
+ # Foo::Bar
812
+ # ~~~~~~~~
813
+ # ```
814
+ #
815
+ # @return [Loc]
816
+ attr_reader :expression_l
817
+ end
818
+
819
+ # Const pattern used in pattern matching (e.g. `in A(1, 2)`)
820
+ class ConstPattern < Node
821
+ # Constant that is used, `Const("Foo")` for `in For(42)`
822
+ #
823
+ # @return [Node]
824
+ attr_reader :const
825
+ # Inner part of the constant pattern
826
+ #
827
+ # `ArrayPattern(vec![ Int("1") ])` for `Foo(1)`
828
+ #
829
+ # @return [Node]
830
+ attr_reader :pattern
831
+ # Location of the open parenthesis
832
+ #
833
+ # ```text
834
+ # case 1; in Foo(42); end
835
+ # ~
836
+ # ```
837
+ #
838
+ # @return [Loc]
839
+ attr_reader :begin_l
840
+ # Location of the closing parenthesis
841
+ #
842
+ # ```text
843
+ # case 1; in Foo(42); end
844
+ # ~
845
+ # ```
846
+ #
847
+ # @return [Loc]
848
+ attr_reader :end_l
849
+ # Location of the full expression
850
+ #
851
+ # ```text
852
+ # case 1; in Foo(42); end
853
+ # ~~~~~~~
854
+ # ```
855
+ #
856
+ # @return [Loc]
857
+ attr_reader :expression_l
858
+ end
859
+
860
+ # Represents conditional method call using `&.` operator
861
+ class CSend < Node
862
+ # Receiver of the method call, `Int("1")` for `1&.foo`
863
+ #
864
+ # @return [Node]
865
+ attr_reader :recv
866
+ # Name of the method, `String("foo")` for `1&.foo`
867
+ #
868
+ # @return [String]
869
+ attr_reader :method_name
870
+ # List of arguments
871
+ #
872
+ # ```text
873
+ # foo&.bar(42)
874
+ # # and also setters like
875
+ # foo&.bar = 42
876
+ # ```
877
+ #
878
+ # @return [::Array<Node>]
879
+ attr_reader :args
880
+ # Location of the `&.` operator
881
+ #
882
+ # ```text
883
+ # foo&.bar
884
+ # ~~
885
+ # ```
886
+ #
887
+ # @return [Loc]
888
+ attr_reader :dot_l
889
+ # Location of the method name
890
+ #
891
+ # ```text
892
+ # foo&.bar(42)
893
+ # ~~~
894
+ # ```
895
+ #
896
+ # `None` in a very special case when method call is implicit (i.e. `foo&.()`)
897
+ #
898
+ # @return [Loc, nil]
899
+ attr_reader :selector_l
900
+ # Location of the open parenthesis
901
+ #
902
+ # ```text
903
+ # foo&.bar(42)
904
+ # ~
905
+ # ```
906
+ #
907
+ # `None` if there are no parentheses
908
+ #
909
+ # @return [Loc, nil]
910
+ attr_reader :begin_l
911
+ # Location of the closing parenthesis
912
+ #
913
+ # ```text
914
+ # foo&.bar(42)
915
+ # ~
916
+ # ```
917
+ #
918
+ # `None` if there are no parentheses
919
+ #
920
+ # @return [Loc, nil]
921
+ attr_reader :end_l
922
+ # Location of the operator if `CSend` is a part of assignment like
923
+ #
924
+ # ```text
925
+ # foo&.bar = 1
926
+ # ~
927
+ # ```
928
+ #
929
+ # `None` for a regular call.
930
+ #
931
+ # @return [Loc, nil]
932
+ attr_reader :operator_l
933
+ # Location of the full expression
934
+ #
935
+ # ```text
936
+ # foo&.bar(42)
937
+ # ~~~~~~~~~~~~
938
+ # ```
939
+ #
940
+ # @return [Loc]
941
+ attr_reader :expression_l
942
+ end
943
+
944
+ # Represents access to class variable (i.e. `@@var`)
945
+ class Cvar < Node
946
+ # Name of the class variable, `String("@@foo")` for `@@foo`
947
+ #
948
+ # @return [String]
949
+ attr_reader :name
950
+ # Location of the full expression
951
+ #
952
+ # ```text
953
+ # @@foo
954
+ # ~~~~~
955
+ # ```
956
+ #
957
+ # @return [Loc]
958
+ attr_reader :expression_l
959
+ end
960
+
961
+ # Represents class variable assignment (i.e. `@@var = 42`)
962
+ class Cvasgn < Node
963
+ # Name of the class variable, `String("@@foo")` for `@@foo = 1`
964
+ #
965
+ # @return [String]
966
+ attr_reader :name
967
+ # Value that is assigned to class variable, `Int("1")` for `@@foo = 1`
968
+ #
969
+ # @return [Node, nil]
970
+ attr_reader :value
971
+ # Location of the class variable name
972
+ #
973
+ # ```text
974
+ # @@foo = 1
975
+ # ~~~~~
976
+ # ```
977
+ #
978
+ # @return [Loc]
979
+ attr_reader :name_l
980
+ # Location of the `=` operator
981
+ #
982
+ # ```text
983
+ # @@foo = 1
984
+ # ~
985
+ # ```
986
+ #
987
+ # @return [Loc, nil]
988
+ attr_reader :operator_l
989
+ # Location of the full expression
990
+ #
991
+ # ```text
992
+ # @@foo = 1
993
+ # ~~~~~~~~~
994
+ # ```
995
+ #
996
+ # @return [Loc]
997
+ attr_reader :expression_l
998
+ end
999
+
1000
+ # Represents method definition using `def` keyword (not on a singleton, see `Defs` node).
1001
+ class Def < Node
1002
+ # Name of the method, `String("foo")` for `def foo; end`
1003
+ #
1004
+ # @return [String]
1005
+ attr_reader :name
1006
+ # Arguments of a method, `None` if there's no arguments.
1007
+ #
1008
+ # All information about parentheses around arguments is stored in this node.
1009
+ #
1010
+ # @return [Node, nil]
1011
+ attr_reader :args
1012
+ # Body of a method, `None` if there's no body.
1013
+ #
1014
+ # @return [Node, nil]
1015
+ attr_reader :body
1016
+ # Location of the `def` keyword.
1017
+ #
1018
+ # ```text
1019
+ # def foo; end
1020
+ # ~~~
1021
+ # ```
1022
+ #
1023
+ # @return [Loc]
1024
+ attr_reader :keyword_l
1025
+ # Location of the method name.
1026
+ #
1027
+ # ```text
1028
+ # def foo; end
1029
+ # ~~~
1030
+ # ```
1031
+ #
1032
+ # @return [Loc]
1033
+ attr_reader :name_l
1034
+ # Location of the `end` keyword.
1035
+ #
1036
+ # ```text
1037
+ # def foo; end
1038
+ # ~~~
1039
+ # ```
1040
+ #
1041
+ # `None` for endless method definition
1042
+ #
1043
+ # @return [Loc, nil]
1044
+ attr_reader :end_l
1045
+ # Location of the `=` operator for endless method definition
1046
+ #
1047
+ # ```text
1048
+ # def m() = 1
1049
+ # ~
1050
+ # ```
1051
+ #
1052
+ # `None` for regular method definition
1053
+ #
1054
+ # @return [Loc, nil]
1055
+ attr_reader :assignment_l
1056
+ # Location of the full expression
1057
+ #
1058
+ # ```text
1059
+ # def m(a); foo; end
1060
+ # ~~~~~~~~~~~~~~~~~~
1061
+ # ```
1062
+ #
1063
+ # @return [Loc]
1064
+ attr_reader :expression_l
1065
+ end
1066
+
1067
+ # Represents a `defined?(foo)` expression
1068
+ class Defined < Node
1069
+ # Value given to `defined?`
1070
+ #
1071
+ # @return [Node]
1072
+ attr_reader :value
1073
+ # Location of the `defined?` keyword
1074
+ #
1075
+ # ```text
1076
+ # defined?(foo)
1077
+ # ~~~~~~~~
1078
+ # ```
1079
+ #
1080
+ # @return [Loc]
1081
+ attr_reader :keyword_l
1082
+ # Location of the open parenthesis
1083
+ #
1084
+ # ```text
1085
+ # defined?(foo)
1086
+ # ~
1087
+ # ```
1088
+ #
1089
+ # `None` if there are no parentheses
1090
+ #
1091
+ # @return [Loc, nil]
1092
+ attr_reader :begin_l
1093
+ # Location of the closing parenthesis
1094
+ #
1095
+ # ```text
1096
+ # defined?(foo)
1097
+ # ~
1098
+ # ```
1099
+ #
1100
+ # `None` if there are no parentheses
1101
+ #
1102
+ # @return [Loc, nil]
1103
+ attr_reader :end_l
1104
+ # Location of the full expression
1105
+ #
1106
+ # ```text
1107
+ # defined?(foo)
1108
+ # ~~~~~~~~~~~~~
1109
+ # ```
1110
+ #
1111
+ # @return [Loc]
1112
+ attr_reader :expression_l
1113
+ end
1114
+
1115
+ # Represents a singleton method definition (i.e. `def self.foo; end`)
1116
+ class Defs < Node
1117
+ # Definee of a method definition, `Lvar("x")` for `def x.foo; end`
1118
+ #
1119
+ # @return [Node]
1120
+ attr_reader :definee
1121
+ # Name of the method, `String("foo")` for `def x.foo; end`
1122
+ #
1123
+ # @return [String]
1124
+ attr_reader :name
1125
+ # Arguments of a method, `None` if there's no arguments.
1126
+ #
1127
+ # All information about parentheses around arguments is stored in this node.
1128
+ #
1129
+ # @return [Node, nil]
1130
+ attr_reader :args
1131
+ # Body of the method, `None` if there's no body.
1132
+ #
1133
+ # @return [Node, nil]
1134
+ attr_reader :body
1135
+ # Location of the `def` keyword
1136
+ #
1137
+ # ```text
1138
+ # def self.foo; end
1139
+ # ~~~
1140
+ # ```
1141
+ #
1142
+ # @return [Loc]
1143
+ attr_reader :keyword_l
1144
+ # Location of the `.`
1145
+ #
1146
+ # ```text
1147
+ # def self.foo; end
1148
+ # ~
1149
+ # ```
1150
+ #
1151
+ # @return [Loc]
1152
+ attr_reader :operator_l
1153
+ # Location of the method name
1154
+ #
1155
+ # ```text
1156
+ # def self.foo; end
1157
+ # ~~~
1158
+ # ```
1159
+ #
1160
+ # @return [Loc]
1161
+ attr_reader :name_l
1162
+ # Location of the `=` operator for endless method definition
1163
+ #
1164
+ # ```text
1165
+ # def self.foo() = 42
1166
+ # ~
1167
+ # ```
1168
+ #
1169
+ # `None` for regular method definition
1170
+ #
1171
+ # @return [Loc, nil]
1172
+ attr_reader :assignment_l
1173
+ # Location of the `end` keyword
1174
+ #
1175
+ # ```text
1176
+ # def self.foo; end
1177
+ # ~~~
1178
+ # ```
1179
+ #
1180
+ # `None` for endless method definition
1181
+ #
1182
+ # @return [Loc, nil]
1183
+ attr_reader :end_l
1184
+ # Location of the full expression
1185
+ #
1186
+ # ```text
1187
+ # def self.foo; end
1188
+ # ~~~~~~~~~~~~~~~~~
1189
+ # ```
1190
+ #
1191
+ # @return [Loc]
1192
+ attr_reader :expression_l
1193
+ end
1194
+
1195
+ # Represents a string with interpolation (i.e. `"#{foo}"`)
1196
+ class Dstr < Node
1197
+ # A list of string parts (static literals and interpolated expressions)
1198
+ #
1199
+ # @return [::Array<Node>]
1200
+ attr_reader :parts
1201
+ # Location of the string begin
1202
+ #
1203
+ # ```text
1204
+ # "#{foo}"
1205
+ # ~
1206
+ #
1207
+ # %Q{#{foo}}
1208
+ # ~~~
1209
+ # ```
1210
+ #
1211
+ # @return [Loc, nil]
1212
+ attr_reader :begin_l
1213
+ # Location of the string end
1214
+ #
1215
+ # ```text
1216
+ # "#{foo}"
1217
+ # ~
1218
+ #
1219
+ # %Q{#{foo}}
1220
+ # ~
1221
+ # ```
1222
+ #
1223
+ # @return [Loc, nil]
1224
+ attr_reader :end_l
1225
+ # Location of the full expression
1226
+ #
1227
+ # ```text
1228
+ # "#{foo}"
1229
+ # ~~~~~~~~
1230
+ #
1231
+ # %Q{#{foo}}
1232
+ # ~~~~~~~~~~
1233
+ # ```
1234
+ #
1235
+ # @return [Loc]
1236
+ attr_reader :expression_l
1237
+ end
1238
+
1239
+ # Represents a symbol with interpolation (i.e. `:"#{foo}"`)
1240
+ class Dsym < Node
1241
+ # A list of symbol parts (static literals and interpolated expressions)
1242
+ #
1243
+ # @return [::Array<Node>]
1244
+ attr_reader :parts
1245
+ # Location of the symbol begin
1246
+ #
1247
+ # ```text
1248
+ # :"#{foo}"
1249
+ # ~~
1250
+ # ```
1251
+ #
1252
+ # `None` if `Dsym` is a part of the interpolated symbol array:
1253
+ #
1254
+ # ```text
1255
+ # %I[#{bar}]
1256
+ # ```
1257
+ #
1258
+ # @return [Loc, nil]
1259
+ attr_reader :begin_l
1260
+ # Location of the symbol begin
1261
+ #
1262
+ # ```text
1263
+ # :"#{foo}"
1264
+ # ~
1265
+ # ```
1266
+ #
1267
+ # `None` if `Dsym` is a part of the interpolated symbol array:
1268
+ #
1269
+ # ```text
1270
+ # %I[#{bar}]
1271
+ # ```
1272
+ #
1273
+ # @return [Loc, nil]
1274
+ attr_reader :end_l
1275
+ # Location of the full expression
1276
+ #
1277
+ # ```text
1278
+ # :"#{foo}"
1279
+ # ~~~~~~~~~
1280
+ # ```
1281
+ #
1282
+ # @return [Loc]
1283
+ attr_reader :expression_l
1284
+ end
1285
+
1286
+ # Represents exclusive flip-flop (i.e. in `if foo...bar; end`)
1287
+ class EFlipFlop < Node
1288
+ # Left part of the flip-flop. `None` if based on a range without begin (`...bar`)
1289
+ #
1290
+ # @return [Node, nil]
1291
+ attr_reader :left
1292
+ # Right part of the flip-flop. `None` if based on a range without end (`foo...`)
1293
+ #
1294
+ # @return [Node, nil]
1295
+ attr_reader :right
1296
+ # Location of the `...` operator
1297
+ #
1298
+ # ```text
1299
+ # if foo...bar; end
1300
+ # ~~~
1301
+ # ```
1302
+ #
1303
+ # @return [Loc]
1304
+ attr_reader :operator_l
1305
+ # Location of the full expression
1306
+ #
1307
+ # ```text
1308
+ # if foo...bar; end
1309
+ # ~~~~~~~~~
1310
+ # ```
1311
+ #
1312
+ # @return [Loc]
1313
+ attr_reader :expression_l
1314
+ end
1315
+
1316
+ # Represents a special empty else that is a part of the pattern matching.
1317
+ #
1318
+ # Usually empty else (e.g. part of the `if` statement) doesn't mean anything,
1319
+ # however in pattern matching it prevents raising a `NoPatternError`.
1320
+ #
1321
+ # Throwing away this `else` may affect your code.
1322
+ class EmptyElse < Node
1323
+ # Location of the `else` keyword
1324
+ #
1325
+ # ```text
1326
+ # case foo; in 1; else; end
1327
+ # ~~~~
1328
+ # ```
1329
+ #
1330
+ # @return [Loc]
1331
+ attr_reader :expression_l
1332
+ end
1333
+
1334
+ # Represents a special `__ENCODING__` keyword
1335
+ class Encoding < Node
1336
+ # Location of the `__ENCODING__` keyword
1337
+ #
1338
+ # ```text
1339
+ # __ENCODING__
1340
+ # ~~~~~~~~~~~~
1341
+ # ```
1342
+ #
1343
+ # @return [Loc]
1344
+ attr_reader :expression_l
1345
+ end
1346
+
1347
+ # Represents a block of code with `ensure` (i.e. `begin; ensure; end`)
1348
+ class Ensure < Node
1349
+ # Block of code that is wrapped into `ensure`
1350
+ # **Note**: that's the body of the `ensure` block
1351
+ #
1352
+ # `Int("1")` for `begin; 1; ensure; 2; end`
1353
+ #
1354
+ # @return [Node, nil]
1355
+ attr_reader :body
1356
+ # Body of the `ensure` block
1357
+ #
1358
+ # `Int("2")` for `begin; 1; ensure; 2; end`
1359
+ #
1360
+ # @return [Node, nil]
1361
+ attr_reader :ensure
1362
+ # Location of the `ensure` keyword
1363
+ #
1364
+ # ```text
1365
+ # begin; ensure; end
1366
+ # ~~~~~~
1367
+ # ```
1368
+ #
1369
+ # @return [Loc]
1370
+ attr_reader :keyword_l
1371
+ # Location of the full expression
1372
+ #
1373
+ # ```text
1374
+ # begin; 1; rescue; 2; else; 3; ensure; 4; end
1375
+ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1376
+ # ```
1377
+ #
1378
+ # **Note**: begin/end belong to `KwBegin` node.
1379
+ #
1380
+ # @return [Loc]
1381
+ attr_reader :expression_l
1382
+ end
1383
+
1384
+ # Represents range literal with excluded `end` (i.e. `1...3`)
1385
+ class Erange < Node
1386
+ # Begin of the range, `None` if range has no begin (i.e `...42`)
1387
+ #
1388
+ # @return [Node, nil]
1389
+ attr_reader :left
1390
+ # End of the range, `None` if range has no end (i.e `42...`)
1391
+ #
1392
+ # @return [Node, nil]
1393
+ attr_reader :right
1394
+ # Location of the `...` operator
1395
+ #
1396
+ # ```text
1397
+ # 1...3
1398
+ # ~~~
1399
+ # ```
1400
+ #
1401
+ # @return [Loc]
1402
+ attr_reader :operator_l
1403
+ # Location of the full expression
1404
+ #
1405
+ # ```text
1406
+ # 1...3
1407
+ # ~~~~~
1408
+ # ```
1409
+ #
1410
+ # @return [Loc]
1411
+ attr_reader :expression_l
1412
+ end
1413
+
1414
+ # Represents a `false` literal
1415
+ class False < Node
1416
+ # Location of the `false` literal
1417
+ #
1418
+ # ```text
1419
+ # false
1420
+ # ~~~~~
1421
+ # ```
1422
+ #
1423
+ # @return [Loc]
1424
+ attr_reader :expression_l
1425
+ end
1426
+
1427
+ # Represents a special `__FILE__` literal
1428
+ class File < Node
1429
+ # Location of the `__FILE__` literal
1430
+ #
1431
+ # ```text
1432
+ # __FILE__
1433
+ # ~~~~~~~~
1434
+ # ```
1435
+ #
1436
+ # @return [Loc]
1437
+ attr_reader :expression_l
1438
+ end
1439
+
1440
+ # Represents a find pattern using in pattern matching (i.e. `in [*x, 1 => a, *y]`)
1441
+ #
1442
+ # It's different from `ArrayPattern`/`ConstPattern` because it supports multiple wildcard pattern
1443
+ class FindPattern < Node
1444
+ # Inner part of the find pattern
1445
+ #
1446
+ # @return [::Array<Node>]
1447
+ attr_reader :elements
1448
+ # Location of the begin
1449
+ #
1450
+ # ```text
1451
+ # case foo; in [*x, 1 => a, *y]; end
1452
+ # ~
1453
+ # ```
1454
+ #
1455
+ # `None` if there are no brackets/parentheses
1456
+ #
1457
+ # @return [Loc, nil]
1458
+ attr_reader :begin_l
1459
+ # Location of the end
1460
+ #
1461
+ # ```text
1462
+ # case foo; in [*x, 1 => a, *y]; end
1463
+ # ~
1464
+ # ```
1465
+ #
1466
+ # `None` if there are no brackets/parentheses
1467
+ #
1468
+ # @return [Loc, nil]
1469
+ attr_reader :end_l
1470
+ # Location of the full expression
1471
+ #
1472
+ # ```text
1473
+ # case foo; in [*x, 1 => a, *y]; end
1474
+ # ~~~~~~~~~~~~~~~~
1475
+ # ```
1476
+ #
1477
+ # @return [Loc]
1478
+ attr_reader :expression_l
1479
+ end
1480
+
1481
+ # Represents a float literal (i.e. `42.5`)
1482
+ class Float < Node
1483
+ # String value of the literal, `String("42.5")` for `42.5`
1484
+ #
1485
+ # @return [String]
1486
+ attr_reader :value
1487
+ # Location of unary `-` (but not `+`)
1488
+ #
1489
+ # ```text
1490
+ # -42.5
1491
+ # ~
1492
+ # ```
1493
+ #
1494
+ # @return [Loc, nil]
1495
+ attr_reader :operator_l
1496
+ # Location of the full expression
1497
+ #
1498
+ # ```text
1499
+ # -42.5
1500
+ # ~~~~~
1501
+ # ```
1502
+ #
1503
+ # @return [Loc]
1504
+ attr_reader :expression_l
1505
+ end
1506
+
1507
+ # Represents a `for` loop
1508
+ class For < Node
1509
+ # Variable that is used in loop, `Lvasgn("a")` in `for a in b; end`
1510
+ #
1511
+ # @return [Node]
1512
+ attr_reader :iterator
1513
+ # Collection that is for iteration. `Lvar("b")` in `for a in b; end`
1514
+ #
1515
+ # @return [Node]
1516
+ attr_reader :iteratee
1517
+ # Body of the loop. `None` if there's no body
1518
+ #
1519
+ # @return [Node, nil]
1520
+ attr_reader :body
1521
+ # Location of the `for` keyword
1522
+ #
1523
+ # ```text
1524
+ # for a in b; end
1525
+ # ~~~
1526
+ # ```
1527
+ #
1528
+ # @return [Loc]
1529
+ attr_reader :keyword_l
1530
+ # Location of the `in` keyword
1531
+ #
1532
+ # ```text
1533
+ # for a in b; end
1534
+ # ~~
1535
+ # ```
1536
+ #
1537
+ # @return [Loc]
1538
+ attr_reader :operator_l
1539
+ # Location of the `do` keyword
1540
+ #
1541
+ # ```text
1542
+ # for a in b do; end
1543
+ # ~~
1544
+ # ```
1545
+ #
1546
+ # **Note**: this `do` is optional, and so `begin_l` can be `None`.
1547
+ #
1548
+ # @return [Loc]
1549
+ attr_reader :begin_l
1550
+ # Location of the `end` keyword
1551
+ #
1552
+ # ```text
1553
+ # for a in b; end
1554
+ # ~~~
1555
+ # ```
1556
+ #
1557
+ # @return [Loc]
1558
+ attr_reader :end_l
1559
+ # Location of the full expression
1560
+ #
1561
+ # ```text
1562
+ # for a in b; end
1563
+ # ~~~~~~~~~~~~~~~
1564
+ # ```
1565
+ #
1566
+ # @return [Loc]
1567
+ attr_reader :expression_l
1568
+ end
1569
+
1570
+ # Represents a special `...` argument that forwards positional/keyword/block arguments.
1571
+ class ForwardArg < Node
1572
+ # Location of the `...`
1573
+ #
1574
+ # ```text
1575
+ # def m(...); end
1576
+ # ~~~
1577
+ # ```
1578
+ #
1579
+ # @return [Loc]
1580
+ attr_reader :expression_l
1581
+ end
1582
+
1583
+ # Represents a `...` operator that contains forwarded argument (see `ForwardArg`)
1584
+ class ForwardedArgs < Node
1585
+ # Location of the `...`
1586
+ #
1587
+ # ```text
1588
+ # def m(...); foo(...); end
1589
+ # ~~~
1590
+ # ```
1591
+ #
1592
+ # @return [Loc]
1593
+ attr_reader :expression_l
1594
+ end
1595
+
1596
+ # Represents access to global variable (i.e. `$foo`)
1597
+ class Gvar < Node
1598
+ # Name of the global variable, `String("$foo")` for `$foo`
1599
+ #
1600
+ # @return [String]
1601
+ attr_reader :name
1602
+ # Location of the full expression
1603
+ #
1604
+ # ```text
1605
+ # $foo
1606
+ # ~~~~
1607
+ # ```
1608
+ #
1609
+ # @return [Loc]
1610
+ attr_reader :expression_l
1611
+ end
1612
+
1613
+ # Represents global variable assignment (i.e. `$foo = 42`)
1614
+ class Gvasgn < Node
1615
+ # Name of the global variable, `String("$foo")` for `$foo`
1616
+ #
1617
+ # @return [String]
1618
+ attr_reader :name
1619
+ # Value that is assigned to global variable, `Int("42")` for `$foo = 42`
1620
+ #
1621
+ # `None` if global variable assignment is a part of the multi-assignment.
1622
+ # In such case `value` is a part of the `Masgn` node.
1623
+ #
1624
+ # @return [Node, nil]
1625
+ attr_reader :value
1626
+ # Location of the global variable name
1627
+ #
1628
+ # ```text
1629
+ # $foo = 42
1630
+ # ~~~~
1631
+ # ```
1632
+ #
1633
+ # @return [Loc]
1634
+ attr_reader :name_l
1635
+ # Location of the `=` operator
1636
+ #
1637
+ # ```text
1638
+ # $foo = 42
1639
+ # ~
1640
+ # ```
1641
+ #
1642
+ # `None` if global variable assignment is a part of the multi-assignment.
1643
+ # In such case `=` operator belongs to the `Masgn` node.
1644
+ #
1645
+ # @return [Loc, nil]
1646
+ attr_reader :operator_l
1647
+ # Location of the full expression
1648
+ #
1649
+ # ```text
1650
+ # $foo = 42
1651
+ # ~~~~~~~~~
1652
+ # ```
1653
+ #
1654
+ # @return [Loc]
1655
+ attr_reader :expression_l
1656
+ end
1657
+
1658
+ # Represents a hash literal (i.e. `{ foo: 42 }`)
1659
+ class Hash < Node
1660
+ # A list of key-value pairs
1661
+ #
1662
+ # @return [::Array<Node>]
1663
+ attr_reader :pairs
1664
+ # Location of the open parenthesis
1665
+ #
1666
+ # ```text
1667
+ # { a: 1 }
1668
+ # ~
1669
+ # ```
1670
+ #
1671
+ # `None` if hash literal is implicit, e.g. `foo(key: "value")`
1672
+ #
1673
+ # @return [Loc, nil]
1674
+ attr_reader :begin_l
1675
+ # Location of the closing parenthesis
1676
+ #
1677
+ # ```text
1678
+ # { a: 1 }
1679
+ # ~
1680
+ # ```
1681
+ #
1682
+ # `None` if hash literal is implicit, e.g. `foo(key: "value")`
1683
+ #
1684
+ # @return [Loc, nil]
1685
+ attr_reader :end_l
1686
+ # Location of the full expression
1687
+ #
1688
+ # ```text
1689
+ # { a: 1 }
1690
+ # ~~~~~~~~
1691
+ # ```
1692
+ #
1693
+ # @return [Loc]
1694
+ attr_reader :expression_l
1695
+ end
1696
+
1697
+ # Represents a hash pattern used in pattern matching (i.e. `in { a: 1 }`)
1698
+ class HashPattern < Node
1699
+ # A list of inner patterns
1700
+ #
1701
+ # @return [::Array<Node>]
1702
+ attr_reader :elements
1703
+ # Location of the open parenthesis
1704
+ #
1705
+ # ```text
1706
+ # case foo; in { a: 1 }; end
1707
+ # ~
1708
+ # ```
1709
+ #
1710
+ # `None` if there are no parentheses
1711
+ #
1712
+ # @return [Loc, nil]
1713
+ attr_reader :begin_l
1714
+ # Location of the open parenthesis
1715
+ #
1716
+ # ```text
1717
+ # case foo; in { a: 1 }; end
1718
+ # ~
1719
+ # ```
1720
+ #
1721
+ # `None` if there are no parentheses
1722
+ #
1723
+ # @return [Loc, nil]
1724
+ attr_reader :end_l
1725
+ # Location of the full expression
1726
+ #
1727
+ # ```text
1728
+ # case foo; in { a: 1 }; end
1729
+ # ~~~~~~~~
1730
+ # ```
1731
+ #
1732
+ # @return [Loc]
1733
+ attr_reader :expression_l
1734
+ end
1735
+
1736
+ # Represents a here-document literal (both with and without interpolation)
1737
+ #
1738
+ # It's similar to `Dstr` in terms of abstract syntax tree, but has different source maps.
1739
+ class Heredoc < Node
1740
+ # A list of string parts (static literals and interpolated expressions)
1741
+ #
1742
+ # @return [::Array<Node>]
1743
+ attr_reader :parts
1744
+ # Location of the here-document body
1745
+ #
1746
+ # ```text
1747
+ # <<-HERE\n a\n #{42}\nHERE
1748
+ # ~~~~~~~~~~~~~~~
1749
+ # ```
1750
+ #
1751
+ # @return [Loc]
1752
+ attr_reader :heredoc_body_l
1753
+ # Location of the here-document end
1754
+ #
1755
+ # ```text
1756
+ # <<-HERE\n a\n #{42}\nHERE
1757
+ # ~~~~
1758
+ # ```
1759
+ #
1760
+ # @return [Loc]
1761
+ attr_reader :heredoc_end_l
1762
+ # Location of the here-document identifier
1763
+ #
1764
+ # ```text
1765
+ # <<-HERE\n a\n #{42}\nHERE
1766
+ # ~~~~~~~
1767
+ # ```
1768
+ #
1769
+ # **Note**: This is the only node (with `XHeredoc`) that has `expression_l` smaller that all other sub-locations merged.
1770
+ # The reason for that is that it's possible to add more code after here-document ID:
1771
+ #
1772
+ # ```text
1773
+ # <<-HERE + "rest"
1774
+ # content
1775
+ # HERE
1776
+ # ```
1777
+ #
1778
+ # @return [Loc]
1779
+ attr_reader :expression_l
1780
+ end
1781
+
1782
+ # Represents an `if` statement (i.e. `if foo; bar; else; baz; end`)
1783
+ class If < Node
1784
+ # Condition given to the `if` statement, `Lvar("a")` for `if a; b; else; c; end`
1785
+ #
1786
+ # @return [Node]
1787
+ attr_reader :cond
1788
+ # True-branch of the `if` statement, `Lvar("b")` for `if a; b; else; c; end`
1789
+ #
1790
+ # @return [Node, nil]
1791
+ attr_reader :if_true
1792
+ # False-branch of the `if` statement, `Lvar("c")` for `if a; b; else; c; end`
1793
+ #
1794
+ # @return [Node, nil]
1795
+ attr_reader :if_false
1796
+ # Location of the `if` keyword
1797
+ #
1798
+ # ```text
1799
+ # if foo; end
1800
+ # ~~
1801
+ # ```
1802
+ #
1803
+ # @return [Loc]
1804
+ attr_reader :keyword_l
1805
+ # Location of the `then` keyword
1806
+ #
1807
+ # ```text
1808
+ # if foo then; end
1809
+ # ~~~~
1810
+ # ```
1811
+ #
1812
+ # `None` if `then` keyword is omitted
1813
+ #
1814
+ # @return [Loc]
1815
+ attr_reader :begin_l
1816
+ # Location of the `else` keyword
1817
+ #
1818
+ # ```text
1819
+ # if foo; else; end
1820
+ # ~~~~
1821
+ # ```
1822
+ #
1823
+ # `None` if there's no `else` branch
1824
+ #
1825
+ # @return [Loc, nil]
1826
+ attr_reader :else_l
1827
+ # Location of the `end` keyword
1828
+ #
1829
+ # ```text
1830
+ # if foo; end
1831
+ # ~~~
1832
+ # ```
1833
+ #
1834
+ # @return [Loc, nil]
1835
+ attr_reader :end_l
1836
+ # Location of the full expression
1837
+ #
1838
+ # ```text
1839
+ # if a then; b; else; c end
1840
+ # ~~~~~~~~~~~~~~~~~~~~~~~~~
1841
+ # ```
1842
+ #
1843
+ # @return [Loc]
1844
+ attr_reader :expression_l
1845
+ end
1846
+
1847
+ # Represents an `if` guard used in pattern matching (i.e. `case foo; in pattern if guard; end`)
1848
+ class IfGuard < Node
1849
+ # Condition of the guard, `Lvar("foo")` in `in pattern if guard`
1850
+ #
1851
+ # @return [Node]
1852
+ attr_reader :cond
1853
+ # Location of the `if` keyword
1854
+ #
1855
+ # ```text
1856
+ # case foo; in pattern if cond; end
1857
+ # ~~
1858
+ # ```
1859
+ #
1860
+ # @return [Loc]
1861
+ attr_reader :keyword_l
1862
+ # Location of the full expression
1863
+ #
1864
+ # ```text
1865
+ # case foo; in pattern if cond; end
1866
+ # ~~~~~~~
1867
+ # ```
1868
+ #
1869
+ # @return [Loc]
1870
+ attr_reader :expression_l
1871
+ end
1872
+
1873
+ # Represents inclusive flip-flop (i.e. in `if foo..bar; end`)
1874
+ class IFlipFlop < Node
1875
+ # Left part of the flip-flop. `None` if based on a range without begin (`..bar`)
1876
+ #
1877
+ # @return [Node, nil]
1878
+ attr_reader :left
1879
+ # Right part of the flip-flop. `None` if based on a range without end (`foo..`)
1880
+ #
1881
+ # @return [Node, nil]
1882
+ attr_reader :right
1883
+ # Location of the `..` operator
1884
+ #
1885
+ # ```text
1886
+ # if foo..bar; end
1887
+ # ~~
1888
+ # ```
1889
+ #
1890
+ # @return [Loc]
1891
+ attr_reader :operator_l
1892
+ # Location of the full expression
1893
+ #
1894
+ # ```text
1895
+ # if foo..bar; end
1896
+ # ~~~~~~~~
1897
+ # ```
1898
+ #
1899
+ # @return [Loc]
1900
+ attr_reader :expression_l
1901
+ end
1902
+
1903
+ # Represents an `if`/`unless` modifier (i.e. `stmt if cond`)
1904
+ class IfMod < Node
1905
+ # Condition of the modifier
1906
+ #
1907
+ # @return [Node]
1908
+ attr_reader :cond
1909
+ # True-branch of the modifier.
1910
+ #
1911
+ # Always set for `if` modifier.
1912
+ # Always `None` for `unless` modifier.
1913
+ #
1914
+ # @return [Node, nil]
1915
+ attr_reader :if_true
1916
+ # False-branch of the modifier.
1917
+ #
1918
+ # Always set for `unless` modifier.
1919
+ # Always `None` for `if` modifier.
1920
+ #
1921
+ # @return [Node, nil]
1922
+ attr_reader :if_false
1923
+ # Location of the `if`/`unless` keyword
1924
+ #
1925
+ # ```text
1926
+ # stmt if cond
1927
+ # ~~
1928
+ #
1929
+ # stmt unless cond
1930
+ # ~~~~~~
1931
+ # ```
1932
+ #
1933
+ # @return [Loc]
1934
+ attr_reader :keyword_l
1935
+ # Location of the full expression
1936
+ #
1937
+ # ```text
1938
+ # stmt if cond
1939
+ # ~~~~~~~~~~~~
1940
+ #
1941
+ # stmt unless cond
1942
+ # ~~~~~~~~~~~~~~~~
1943
+ # ```
1944
+ #
1945
+ # @return [Loc]
1946
+ attr_reader :expression_l
1947
+ end
1948
+
1949
+ # Represents ternary `if` statement (i.e. `cond ? if_true : if_false`)
1950
+ class IfTernary < Node
1951
+ # Condition of the `if` statement
1952
+ #
1953
+ # @return [Node]
1954
+ attr_reader :cond
1955
+ # True-branch
1956
+ #
1957
+ # @return [Node]
1958
+ attr_reader :if_true
1959
+ # True-branch
1960
+ #
1961
+ # @return [Node]
1962
+ attr_reader :if_false
1963
+ # Location of the `?` operator
1964
+ #
1965
+ # ```text
1966
+ # cond ? if_true : if_false
1967
+ # ~
1968
+ # ```
1969
+ #
1970
+ # @return [Loc]
1971
+ attr_reader :question_l
1972
+ # Location of the `:` operator
1973
+ #
1974
+ # ```text
1975
+ # cond ? if_true : if_false
1976
+ # ~
1977
+ # ```
1978
+ #
1979
+ # @return [Loc]
1980
+ attr_reader :colon_l
1981
+ # Location of the full expression
1982
+ #
1983
+ # ```text
1984
+ # cond ? if_true : if_false
1985
+ # ~~~~~~~~~~~~~~~~~~~~~~~~~
1986
+ # ```
1987
+ #
1988
+ # @return [Loc]
1989
+ attr_reader :expression_l
1990
+ end
1991
+
1992
+ # Represents indexing operation (i.e. `foo[1,2,3]`)
1993
+ class Index < Node
1994
+ # Receiver of indexing
1995
+ #
1996
+ # @return [Node]
1997
+ attr_reader :recv
1998
+ # A list of indexes
1999
+ #
2000
+ # @return [::Array<Node>]
2001
+ attr_reader :indexes
2002
+ # Location of open bracket
2003
+ #
2004
+ # ```text
2005
+ # foo[1, 2, 3]
2006
+ # ~
2007
+ # ```
2008
+ #
2009
+ # @return [Loc]
2010
+ attr_reader :begin_l
2011
+ # Location of closing bracket
2012
+ #
2013
+ # ```text
2014
+ # foo[1, 2, 3]
2015
+ # ~
2016
+ # ```
2017
+ #
2018
+ # @return [Loc]
2019
+ attr_reader :end_l
2020
+ # Location of the full expression
2021
+ #
2022
+ # ```text
2023
+ # foo[1, 2, 3]
2024
+ # ~~~~~~~~~~~~
2025
+ # ```
2026
+ #
2027
+ # @return [Loc]
2028
+ attr_reader :expression_l
2029
+ end
2030
+
2031
+ # Represents assignment using indexing operation (i.e. `foo[1, 2, 3] = bar`)
2032
+ class IndexAsgn < Node
2033
+ # Receiver of the indexing
2034
+ #
2035
+ # @return [Node]
2036
+ attr_reader :recv
2037
+ # A list of indexes
2038
+ #
2039
+ # @return [::Array<Node>]
2040
+ attr_reader :indexes
2041
+ # Value that is assigned
2042
+ #
2043
+ # `None` if assignment is a part of the multi-assignment.
2044
+ # In such case `value` belongs to `Masgn` node.
2045
+ #
2046
+ # @return [Node, nil]
2047
+ attr_reader :value
2048
+ # Location of open bracket
2049
+ #
2050
+ # ```text
2051
+ # foo[1, 2, 3] = bar
2052
+ # ~
2053
+ # ```
2054
+ #
2055
+ # @return [Loc]
2056
+ attr_reader :begin_l
2057
+ # Location of closing bracket
2058
+ #
2059
+ # ```text
2060
+ # foo[1, 2, 3] = bar
2061
+ # ~
2062
+ # ```
2063
+ #
2064
+ # @return [Loc]
2065
+ attr_reader :end_l
2066
+ # Location of the `=` operator
2067
+ #
2068
+ # ```text
2069
+ # foo[1, 2, 3] = bar
2070
+ # ~
2071
+ # ```
2072
+ #
2073
+ # `None` if assignment is a part of the multi-assignment.
2074
+ # In such case operator `=` belongs to `Masgn` node.
2075
+ #
2076
+ # @return [Loc, nil]
2077
+ attr_reader :operator_l
2078
+ # Location of the full expression
2079
+ #
2080
+ # ```text
2081
+ # foo[1, 2, 3] = bar
2082
+ # ~~~~~~~~~~~~~~~~~~
2083
+ # ```
2084
+ #
2085
+ # @return [Loc]
2086
+ attr_reader :expression_l
2087
+ end
2088
+
2089
+ # Represents an `in pattern` branch of the pattern matching
2090
+ class InPattern < Node
2091
+ # Value that is used for matching
2092
+ #
2093
+ # @return [Node]
2094
+ attr_reader :pattern
2095
+ # Guard that is used for matching
2096
+ #
2097
+ # Optional, so can be `None`
2098
+ #
2099
+ # @return [Node, nil]
2100
+ attr_reader :guard
2101
+ # Body of the branch that is invoked if value matches pattern
2102
+ #
2103
+ # @return [Node, nil]
2104
+ attr_reader :body
2105
+ # Location of the `in` keyword
2106
+ #
2107
+ # ```text
2108
+ # case value; in pattern; end
2109
+ # ~~
2110
+ # ```
2111
+ #
2112
+ # @return [Loc]
2113
+ attr_reader :keyword_l
2114
+ # Location of the `then` keyword
2115
+ #
2116
+ # ```text
2117
+ # case value; in pattern then; end
2118
+ # ~~~~
2119
+ # ```
2120
+ #
2121
+ # @return [Loc]
2122
+ attr_reader :begin_l
2123
+ # Location of the full expression
2124
+ #
2125
+ # ```text
2126
+ # case value; in pattern then; 42; end
2127
+ # ~~~~~~~~~~~~~~~~~~~
2128
+ # ```
2129
+ #
2130
+ # @return [Loc]
2131
+ attr_reader :expression_l
2132
+ end
2133
+
2134
+ # Represents an integer literal (i.e. `42`)
2135
+ class Int < Node
2136
+ # String value of the literal, `String("42")` for `42`
2137
+ #
2138
+ # @return [String]
2139
+ attr_reader :value
2140
+ # Location of unary `-` (but not `+`)
2141
+ #
2142
+ # ```text
2143
+ # -42
2144
+ # ~
2145
+ # ```
2146
+ #
2147
+ # @return [Loc, nil]
2148
+ attr_reader :operator_l
2149
+ # Location of the full expression
2150
+ #
2151
+ # ```text
2152
+ # -42
2153
+ # ~~~
2154
+ # ```
2155
+ #
2156
+ # @return [Loc]
2157
+ attr_reader :expression_l
2158
+ end
2159
+
2160
+ # Represents inclusive range (i.e. `2..4`)
2161
+ class Irange < Node
2162
+ # Begin of the range, `None` if range has no `begin` (i.e. `..4`)
2163
+ #
2164
+ # @return [Node, nil]
2165
+ attr_reader :left
2166
+ # End of the range, `None` if range has no `end` (i.e. `2..`)
2167
+ #
2168
+ # @return [Node, nil]
2169
+ attr_reader :right
2170
+ # Location of the `..` operator
2171
+ #
2172
+ # ```text
2173
+ # 2..4
2174
+ # ~~
2175
+ # ```
2176
+ #
2177
+ # @return [Loc]
2178
+ attr_reader :operator_l
2179
+ # Location of the full expression
2180
+ #
2181
+ # ```text
2182
+ # 2..4
2183
+ # ~~~~
2184
+ # ```
2185
+ #
2186
+ # @return [Loc]
2187
+ attr_reader :expression_l
2188
+ end
2189
+
2190
+ # Represents access to instance variable (i.e. `@foo`)
2191
+ class Ivar < Node
2192
+ # Name of the instance variable, `String("@foo")` in `@foo`
2193
+ #
2194
+ # @return [String]
2195
+ attr_reader :name
2196
+ # Location of the full expression
2197
+ #
2198
+ # ```text
2199
+ # @foo
2200
+ # ~~~~
2201
+ # ```
2202
+ #
2203
+ # @return [Loc]
2204
+ attr_reader :expression_l
2205
+ end
2206
+
2207
+ # Represents instance variable assignment (i.e `@foo = 42`)
2208
+ class Ivasgn < Node
2209
+ # Name of the instance variable, `String("@foo")` in `@foo = 42`
2210
+ #
2211
+ # @return [String]
2212
+ attr_reader :name
2213
+ # Value that is assigned to instance variable.
2214
+ #
2215
+ # `None` if instance variable assignment is a part of the multi-assignment.
2216
+ # In such case `value` is a part of the `Masgn` node.
2217
+ #
2218
+ # @return [Node, nil]
2219
+ attr_reader :value
2220
+ # Location of the instance variable name.
2221
+ #
2222
+ # ```text
2223
+ # @foo = 1
2224
+ # ~~~~
2225
+ # ```
2226
+ #
2227
+ # @return [Loc]
2228
+ attr_reader :name_l
2229
+ # Location of the `=` operator.
2230
+ #
2231
+ # ```text
2232
+ # @foo = 1
2233
+ # ~
2234
+ # ```
2235
+ #
2236
+ # `None` if instance variable assignment is a part of the multi-assignment.
2237
+ # In such case `value` is a part of the `Masgn` node.
2238
+ #
2239
+ # @return [Loc, nil]
2240
+ attr_reader :operator_l
2241
+ # Location of the full expression
2242
+ #
2243
+ # ```text
2244
+ # @foo = 42
2245
+ # ~~~~~~~~~
2246
+ # ```
2247
+ #
2248
+ # @return [Loc]
2249
+ attr_reader :expression_l
2250
+ end
2251
+
2252
+ # Represents required keyword argument (i.e. `foo` in `def m(foo:); end`)
2253
+ class Kwarg < Node
2254
+ # Name of the keyword argument
2255
+ #
2256
+ # @return [String]
2257
+ attr_reader :name
2258
+ # Location of the name
2259
+ #
2260
+ # ```text
2261
+ # def foo(bar:); end
2262
+ # ~~~
2263
+ # ```
2264
+ #
2265
+ # @return [Loc]
2266
+ attr_reader :name_l
2267
+ # Location of the full expression
2268
+ #
2269
+ # ```text
2270
+ # def foo(bar:); end
2271
+ # ~~~~
2272
+ # ```
2273
+ #
2274
+ # @return [Loc]
2275
+ attr_reader :expression_l
2276
+ end
2277
+
2278
+ # Represents kwargs that are given to a method call, super or yield (i.e. `foo(bar: 1)`)
2279
+ class Kwargs < Node
2280
+ # A list of key-value pairs
2281
+ #
2282
+ # @return [::Array<Node>]
2283
+ attr_reader :pairs
2284
+ # Location of the full expression
2285
+ #
2286
+ # ```text
2287
+ # foo(bar: 1)
2288
+ # ~~~~~~
2289
+ # ```
2290
+ #
2291
+ # @return [Loc]
2292
+ attr_reader :expression_l
2293
+ end
2294
+
2295
+ # Represents an explicit `begin; end` block.
2296
+ #
2297
+ # The reason why it's different is that
2298
+ # ```text
2299
+ # begin; foo; end while cond
2300
+ # ```
2301
+ # is a post-while loop (same with post-until loop)
2302
+ class KwBegin < Node
2303
+ # A list of statements
2304
+ #
2305
+ # @return [::Array<Node>]
2306
+ attr_reader :statements
2307
+ # Location of the `begin` keyword
2308
+ #
2309
+ # ```text
2310
+ # begin; foo; end
2311
+ # ~~~~~
2312
+ # ```
2313
+ #
2314
+ # @return [Loc, nil]
2315
+ attr_reader :begin_l
2316
+ # Location of the `end` keyword
2317
+ #
2318
+ # ```text
2319
+ # begin; foo; end
2320
+ # ~~~
2321
+ # ```
2322
+ #
2323
+ # @return [Loc, nil]
2324
+ attr_reader :end_l
2325
+ # Location of the full expression
2326
+ #
2327
+ # ```text
2328
+ # begin; foo; bar
2329
+ # ~~~~~~~~~~~~~~~
2330
+ # ```
2331
+ #
2332
+ # @return [Loc]
2333
+ attr_reader :expression_l
2334
+ end
2335
+
2336
+ # Represents an special argument that rejects all keyword arguments (i.e. `def m(**nil); end`)
2337
+ class Kwnilarg < Node
2338
+ # Location of the `nil`
2339
+ #
2340
+ # ```text
2341
+ # def m(**nil); end
2342
+ # ~~~
2343
+ # ```
2344
+ #
2345
+ # @return [Loc]
2346
+ attr_reader :name_l
2347
+ # Location of the `nil`
2348
+ #
2349
+ # ```text
2350
+ # def m(**nil); end
2351
+ # ~~~~~
2352
+ # ```
2353
+ #
2354
+ # @return [Loc]
2355
+ attr_reader :expression_l
2356
+ end
2357
+
2358
+ # Represents an optional keyword argument (i.e. `foo` in `def m(foo: 42); end`)
2359
+ class Kwoptarg < Node
2360
+ # Name of the optional keyword argument
2361
+ #
2362
+ # @return [String]
2363
+ attr_reader :name
2364
+ # Default value of the optional keyword argument
2365
+ #
2366
+ # @return [Node]
2367
+ attr_reader :default
2368
+ # Location of the argument name
2369
+ #
2370
+ # ```text
2371
+ # def m(foo: 1); end
2372
+ # ~~~
2373
+ # ```
2374
+ #
2375
+ # @return [Loc]
2376
+ attr_reader :name_l
2377
+ # Location of the argument name
2378
+ #
2379
+ # ```text
2380
+ # def m(foo: 1); end
2381
+ # ~~~~~~
2382
+ # ```
2383
+ #
2384
+ # @return [Loc]
2385
+ attr_reader :expression_l
2386
+ end
2387
+
2388
+ # Represents a keyword rest argument (i.e. `foo` in `def m(**foo); end`)
2389
+ class Kwrestarg < Node
2390
+ # Name of the keyword rest argument, `String("foo")` in `def m(**foo); end`.
2391
+ #
2392
+ # `None` if argument has no name (`def m(**); end`)
2393
+ #
2394
+ # @return [String, nil]
2395
+ attr_reader :name
2396
+ # Location of the `**` operator
2397
+ #
2398
+ # ```text
2399
+ # def m(**foo); end
2400
+ # ~~
2401
+ # ```
2402
+ #
2403
+ # @return [Loc]
2404
+ attr_reader :operator_l
2405
+ # Location of the argument name
2406
+ #
2407
+ # ```text
2408
+ # def m(**foo); end
2409
+ # ~~~
2410
+ # ```
2411
+ #
2412
+ # `None` if argument has no name (`def m(**); end`)
2413
+ #
2414
+ # @return [Loc, nil]
2415
+ attr_reader :name_l
2416
+ # Location of the full expression
2417
+ #
2418
+ # ```text
2419
+ # def m(**foo); end
2420
+ # ~~~~~
2421
+ # ```
2422
+ #
2423
+ # @return [Loc]
2424
+ attr_reader :expression_l
2425
+ end
2426
+
2427
+ # Represents a keyword arguments splat (i.e. `**bar` in a call like `foo(**bar)`)
2428
+ class Kwsplat < Node
2429
+ # Value that is converted into a `Hash` using `**`
2430
+ #
2431
+ # @return [Node]
2432
+ attr_reader :value
2433
+ # Location of the `**` operator
2434
+ #
2435
+ # ```text
2436
+ # foo(**bar)
2437
+ # ~~
2438
+ # ```
2439
+ #
2440
+ # @return [Loc]
2441
+ attr_reader :operator_l
2442
+ # Location of the full expression
2443
+ #
2444
+ # ```text
2445
+ # foo(**bar)
2446
+ # ~~~~~
2447
+ # ```
2448
+ #
2449
+ # @return [Loc]
2450
+ attr_reader :expression_l
2451
+ end
2452
+
2453
+ # Represents a lambda call using `->` (i.e. `-> {}`)
2454
+ #
2455
+ # Note that `Lambda` is a part of the `Block`, not other way around.
2456
+ class Lambda < Node
2457
+ # Location of the `->`
2458
+ #
2459
+ # ```text
2460
+ # -> {}
2461
+ # ~~
2462
+ # ```
2463
+ #
2464
+ # @return [Loc]
2465
+ attr_reader :expression_l
2466
+ end
2467
+
2468
+ # Represents a special `__LINE__` literal
2469
+ class Line < Node
2470
+ # Location of the `__LINE__` literal
2471
+ #
2472
+ # ```text
2473
+ # __LINE__
2474
+ # ~~~~~~~~
2475
+ # ```
2476
+ #
2477
+ # @return [Loc]
2478
+ attr_reader :expression_l
2479
+ end
2480
+
2481
+ # Represents access to a local variable (i.e. `foo`)
2482
+ #
2483
+ # Parser knows that it's a local variable because:
2484
+ # 1. there was an assignment to this variable **before** accessing it
2485
+ # 2. it's an argument of the current method / block
2486
+ # 3. it's been implicitly declared by `MatchWithLvasgn` node
2487
+ #
2488
+ # Otherwise it's a method call (see `Send`)
2489
+ class Lvar < Node
2490
+ # Name of the local variable
2491
+ #
2492
+ # @return [String]
2493
+ attr_reader :name
2494
+ # Location of the local variable
2495
+ #
2496
+ # ```text
2497
+ # foo
2498
+ # ~~~
2499
+ # ```
2500
+ #
2501
+ # @return [Loc]
2502
+ attr_reader :expression_l
2503
+ end
2504
+
2505
+ # Represents local variable assignment (i.e. `foo = 42`)
2506
+ class Lvasgn < Node
2507
+ # Name of the local variable
2508
+ #
2509
+ # @return [String]
2510
+ attr_reader :name
2511
+ # Value that is assigned to a local variable
2512
+ #
2513
+ # @return [Node, nil]
2514
+ attr_reader :value
2515
+ # Location of the local variable name
2516
+ #
2517
+ # ```text
2518
+ # foo = 42
2519
+ # ~~~
2520
+ # ```
2521
+ #
2522
+ # @return [Loc]
2523
+ attr_reader :name_l
2524
+ # Location of the `=` operator
2525
+ #
2526
+ # ```text
2527
+ # foo = 42
2528
+ # ~
2529
+ # ```
2530
+ #
2531
+ # `None` if local variable assignment is a part of the multi-assignment.
2532
+ # In such case `value` is a part of the `Masgn` node.
2533
+ #
2534
+ # @return [Loc, nil]
2535
+ attr_reader :operator_l
2536
+ # Location of the full expression
2537
+ #
2538
+ # ```text
2539
+ # foo = 42
2540
+ # ~~~~~~~~
2541
+ # ```
2542
+ #
2543
+ # @return [Loc]
2544
+ attr_reader :expression_l
2545
+ end
2546
+
2547
+ # Represents mass-assignment (i.e. `foo, bar = 1, 2`)
2548
+ class Masgn < Node
2549
+ # Left hand statement of the assignment
2550
+ #
2551
+ # @return [Node]
2552
+ attr_reader :lhs
2553
+ # Left hand statement of the assignment
2554
+ #
2555
+ # @return [Node]
2556
+ attr_reader :rhs
2557
+ # Location of the `=` operator
2558
+ #
2559
+ # ```text
2560
+ # foo, bar = 1, 2
2561
+ # ~
2562
+ # ```
2563
+ #
2564
+ # @return [Loc]
2565
+ attr_reader :operator_l
2566
+ # Location of the full expression
2567
+ #
2568
+ # ```text
2569
+ # foo, bar = 1, 2
2570
+ # ~~~~~~~~~~~~~~~
2571
+ # ```
2572
+ #
2573
+ # @return [Loc]
2574
+ attr_reader :expression_l
2575
+ end
2576
+
2577
+ # Represents pattern matching using one of the given patterns (i.e. `foo in 1 | 2`)
2578
+ class MatchAlt < Node
2579
+ # Left pattern
2580
+ #
2581
+ # @return [Node]
2582
+ attr_reader :lhs
2583
+ # Right pattern
2584
+ #
2585
+ # @return [Node]
2586
+ attr_reader :rhs
2587
+ # Location of the `|` operator
2588
+ #
2589
+ # ```text
2590
+ # foo in 1 | 2
2591
+ # ~
2592
+ # ```
2593
+ #
2594
+ # @return [Loc]
2595
+ attr_reader :operator_l
2596
+ # Location of the full expression
2597
+ #
2598
+ # ```text
2599
+ # foo in 1 | 2
2600
+ # ~~~~~
2601
+ # ```
2602
+ #
2603
+ # @return [Loc]
2604
+ attr_reader :expression_l
2605
+ end
2606
+
2607
+ # Represents matching with renaming into specified local variable (i.e. `case 1; in Integer => a; end`)
2608
+ class MatchAs < Node
2609
+ # Pattern that is used for matching
2610
+ #
2611
+ # @return [Node]
2612
+ attr_reader :value
2613
+ # Variable that is assigned if matched (see `MatchVar` node)
2614
+ #
2615
+ # @return [Node]
2616
+ attr_reader :as
2617
+ # Location of the `=>` operator
2618
+ #
2619
+ # ```text
2620
+ # case 1; in Integer => a; end
2621
+ # ~~
2622
+ # ```
2623
+ #
2624
+ # @return [Loc]
2625
+ attr_reader :operator_l
2626
+ # Location of the full expression
2627
+ #
2628
+ # ```text
2629
+ # case 1; in Integer => a; end
2630
+ # ~~~~~~~~~~~~
2631
+ # ```
2632
+ #
2633
+ # @return [Loc]
2634
+ attr_reader :expression_l
2635
+ end
2636
+
2637
+ # Represents implicit matching using `if /regex/`
2638
+ #
2639
+ # ```text
2640
+ # if /.*/
2641
+ # puts 'true'
2642
+ # else
2643
+ # puts 'false'
2644
+ # end
2645
+ # ```
2646
+ # Prints "false".
2647
+ #
2648
+ # Under the hood this construction matches regex against `$_`, so the following works:
2649
+ # ```text
2650
+ # $_ = 'match_me'
2651
+ # if /match_me/
2652
+ # puts 'true'
2653
+ # else
2654
+ # puts 'false'
2655
+ # end
2656
+ # ```
2657
+ # this code prints "true".
2658
+ class MatchCurrentLine < Node
2659
+ # Given regex
2660
+ #
2661
+ # @return [Node]
2662
+ attr_reader :re
2663
+ # Location of the regex
2664
+ #
2665
+ # ```text
2666
+ # if /re/; end
2667
+ # ~~~~
2668
+ # ```
2669
+ #
2670
+ # Technically this location is redundant, but keeping it is the only way to
2671
+ # have the same interface for all nodes.
2672
+ #
2673
+ # @return [Loc]
2674
+ attr_reader :expression_l
2675
+ end
2676
+
2677
+ # Represents empty hash pattern that is used in pattern matching (i.e. `in **nil`)
2678
+ class MatchNilPattern < Node
2679
+ # Location of the `**` operator
2680
+ #
2681
+ # ```text
2682
+ # in **nil
2683
+ # ~~
2684
+ # ```
2685
+ #
2686
+ # @return [Loc]
2687
+ attr_reader :operator_l
2688
+ # Location of the name
2689
+ #
2690
+ # ```text
2691
+ # in **nil
2692
+ # ~~~
2693
+ # ```
2694
+ #
2695
+ # @return [Loc]
2696
+ attr_reader :name_l
2697
+ # Location of the full expression
2698
+ #
2699
+ # ```text
2700
+ # in **nil
2701
+ # ~~~~~
2702
+ # ```
2703
+ #
2704
+ # @return [Loc]
2705
+ attr_reader :expression_l
2706
+ end
2707
+
2708
+ # Represents a one-line pattern matching that can throw an error (i.e. `foo => pattern`)
2709
+ class MatchPattern < Node
2710
+ # Value that is used for matching
2711
+ #
2712
+ # @return [Node]
2713
+ attr_reader :value
2714
+ # Pattern that is used for matching
2715
+ #
2716
+ # @return [Node]
2717
+ attr_reader :pattern
2718
+ # Location of the `=>` operator
2719
+ #
2720
+ # ```text
2721
+ # foo => pattern
2722
+ # ~~
2723
+ # ```
2724
+ #
2725
+ # @return [Loc]
2726
+ attr_reader :operator_l
2727
+ # Location of the full expression
2728
+ #
2729
+ # ```text
2730
+ # foo => pattern
2731
+ # ~~~~~~~~~~~~~~
2732
+ # ```
2733
+ #
2734
+ # @return [Loc]
2735
+ attr_reader :expression_l
2736
+ end
2737
+
2738
+ # Represents a one-line pattern matching that never throws but returns true/false (i.e. `foo in pattern`)
2739
+ class MatchPatternP < Node
2740
+ # Value that is used for matching
2741
+ #
2742
+ # @return [Node]
2743
+ attr_reader :value
2744
+ # Pattern that is used for matching
2745
+ #
2746
+ # @return [Node]
2747
+ attr_reader :pattern
2748
+ # Location of the `in` operator
2749
+ #
2750
+ # ```text
2751
+ # foo in pattern
2752
+ # ~~
2753
+ # ```
2754
+ #
2755
+ # @return [Loc]
2756
+ attr_reader :operator_l
2757
+ # Location of the full expression
2758
+ #
2759
+ # ```text
2760
+ # foo in pattern
2761
+ # ~~~~~~~~~~~~~~
2762
+ # ```
2763
+ #
2764
+ # @return [Loc]
2765
+ attr_reader :expression_l
2766
+ end
2767
+
2768
+ # Represents a wildcard pattern used in pattern matching (i.e. `in *foo`)
2769
+ class MatchRest < Node
2770
+ # Name of the variable name
2771
+ #
2772
+ # `None` if there's no name (i.e. `in *`)
2773
+ #
2774
+ # @return [Node, nil]
2775
+ attr_reader :name
2776
+ # Location of the `*` operator
2777
+ #
2778
+ # ```text
2779
+ # case foo; in *bar; end
2780
+ # ~
2781
+ # ```
2782
+ #
2783
+ # @return [Loc]
2784
+ attr_reader :operator_l
2785
+ # Location of the `*` operator
2786
+ #
2787
+ # ```text
2788
+ # case foo; in *bar; end
2789
+ # ~~~~
2790
+ # ```
2791
+ #
2792
+ # @return [Loc]
2793
+ attr_reader :expression_l
2794
+ end
2795
+
2796
+ # Represents matching with assignment into a local variable (i.e. `pattern => var`)
2797
+ class MatchVar < Node
2798
+ # Name of the variable that is assigned if matching succeeds
2799
+ #
2800
+ # @return [String]
2801
+ attr_reader :name
2802
+ # Location of the name
2803
+ #
2804
+ # ```text
2805
+ # case foo; in pattern => bar; end
2806
+ # ~~~
2807
+ # ```
2808
+ #
2809
+ # **Note** it can also be produced by a hash pattern
2810
+ #
2811
+ # ```text
2812
+ # case foo; in { a: }; end
2813
+ # ~
2814
+ # ```
2815
+ #
2816
+ # @return [Loc]
2817
+ attr_reader :name_l
2818
+ # Location of the full expression
2819
+ #
2820
+ # ```text
2821
+ # case foo; in pattern => bar; end
2822
+ # ~~~
2823
+ # ```
2824
+ #
2825
+ # **Note** it can also be produced by a hash pattern
2826
+ #
2827
+ # ```text
2828
+ # case foo; in { a: }; end
2829
+ # ~~
2830
+ # ```
2831
+ #
2832
+ # @return [Loc]
2833
+ attr_reader :expression_l
2834
+ end
2835
+
2836
+ # Represents matching a regex that produces local variables (i.e. `/(?<match>bar)/ =~ 'bar'`)
2837
+ #
2838
+ # Each named group in regex declares a local variable.
2839
+ class MatchWithLvasgn < Node
2840
+ # Regex that is used for matching
2841
+ #
2842
+ # @return [Node]
2843
+ attr_reader :re
2844
+ # Value that is used for matching
2845
+ #
2846
+ # @return [Node]
2847
+ attr_reader :value
2848
+ # Location of the `=~` operatir
2849
+ #
2850
+ # ```text
2851
+ # /(?<match>bar)/ =~ 'bar'
2852
+ # ~~
2853
+ # ```
2854
+ #
2855
+ # @return [Loc]
2856
+ attr_reader :operator_l
2857
+ # Location of the full expression
2858
+ #
2859
+ # ```text
2860
+ # /(?<match>bar)/ =~ 'bar'
2861
+ # ~~~~~~~~~~~~~~~~~~~~~~~~
2862
+ # ```
2863
+ #
2864
+ # @return [Loc]
2865
+ attr_reader :expression_l
2866
+ end
2867
+
2868
+ # Represents left hand statement of the mass-assignment (i.e. `foo, bar` in `foo, bar = 1, 2`)
2869
+ class Mlhs < Node
2870
+ # A list of items that are assigned
2871
+ #
2872
+ # @return [::Array<Node>]
2873
+ attr_reader :items
2874
+ # Location of the open parenthesis
2875
+ #
2876
+ # ```text
2877
+ # (a, b) = 1, 2
2878
+ # ~
2879
+ # ```
2880
+ #
2881
+ # `None` if there are no parentheses
2882
+ #
2883
+ # @return [Loc, nil]
2884
+ attr_reader :begin_l
2885
+ # Location of the closing parenthesis
2886
+ #
2887
+ # ```text
2888
+ # (a, b) = 1, 2
2889
+ # ~
2890
+ # ```
2891
+ #
2892
+ # `None` if there are no parentheses
2893
+ #
2894
+ # @return [Loc, nil]
2895
+ attr_reader :end_l
2896
+ # Location of the full expression
2897
+ #
2898
+ # ```text
2899
+ # (a, b) = 1, 2
2900
+ # ~~~~~~
2901
+ # ```
2902
+ #
2903
+ # @return [Loc]
2904
+ attr_reader :expression_l
2905
+ end
2906
+
2907
+ # Represents module declaration using `module` keyword
2908
+ class Module < Node
2909
+ # Name of the module
2910
+ #
2911
+ # @return [Node]
2912
+ attr_reader :name
2913
+ # Body of the module
2914
+ #
2915
+ # `None` if module has no body
2916
+ #
2917
+ # @return [Node, nil]
2918
+ attr_reader :body
2919
+ # Location of the `module` keyword
2920
+ #
2921
+ # ```text
2922
+ # module M; end
2923
+ # ~~~~~~
2924
+ # ```
2925
+ #
2926
+ # @return [Loc]
2927
+ attr_reader :keyword_l
2928
+ # Location of the `end` keyword
2929
+ #
2930
+ # ```text
2931
+ # module M; end
2932
+ # ~~~
2933
+ # ```
2934
+ #
2935
+ # @return [Loc]
2936
+ attr_reader :end_l
2937
+ # Location of the full expression
2938
+ #
2939
+ # ```text
2940
+ # module M; end
2941
+ # ~~~~~~~~~~~~~
2942
+ # ```
2943
+ #
2944
+ # @return [Loc]
2945
+ attr_reader :expression_l
2946
+ end
2947
+
2948
+ # Represents `next` keyword
2949
+ class Next < Node
2950
+ # Arguments given to `next`
2951
+ #
2952
+ # @return [::Array<Node>]
2953
+ attr_reader :args
2954
+ # Location of the `next` keyword
2955
+ #
2956
+ # ```text
2957
+ # next 42
2958
+ # ~~~~
2959
+ # ```
2960
+ #
2961
+ # @return [Loc]
2962
+ attr_reader :keyword_l
2963
+ # Location of the full expression
2964
+ #
2965
+ # ```text
2966
+ # next(42)
2967
+ # ~~~~~~~~
2968
+ # ```
2969
+ #
2970
+ # @return [Loc]
2971
+ attr_reader :expression_l
2972
+ end
2973
+
2974
+ # Represents `nil` literal
2975
+ class Nil < Node
2976
+ # Location of the `nil` keyword
2977
+ #
2978
+ # ```text
2979
+ # nil
2980
+ # ~~~
2981
+ # ```
2982
+ #
2983
+ # @return [Loc]
2984
+ attr_reader :expression_l
2985
+ end
2986
+
2987
+ # Represents numeric global variable (e.g. `$1`)
2988
+ class NthRef < Node
2989
+ # Name of the variable, `String("1")` for `$1`
2990
+ #
2991
+ # @return [String]
2992
+ attr_reader :name
2993
+ # Location of the full expression
2994
+ #
2995
+ # ```text
2996
+ # $1
2997
+ # ~~
2998
+ # ```
2999
+ #
3000
+ # @return [Loc]
3001
+ attr_reader :expression_l
3002
+ end
3003
+
3004
+ # Represents a block that takes numbered parameters (i.e. `proc { _1 }`)
3005
+ class Numblock < Node
3006
+ # Method call that takes a block
3007
+ #
3008
+ # @return [Node]
3009
+ attr_reader :call
3010
+ # Number of parameters that block takes
3011
+ #
3012
+ # @return [Integer]
3013
+ attr_reader :numargs
3014
+ # Block body
3015
+ #
3016
+ # @return [Node]
3017
+ attr_reader :body
3018
+ # Location of the open brace
3019
+ #
3020
+ # ```text
3021
+ # proc { _1 }
3022
+ # ~
3023
+ # ```
3024
+ #
3025
+ # @return [Loc]
3026
+ attr_reader :begin_l
3027
+ # Location of the closing brace
3028
+ #
3029
+ # ```text
3030
+ # proc { _1 }
3031
+ # ~
3032
+ # ```
3033
+ #
3034
+ # @return [Loc]
3035
+ attr_reader :end_l
3036
+ # Location of the open brace
3037
+ #
3038
+ # ```text
3039
+ # proc { _1 }
3040
+ # ~~~~~~~~~~~
3041
+ # ```
3042
+ #
3043
+ # @return [Loc]
3044
+ attr_reader :expression_l
3045
+ end
3046
+
3047
+ # Represents an operation with assignment (e.g. `a += 1`)
3048
+ class OpAsgn < Node
3049
+ # Left hand statement of the assignment
3050
+ #
3051
+ # @return [Node]
3052
+ attr_reader :recv
3053
+ # Operator, can be one of:
3054
+ # 1. `+=`
3055
+ # 2. `-=`
3056
+ # 3. `*=`
3057
+ # 4. `/=`
3058
+ # 5. `|=`
3059
+ # 6. `&=`
3060
+ # 7. `>>=`
3061
+ # 8. `<<=`
3062
+ # 9. `%=`
3063
+ # 10. `^=`
3064
+ # 11. `**=`
3065
+ #
3066
+ # @return [String]
3067
+ attr_reader :operator
3068
+ # Right hand statement of the assignment
3069
+ #
3070
+ # @return [Node]
3071
+ attr_reader :value
3072
+ # Location of the operator
3073
+ #
3074
+ # ```text
3075
+ # a.b <<= c
3076
+ # ~~~
3077
+ # ```
3078
+ #
3079
+ # @return [Loc]
3080
+ attr_reader :operator_l
3081
+ # Location of the operator
3082
+ #
3083
+ # ```text
3084
+ # a.b <<= c
3085
+ # ~~~~~~~~~
3086
+ # ```
3087
+ #
3088
+ # @return [Loc]
3089
+ attr_reader :expression_l
3090
+ end
3091
+
3092
+ # Represents optional positional argument (i.e. `foo` in `m(foo = 1)`)
3093
+ class Optarg < Node
3094
+ # Name of the argument
3095
+ #
3096
+ # @return [String]
3097
+ attr_reader :name
3098
+ # Default value of the argument
3099
+ #
3100
+ # @return [Node]
3101
+ attr_reader :default
3102
+ # Location of the argument name
3103
+ #
3104
+ # ```text
3105
+ # def m(foo = 1); end
3106
+ # ~~~
3107
+ # ```
3108
+ #
3109
+ # @return [Loc]
3110
+ attr_reader :name_l
3111
+ # Location of the `=` operator
3112
+ #
3113
+ # ```text
3114
+ # def m(foo = 1); end
3115
+ # ~
3116
+ # ```
3117
+ #
3118
+ # @return [Loc]
3119
+ attr_reader :operator_l
3120
+ # Location of the full expression
3121
+ #
3122
+ # ```text
3123
+ # def m(foo = 1); end
3124
+ # ~~~~~~~
3125
+ # ```
3126
+ #
3127
+ # @return [Loc]
3128
+ attr_reader :expression_l
3129
+ end
3130
+
3131
+ # Represents `foo || bar` (or `foo or bar`) statement.
3132
+ class Or < Node
3133
+ # Left hand statement
3134
+ #
3135
+ # @return [Node]
3136
+ attr_reader :lhs
3137
+ # Right hand statement
3138
+ #
3139
+ # @return [Node]
3140
+ attr_reader :rhs
3141
+ # Location of the `||`/`or` operator
3142
+ #
3143
+ # ```text
3144
+ # foo || bar
3145
+ # ~~
3146
+ # ```
3147
+ #
3148
+ # @return [Loc]
3149
+ attr_reader :operator_l
3150
+ # Location of the full expression
3151
+ #
3152
+ # ```text
3153
+ # foo || bar
3154
+ # ~~~~~~~~~~
3155
+ # ```
3156
+ #
3157
+ # @return [Loc]
3158
+ attr_reader :expression_l
3159
+ end
3160
+
3161
+ # Represents `lhs ||= rhs` assignment
3162
+ class OrAsgn < Node
3163
+ # Left hand statement
3164
+ #
3165
+ # @return [Node]
3166
+ attr_reader :recv
3167
+ # Right hand statement
3168
+ #
3169
+ # @return [Node]
3170
+ attr_reader :value
3171
+ # Location of the `||=` operator
3172
+ #
3173
+ # ```text
3174
+ # foo ||= bar
3175
+ # ~~~
3176
+ # ```
3177
+ #
3178
+ # @return [Loc]
3179
+ attr_reader :operator_l
3180
+ # Location of the full expression
3181
+ #
3182
+ # ```text
3183
+ # foo ||= bar
3184
+ # ~~~~~~~~~~~
3185
+ # ```
3186
+ #
3187
+ # @return [Loc]
3188
+ attr_reader :expression_l
3189
+ end
3190
+
3191
+ # Represents a key/value pair (e.g. a part of the `Hash` node)
3192
+ class Pair < Node
3193
+ # Key of the pair
3194
+ #
3195
+ # @return [Node]
3196
+ attr_reader :key
3197
+ # Value of the pair
3198
+ #
3199
+ # @return [Node]
3200
+ attr_reader :value
3201
+ # Location of the `:` or `=>` operator
3202
+ #
3203
+ # ```text
3204
+ # { foo: bar }
3205
+ # ~
3206
+ #
3207
+ # { :foo => bar }
3208
+ # ~~
3209
+ # ```
3210
+ #
3211
+ # @return [Loc]
3212
+ attr_reader :operator_l
3213
+ # Location of the full expression
3214
+ #
3215
+ # ```text
3216
+ # { foo: bar }
3217
+ # ~~~~~~~~
3218
+ #
3219
+ # { :foo => bar }
3220
+ # ~~~~~~~~~~~
3221
+ # ```
3222
+ #
3223
+ # @return [Loc]
3224
+ attr_reader :expression_l
3225
+ end
3226
+
3227
+ # Represents a pattern based on a "pinned" variable (e.g. `^foo`)
3228
+ class Pin < Node
3229
+ # Variable that is pinned
3230
+ #
3231
+ # @return [Node]
3232
+ attr_reader :var
3233
+ # Location of the `^` operator
3234
+ #
3235
+ # ```text
3236
+ # case foo; in ^bar; end
3237
+ # ~
3238
+ # ```
3239
+ #
3240
+ # @return [Loc]
3241
+ attr_reader :selector_l
3242
+ # Location of the full expression
3243
+ #
3244
+ # ```text
3245
+ # case foo; in ^bar; end
3246
+ # ~~~~
3247
+ # ```
3248
+ #
3249
+ # @return [Loc]
3250
+ attr_reader :expression_l
3251
+ end
3252
+
3253
+ # Represents `END { .. }` statement
3254
+ class Postexe < Node
3255
+ # Body of the block
3256
+ #
3257
+ # @return [Node, nil]
3258
+ attr_reader :body
3259
+ # Location of the `END` keyword
3260
+ #
3261
+ # ```text
3262
+ # END { 42 }
3263
+ # ~~~
3264
+ # ```
3265
+ #
3266
+ # @return [Loc]
3267
+ attr_reader :keyword_l
3268
+ # Location of the open parenthesis
3269
+ #
3270
+ # ```text
3271
+ # END { 42 }
3272
+ # ~
3273
+ # ```
3274
+ #
3275
+ # @return [Loc]
3276
+ attr_reader :begin_l
3277
+ # Location of the closing parenthesis
3278
+ #
3279
+ # ```text
3280
+ # END { 42 }
3281
+ # ~
3282
+ # ```
3283
+ #
3284
+ # @return [Loc]
3285
+ attr_reader :end_l
3286
+ # Location of the full expression
3287
+ #
3288
+ # ```text
3289
+ # END { 42 }
3290
+ # ~~~~~~~~~~
3291
+ # ```
3292
+ #
3293
+ # @return [Loc]
3294
+ attr_reader :expression_l
3295
+ end
3296
+
3297
+ # Represents `BEGIN { ... }` statement
3298
+ class Preexe < Node
3299
+ # Body of the block
3300
+ #
3301
+ # @return [Node, nil]
3302
+ attr_reader :body
3303
+ # Location of the `BEGIN` keyword
3304
+ #
3305
+ # ```text
3306
+ # BEGIN { 42 }
3307
+ # ~~~~~
3308
+ # ```
3309
+ #
3310
+ # @return [Loc]
3311
+ attr_reader :keyword_l
3312
+ # Location of the open parenthesis
3313
+ #
3314
+ # ```text
3315
+ # BEGIN { 42 }
3316
+ # ~
3317
+ # ```
3318
+ #
3319
+ # @return [Loc]
3320
+ attr_reader :begin_l
3321
+ # Location of the closing parenthesis
3322
+ #
3323
+ # ```text
3324
+ # BEGIN { 42 }
3325
+ # ~
3326
+ # ```
3327
+ #
3328
+ # @return [Loc]
3329
+ attr_reader :end_l
3330
+ # Location of the full expression
3331
+ #
3332
+ # ```text
3333
+ # BEGIN { 42 }
3334
+ # ~~~~~~~~~~~~
3335
+ # ```
3336
+ #
3337
+ # @return [Loc]
3338
+ attr_reader :expression_l
3339
+ end
3340
+
3341
+ # Represents a sole block argument (e.g. `|foo|`)
3342
+ #
3343
+ # Block that takes a single array argument automatically expands it.
3344
+ # Adding trailing comma after block argument disables this behavior (and then the only argument is emitted as `Arg`).
3345
+ class Procarg0 < Node
3346
+ # Parts of the sole block argument.
3347
+ #
3348
+ # `proc { |(a, b)| }` also counts as a sole argument, so this list may contain:
3349
+ # 1. A single `Arg` node (for `proc { |a| }` case)
3350
+ # 2. Multiple `Arg` nodes (for `proc { |(a, b, c)| }` case)
3351
+ #
3352
+ # @return [::Array<Node>]
3353
+ attr_reader :args
3354
+ # Location of the open parenthesis
3355
+ #
3356
+ # ```text
3357
+ # proc { |(foo, bar)| }
3358
+ # ~
3359
+ # ```
3360
+ #
3361
+ # `None` if there's only one argument
3362
+ #
3363
+ # @return [Loc, nil]
3364
+ attr_reader :begin_l
3365
+ # Location of the open parenthesis
3366
+ #
3367
+ # ```text
3368
+ # proc { |(foo, bar)| }
3369
+ # ~
3370
+ # ```
3371
+ #
3372
+ # `None` if there's only one argument
3373
+ #
3374
+ # @return [Loc, nil]
3375
+ attr_reader :end_l
3376
+ # Location of the full expression
3377
+ #
3378
+ # ```text
3379
+ # proc { |(foo, bar)| }
3380
+ # ~~~~~~~~~~
3381
+ # ```
3382
+ #
3383
+ # @return [Loc]
3384
+ attr_reader :expression_l
3385
+ end
3386
+
3387
+ # Represents rational literal (e.g. `1r`)
3388
+ class Rational < Node
3389
+ # String value of the literal, `String("1r")` for `1r`
3390
+ #
3391
+ # @return [String]
3392
+ attr_reader :value
3393
+ # Location of the unary `-` (but not `+`)
3394
+ #
3395
+ # ```text
3396
+ # -1r
3397
+ # ~
3398
+ # ```
3399
+ #
3400
+ # @return [Loc, nil]
3401
+ attr_reader :operator_l
3402
+ # Location of the full expression
3403
+ #
3404
+ # ```text
3405
+ # -1r
3406
+ # ~~~
3407
+ # ```
3408
+ #
3409
+ # @return [Loc]
3410
+ attr_reader :expression_l
3411
+ end
3412
+
3413
+ # Represents `redo` keyword
3414
+ class Redo < Node
3415
+ # Location of the full expression
3416
+ #
3417
+ # ```text
3418
+ # redo
3419
+ # ~~~~
3420
+ # ```
3421
+ #
3422
+ # @return [Loc]
3423
+ attr_reader :expression_l
3424
+ end
3425
+
3426
+ # Represents regex literal (e.g. `/foo/`)
3427
+ class Regexp < Node
3428
+ # A list of static and dynamic regex parts
3429
+ #
3430
+ # @return [::Array<Node>]
3431
+ attr_reader :parts
3432
+ # Regex options.
3433
+ #
3434
+ # `None` if regex has no explicit flags
3435
+ #
3436
+ # @return [Node, nil]
3437
+ attr_reader :options
3438
+ # Location of the regex begin
3439
+ #
3440
+ # ```text
3441
+ # /foo/
3442
+ # ~
3443
+ #
3444
+ # %r{foo}
3445
+ # ~~
3446
+ # ```
3447
+ #
3448
+ # @return [Loc]
3449
+ attr_reader :begin_l
3450
+ # Location of the regex end
3451
+ #
3452
+ # ```text
3453
+ # /foo/
3454
+ # ~
3455
+ #
3456
+ # %r{foo}
3457
+ # ~
3458
+ # ```
3459
+ #
3460
+ # @return [Loc]
3461
+ attr_reader :end_l
3462
+ # Location of the full expression
3463
+ #
3464
+ # ```text
3465
+ # /foo/mix
3466
+ # ~~~~~~~~
3467
+ # ```
3468
+ #
3469
+ # @return [Loc]
3470
+ attr_reader :expression_l
3471
+ end
3472
+
3473
+ # Represents flags of the regex literal (i.e. `mix` for `/foo/mix`)
3474
+ class RegOpt < Node
3475
+ # A list of flags
3476
+ #
3477
+ # @return [String, nil]
3478
+ attr_reader :options
3479
+ # Location of the full expression
3480
+ #
3481
+ # ```text
3482
+ # /foo/mix
3483
+ # ~~~
3484
+ # ```
3485
+ #
3486
+ # @return [Loc]
3487
+ attr_reader :expression_l
3488
+ end
3489
+
3490
+ # Represents a `rescue` block
3491
+ class Rescue < Node
3492
+ # Body of the block that is wrapped into `rescue` (i.e. the part that may throw an error)
3493
+ #
3494
+ # @return [Node, nil]
3495
+ attr_reader :body
3496
+ # A list of `rescue` handlers (see `RescueBody` node)
3497
+ #
3498
+ # @return [::Array<Node>]
3499
+ attr_reader :rescue_bodies
3500
+ # Else branch.
3501
+ #
3502
+ # `None` if there's no `else` branch
3503
+ #
3504
+ # @return [Node, nil]
3505
+ attr_reader :else
3506
+ # Location of the `else` keyword
3507
+ #
3508
+ # ```text
3509
+ # begin; 1; rescue StandardError => e; 2; else; 3; end
3510
+ # ~~~~
3511
+ # ```
3512
+ #
3513
+ # `None` if there's no `else` branch
3514
+ #
3515
+ # @return [Loc, nil]
3516
+ attr_reader :else_l
3517
+ # Location of the full expression
3518
+ #
3519
+ # ```text
3520
+ # begin; 1; rescue StandardError => e; 2; else; 3; end
3521
+ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3522
+ # ```
3523
+ #
3524
+ # **Note**: `begin/end` keywords belong to `KwBegin` node
3525
+ #
3526
+ # @return [Loc]
3527
+ attr_reader :expression_l
3528
+ end
3529
+
3530
+ # Represents a single `rescue` handler (i.e. `rescue E => e ...`)
3531
+ class RescueBody < Node
3532
+ # A list of exception classes
3533
+ #
3534
+ # `None` if no classes specified (i.e. `rescue => e; ...` or just `rescue; ...`)
3535
+ #
3536
+ # @return [Node, nil]
3537
+ attr_reader :exc_list
3538
+ # Variable that captures exception
3539
+ #
3540
+ # `None` if no variable specified (i.e. `rescue E; ...` or just `rescue; ... `)
3541
+ #
3542
+ # @return [Node, nil]
3543
+ attr_reader :exc_var
3544
+ # Body of the handler
3545
+ #
3546
+ # @return [Node, nil]
3547
+ attr_reader :body
3548
+ # Location of the `rescue` keyword
3549
+ #
3550
+ # ```text
3551
+ # begin; 1; rescue E => e; 2; end
3552
+ # ~~~~~~
3553
+ # ```
3554
+ #
3555
+ # @return [Loc]
3556
+ attr_reader :keyword_l
3557
+ # Location of the `=>` operator
3558
+ #
3559
+ # ```text
3560
+ # begin; 1; rescue E => e; 2; end
3561
+ # ~~
3562
+ # ```
3563
+ #
3564
+ # `None` if exception is not captured.
3565
+ #
3566
+ # @return [Loc, nil]
3567
+ attr_reader :assoc_l
3568
+ # Location of the `then` keyword
3569
+ #
3570
+ # ```text
3571
+ # begin; 1; rescue E => e then; 2; end
3572
+ # ~~~~
3573
+ # ```
3574
+ #
3575
+ # `then` is optional, so `begin_l` can be `None`
3576
+ #
3577
+ # @return [Loc, nil]
3578
+ attr_reader :begin_l
3579
+ # Location of the full expression
3580
+ #
3581
+ # ```text
3582
+ # begin; 1; rescue E => e then; 2; end
3583
+ # ~~~~~~~~~~~~~~~~~~~~~
3584
+ # ```
3585
+ #
3586
+ # @return [Loc]
3587
+ attr_reader :expression_l
3588
+ end
3589
+
3590
+ # Represents positional rest argument (i.e. `*foo` in `def m(*foo); end`)
3591
+ class Restarg < Node
3592
+ # Name of the argument.
3593
+ #
3594
+ # `None` if argument has no name (i.e. `def m(*); end`)
3595
+ #
3596
+ # @return [String, nil]
3597
+ attr_reader :name
3598
+ # Location of the `*` operator
3599
+ #
3600
+ # ```text
3601
+ # def m(*foo); end
3602
+ # ~
3603
+ # ```
3604
+ #
3605
+ # @return [Loc]
3606
+ attr_reader :operator_l
3607
+ # Location of the argument name
3608
+ #
3609
+ # ```text
3610
+ # def m(*foo); end
3611
+ # ~~~
3612
+ # ```
3613
+ #
3614
+ # @return [Loc, nil]
3615
+ attr_reader :name_l
3616
+ # Location of the full expression
3617
+ #
3618
+ # ```text
3619
+ # def m(*foo); end
3620
+ # ~~~~
3621
+ # ```
3622
+ #
3623
+ # @return [Loc]
3624
+ attr_reader :expression_l
3625
+ end
3626
+
3627
+ # Represents `retry` keyword
3628
+ class Retry < Node
3629
+ # Location of the `retry` keyword
3630
+ #
3631
+ # ```text
3632
+ # retry
3633
+ # ~~~~~
3634
+ # ```
3635
+ #
3636
+ # @return [Loc]
3637
+ attr_reader :expression_l
3638
+ end
3639
+
3640
+ # Represents `return` keyword
3641
+ class Return < Node
3642
+ # A list of values that is returned
3643
+ #
3644
+ # @return [::Array<Node>]
3645
+ attr_reader :args
3646
+ # Location of the `return` keyword
3647
+ #
3648
+ # ```text
3649
+ # return 1, 2
3650
+ # ~~~~~~
3651
+ # ```
3652
+ #
3653
+ # @return [Loc]
3654
+ attr_reader :keyword_l
3655
+ # Location of the full expression
3656
+ #
3657
+ # ```text
3658
+ # return 1, 2
3659
+ # ~~~~~~~~~~~
3660
+ # ```
3661
+ #
3662
+ # @return [Loc]
3663
+ attr_reader :expression_l
3664
+ end
3665
+
3666
+ # Represents opening a singleton class (i.e. `class << foo; ... end;`)
3667
+ class SClass < Node
3668
+ # Expression that is used to get a singleton class
3669
+ #
3670
+ # `Lvar("foo")` for `class << foo; end`
3671
+ #
3672
+ # @return [Node]
3673
+ attr_reader :expr
3674
+ # Body of the block
3675
+ #
3676
+ # @return [Node, nil]
3677
+ attr_reader :body
3678
+ # Location of the `class` keyword
3679
+ #
3680
+ # ```text
3681
+ # class << foo; end
3682
+ # ~~~~~
3683
+ # ```
3684
+ #
3685
+ # @return [Loc]
3686
+ attr_reader :keyword_l
3687
+ # Location of the `<<` operator
3688
+ #
3689
+ # ```text
3690
+ # class << foo; end
3691
+ # ~~
3692
+ # ```
3693
+ #
3694
+ # @return [Loc]
3695
+ attr_reader :operator_l
3696
+ # Location of the `end` keyword
3697
+ #
3698
+ # ```text
3699
+ # class << foo; end
3700
+ # ~~~
3701
+ # ```
3702
+ #
3703
+ # @return [Loc]
3704
+ attr_reader :end_l
3705
+ # Location of the full expression
3706
+ #
3707
+ # ```text
3708
+ # class << foo; end
3709
+ # ~~~~~~~~~~~~~~~~~
3710
+ # ```
3711
+ #
3712
+ # @return [Loc]
3713
+ attr_reader :expression_l
3714
+ end
3715
+
3716
+ # Represents `self` keyword
3717
+ class Self_ < Node
3718
+ # Location of the `self` keyword
3719
+ #
3720
+ # ```text
3721
+ # self
3722
+ # ~~~~
3723
+ # ```
3724
+ #
3725
+ # @return [Loc]
3726
+ attr_reader :expression_l
3727
+ end
3728
+
3729
+ # Represents a method call (e.g. `foo.bar(42)`)
3730
+ class Send < Node
3731
+ # Receiver of the method call
3732
+ #
3733
+ # `None` for implicit method call (e.g. `foo(42)`)
3734
+ #
3735
+ # @return [Node, nil]
3736
+ attr_reader :recv
3737
+ # Name of the method that is called
3738
+ #
3739
+ # @return [String]
3740
+ attr_reader :method_name
3741
+ # A list of arguments
3742
+ #
3743
+ # @return [::Array<Node>]
3744
+ attr_reader :args
3745
+ # Location of the `.` operator
3746
+ #
3747
+ # ```text
3748
+ # foo.bar(42)
3749
+ # ~
3750
+ # ```
3751
+ #
3752
+ # `None` for implicit method call (e.g. `foo(42)`)
3753
+ #
3754
+ # @return [Loc, nil]
3755
+ attr_reader :dot_l
3756
+ # Location of the method name
3757
+ #
3758
+ # ```text
3759
+ # foo.bar(42)
3760
+ # ~~~
3761
+ # ```
3762
+ #
3763
+ # `None` in a very special case when method call is implicit (i.e. `foo.(42)`)
3764
+ #
3765
+ # @return [Loc, nil]
3766
+ attr_reader :selector_l
3767
+ # Location of open parenthesis
3768
+ #
3769
+ # ```text
3770
+ # foo(42)
3771
+ # ~
3772
+ # ```
3773
+ #
3774
+ # `None` if there are no parentheses
3775
+ #
3776
+ # @return [Loc, nil]
3777
+ attr_reader :begin_l
3778
+ # Location of closing parenthesis
3779
+ #
3780
+ # ```text
3781
+ # foo(42)
3782
+ # ~
3783
+ # ```
3784
+ #
3785
+ # `None` if there are no parentheses
3786
+ #
3787
+ # @return [Loc, nil]
3788
+ attr_reader :end_l
3789
+ # Location of the operator if method is a setter
3790
+ #
3791
+ # ```text
3792
+ # foo.bar = 42
3793
+ # ~
3794
+ # ```
3795
+ #
3796
+ # `None` otherwise
3797
+ #
3798
+ # @return [Loc, nil]
3799
+ attr_reader :operator_l
3800
+ # Location of the full expression
3801
+ #
3802
+ # ```text
3803
+ # foo.bar(42)
3804
+ # ~~~~~~~~~~~
3805
+ # ```
3806
+ #
3807
+ # @return [Loc]
3808
+ attr_reader :expression_l
3809
+ end
3810
+
3811
+ # Represents a special block argument that "shadows" outer variable (i.e. `|;foo|`)
3812
+ class Shadowarg < Node
3813
+ # Name of the argument
3814
+ #
3815
+ # @return [String]
3816
+ attr_reader :name
3817
+ # Location of the argument
3818
+ #
3819
+ # ```text
3820
+ # proc { |;foo|}
3821
+ # ~~~
3822
+ # ```
3823
+ #
3824
+ # @return [Loc]
3825
+ attr_reader :expression_l
3826
+ end
3827
+
3828
+ # Represents an arguments splat (i.e. `*bar` in a call like `foo(*bar)`)
3829
+ class Splat < Node
3830
+ # Value that is converted to array
3831
+ #
3832
+ # @return [Node, nil]
3833
+ attr_reader :value
3834
+ # Location of the `*` operator
3835
+ #
3836
+ # ```text
3837
+ # foo(*bar)
3838
+ # ~
3839
+ # ```
3840
+ #
3841
+ # @return [Loc]
3842
+ attr_reader :operator_l
3843
+ # Location of the full expression
3844
+ #
3845
+ # ```text
3846
+ # foo(*bar)
3847
+ # ~~~~
3848
+ # ```
3849
+ #
3850
+ # @return [Loc]
3851
+ attr_reader :expression_l
3852
+ end
3853
+
3854
+ # Represents a plain non-interpolated string literal (e.g. `"foo"`)
3855
+ class Str < Node
3856
+ # Value of the string literal
3857
+ #
3858
+ # Note that it's a `StringValue`, not a `String`.
3859
+ # The reason is that you can get UTF-8 incompatible strings
3860
+ # from a valid UTF-8 source using escape sequences like `"\xFF"`
3861
+ #
3862
+ # These "\", "x", "F", "F" chars are valid separately, but together
3863
+ # they construct a char with code = 255 that is invalid for UTF-8.
3864
+ #
3865
+ # You can use `to_string_lossy` or `to_string` methods to get a raw string value.
3866
+ #
3867
+ # @return [String]
3868
+ attr_reader :value
3869
+ # Location of the string begin
3870
+ #
3871
+ # ```text
3872
+ # "foo"
3873
+ # ~
3874
+ # ```
3875
+ #
3876
+ # `None` if string literal is a part of the words array (like `%w[foo bar baz]`)
3877
+ #
3878
+ # @return [Loc, nil]
3879
+ attr_reader :begin_l
3880
+ # Location of the string begin
3881
+ #
3882
+ # ```text
3883
+ # "foo"
3884
+ # ~
3885
+ # ```
3886
+ #
3887
+ # `None` if string literal is a part of the words array (like `%w[foo bar baz]`)
3888
+ #
3889
+ # @return [Loc, nil]
3890
+ attr_reader :end_l
3891
+ # Location of the full expression
3892
+ #
3893
+ # ```text
3894
+ # "foo"
3895
+ # ~~~~~
3896
+ # ```
3897
+ #
3898
+ # @return [Loc]
3899
+ attr_reader :expression_l
3900
+ end
3901
+
3902
+ # Represents a `super` keyword
3903
+ class Super < Node
3904
+ # A list of arguments given to `super`
3905
+ #
3906
+ # @return [::Array<Node>]
3907
+ attr_reader :args
3908
+ # Location of the `super` keyword
3909
+ #
3910
+ # ```text
3911
+ # super(1, 2)
3912
+ # ~~~~~
3913
+ # ```
3914
+ #
3915
+ # @return [Loc]
3916
+ attr_reader :keyword_l
3917
+ # Location of the open parenthesis
3918
+ #
3919
+ # ```text
3920
+ # super(1, 2)
3921
+ # ~
3922
+ # ```
3923
+ #
3924
+ # `None` if there are no parentheses
3925
+ #
3926
+ # @return [Loc, nil]
3927
+ attr_reader :begin_l
3928
+ # Location of the closing parenthesis
3929
+ #
3930
+ # ```text
3931
+ # super(1, 2)
3932
+ # ~
3933
+ # ```
3934
+ #
3935
+ # `None` if there are no parentheses
3936
+ #
3937
+ # @return [Loc, nil]
3938
+ attr_reader :end_l
3939
+ # Location of the full expression
3940
+ #
3941
+ # ```text
3942
+ # super(1, 2)
3943
+ # ~~~~~~~~~~~
3944
+ # ```
3945
+ #
3946
+ # @return [Loc]
3947
+ attr_reader :expression_l
3948
+ end
3949
+
3950
+ # Represents a plain symbol literal (i.e. `:foo`)
3951
+ #
3952
+ # Note that `:` in `{ foo: bar }` belongs to a `pair` node.
3953
+ class Sym < Node
3954
+ # Value of the symbol literal
3955
+ #
3956
+ # Note that it's a `StringValue`, not a `String`.
3957
+ # The reason is that you can get UTF-8 incompatible strings
3958
+ # from a valid UTF-8 source using escape sequences like `"\xFF"`
3959
+ #
3960
+ # These "\", "x", "F", "F" chars are valid separately, but together
3961
+ # they construct a char with code = 255 that is invalid for UTF-8.
3962
+ #
3963
+ # You can use `to_string_lossy` or `to_string` methods to get a raw symbol value.
3964
+ #
3965
+ # @return [String]
3966
+ attr_reader :name
3967
+ # Location of the symbol begin
3968
+ #
3969
+ # ```text
3970
+ # :foo
3971
+ # ~
3972
+ # ```
3973
+ #
3974
+ # `None` if symbol is a label (`{ foo: 1 }`) or a part of the symbols array (`%i[foo bar baz]`)
3975
+ #
3976
+ # @return [Loc, nil]
3977
+ attr_reader :begin_l
3978
+ # Location of the symbol end
3979
+ #
3980
+ # ```text
3981
+ # { 'foo': 1 }
3982
+ # ~
3983
+ # ```
3984
+ #
3985
+ # `None` if symbol is **not** a string label (`:foo`) or a part of the symbols array (`%i[foo bar baz]`)
3986
+ #
3987
+ # @return [Loc, nil]
3988
+ attr_reader :end_l
3989
+ # Location of the full expression
3990
+ #
3991
+ # ```text
3992
+ # :foo
3993
+ # ~~~~
3994
+ #
3995
+ # { foo: 1 }
3996
+ # ~~~~
3997
+ #
3998
+ # %i[foo]
3999
+ # ~~~
4000
+ # ```
4001
+ #
4002
+ # @return [Loc]
4003
+ attr_reader :expression_l
4004
+ end
4005
+
4006
+ # Represents a `true` literal
4007
+ class True < Node
4008
+ # Location of the `true` keyword
4009
+ #
4010
+ # ```text
4011
+ # true
4012
+ # ~~~~
4013
+ # ```
4014
+ #
4015
+ # @return [Loc]
4016
+ attr_reader :expression_l
4017
+ end
4018
+
4019
+ # Represents an `undef` keyword (e.g. `undef foo, :bar`)
4020
+ class Undef < Node
4021
+ # A list of names to `undef`
4022
+ #
4023
+ # @return [::Array<Node>]
4024
+ attr_reader :names
4025
+ # Location the `undef` keyword
4026
+ #
4027
+ # ```text
4028
+ # undef foo, :bar
4029
+ # ~~~~~
4030
+ # ```
4031
+ #
4032
+ # @return [Loc]
4033
+ attr_reader :keyword_l
4034
+ # Location of the full expression
4035
+ #
4036
+ # ```text
4037
+ # undef :foo, bar
4038
+ # ~~~~~~~~~~~~~~~
4039
+ # ```
4040
+ #
4041
+ # @return [Loc]
4042
+ attr_reader :expression_l
4043
+ end
4044
+
4045
+ # Represents an `unless` guard used in pattern matching (i.e. `in pattern unless guard`)
4046
+ class UnlessGuard < Node
4047
+ # Condition of the guard, `Lvar("foo")` in `in pattern unless guard`
4048
+ #
4049
+ # @return [Node]
4050
+ attr_reader :cond
4051
+ # Location of the `unless` keyword
4052
+ #
4053
+ # ```text
4054
+ # case foo; in pattern unless cond; end
4055
+ # ~~~~~~
4056
+ # ```
4057
+ #
4058
+ # @return [Loc]
4059
+ attr_reader :keyword_l
4060
+ # Location of the full expression
4061
+ #
4062
+ # ```text
4063
+ # case foo; in pattern unless cond; end
4064
+ # ~~~~~~~~~~~
4065
+ # ```
4066
+ #
4067
+ # @return [Loc]
4068
+ attr_reader :expression_l
4069
+ end
4070
+
4071
+ # Represents `until` loop
4072
+ class Until < Node
4073
+ # Condition of the loop
4074
+ #
4075
+ # @return [Node]
4076
+ attr_reader :cond
4077
+ # Body of the loop.
4078
+ #
4079
+ # `None` if body is empty
4080
+ #
4081
+ # @return [Node, nil]
4082
+ attr_reader :body
4083
+ # Location of the `until` keyword
4084
+ #
4085
+ # ```text
4086
+ # until cond do; foo; end
4087
+ # ~~~~~
4088
+ # ```
4089
+ #
4090
+ # @return [Loc]
4091
+ attr_reader :keyword_l
4092
+ # Location of the `do` keyword
4093
+ #
4094
+ # ```text
4095
+ # until cond do; foo; end
4096
+ # ~~
4097
+ # ```
4098
+ #
4099
+ # `do` is optional, and so `begin_l` can be `None`
4100
+ #
4101
+ # @return [Loc, nil]
4102
+ attr_reader :begin_l
4103
+ # Location of the `end` keyword
4104
+ #
4105
+ # ```text
4106
+ # until cond do; foo; end
4107
+ # ~~~
4108
+ # ```
4109
+ #
4110
+ # `None` if loop is a modifier (i.e. `foo until bar`)
4111
+ #
4112
+ # @return [Loc, nil]
4113
+ attr_reader :end_l
4114
+ # Location of the full expression
4115
+ #
4116
+ # ```text
4117
+ # until cond do; foo; end
4118
+ # ~~~~~~~~~~~~~~~~~~~~~~~
4119
+ #
4120
+ # foo until bar
4121
+ # ~~~~~~~~~~~~~
4122
+ # ```
4123
+ #
4124
+ # @return [Loc]
4125
+ attr_reader :expression_l
4126
+ end
4127
+
4128
+ # Represents a post-until loop
4129
+ #
4130
+ # ```text
4131
+ # begin
4132
+ # foo
4133
+ # end until bar
4134
+ # ```
4135
+ class UntilPost < Node
4136
+ # Condition of the loop
4137
+ #
4138
+ # @return [Node]
4139
+ attr_reader :cond
4140
+ # Body of the loop
4141
+ #
4142
+ # @return [Node]
4143
+ attr_reader :body
4144
+ # Location of the `until` keyword
4145
+ #
4146
+ # ```text
4147
+ # begin; foo; end until bar
4148
+ # ~~~~~
4149
+ # ```
4150
+ #
4151
+ # @return [Loc]
4152
+ attr_reader :keyword_l
4153
+ # Location of the `until` keyword
4154
+ #
4155
+ # ```text
4156
+ # begin; foo; end until bar
4157
+ # ~~~~~~~~~~~~~~~~~~~~~~~~~
4158
+ # ```
4159
+ #
4160
+ # @return [Loc]
4161
+ attr_reader :expression_l
4162
+ end
4163
+
4164
+ # Represents a branch of the `case` statement (i.e. `when foo`)
4165
+ class When < Node
4166
+ # A list of values to compare/match against
4167
+ #
4168
+ # @return [::Array<Node>]
4169
+ attr_reader :patterns
4170
+ # Body of the `when` branch
4171
+ #
4172
+ # @return [Node, nil]
4173
+ attr_reader :body
4174
+ # Location of the `when` keyword
4175
+ #
4176
+ # ```text
4177
+ # case foo; when bar; end
4178
+ # ~~~~
4179
+ # ```
4180
+ #
4181
+ # @return [Loc]
4182
+ attr_reader :keyword_l
4183
+ # Location of the `then` keyword
4184
+ #
4185
+ # ```text
4186
+ # case foo; when bar then baz; end
4187
+ # ~~~~
4188
+ # ```
4189
+ #
4190
+ # `then` is optional, and so `begin_l` can be `None`
4191
+ #
4192
+ # @return [Loc]
4193
+ attr_reader :begin_l
4194
+ # Location of the full expression
4195
+ #
4196
+ # ```text
4197
+ # case foo; when bar then baz; end
4198
+ # ~~~~~~~~~~~~~~~~~
4199
+ # ```
4200
+ #
4201
+ # @return [Loc]
4202
+ attr_reader :expression_l
4203
+ end
4204
+
4205
+ # Represents `while` loop
4206
+ class While < Node
4207
+ # Condition of the loop
4208
+ #
4209
+ # @return [Node]
4210
+ attr_reader :cond
4211
+ # Body of the loop.
4212
+ #
4213
+ # `None` if body is empty
4214
+ #
4215
+ # @return [Node, nil]
4216
+ attr_reader :body
4217
+ # Location of the `while` keyword
4218
+ #
4219
+ # ```text
4220
+ # while cond do; foo; end
4221
+ # ~~~~~
4222
+ # ```
4223
+ #
4224
+ # @return [Loc]
4225
+ attr_reader :keyword_l
4226
+ # Location of the `do` keyword
4227
+ #
4228
+ # ```text
4229
+ # while cond do; foo; end
4230
+ # ~~
4231
+ # ```
4232
+ #
4233
+ # `do` is optional, and so `begin_l` can be `None`
4234
+ #
4235
+ # @return [Loc, nil]
4236
+ attr_reader :begin_l
4237
+ # Location of the `end` keyword
4238
+ #
4239
+ # ```text
4240
+ # while cond do; foo; end
4241
+ # ~~~
4242
+ # ```
4243
+ #
4244
+ # `None` if loop is a modifier (i.e. `foo while bar`)
4245
+ #
4246
+ # @return [Loc, nil]
4247
+ attr_reader :end_l
4248
+ # Location of the full expression
4249
+ #
4250
+ # ```text
4251
+ # while cond do; foo; end
4252
+ # ~~~~~~~~~~~~~~~~~~~~~~~
4253
+ #
4254
+ # foo while bar
4255
+ # ~~~~~~~~~~~~~
4256
+ # ```
4257
+ #
4258
+ # @return [Loc]
4259
+ attr_reader :expression_l
4260
+ end
4261
+
4262
+ # Represents a post-while loop
4263
+ #
4264
+ # ```text
4265
+ # begin
4266
+ # foo
4267
+ # end while bar
4268
+ # ```
4269
+ class WhilePost < Node
4270
+ # Condition of the loop
4271
+ #
4272
+ # @return [Node]
4273
+ attr_reader :cond
4274
+ # Body of the loop
4275
+ #
4276
+ # @return [Node]
4277
+ attr_reader :body
4278
+ # Location of the `while` keyword
4279
+ #
4280
+ # ```text
4281
+ # begin; foo; end while bar
4282
+ # ~~~~~
4283
+ # ```
4284
+ #
4285
+ # @return [Loc]
4286
+ attr_reader :keyword_l
4287
+ # Location of the `while` keyword
4288
+ #
4289
+ # ```text
4290
+ # begin; foo; end while bar
4291
+ # ~~~~~~~~~~~~~~~~~~~~~~~~~
4292
+ # ```
4293
+ #
4294
+ # @return [Loc]
4295
+ attr_reader :expression_l
4296
+ end
4297
+
4298
+ # Represents a executable here-document literal (both with and without interpolation)
4299
+ #
4300
+ # It's similar to `Xstr` in terms of abstract syntax tree, but has different source maps.
4301
+ class XHeredoc < Node
4302
+ # A list of string parts (static literals and interpolated expressions)
4303
+ #
4304
+ # @return [::Array<Node>]
4305
+ attr_reader :parts
4306
+ # Location of the executable here-document body
4307
+ #
4308
+ # ```text
4309
+ # <<-`HERE`\n a\n #{42}\nHERE
4310
+ # ~~~~~~~~~~~~~~~
4311
+ # ```
4312
+ #
4313
+ # @return [Loc]
4314
+ attr_reader :heredoc_body_l
4315
+ # Location of the executable here-document end
4316
+ #
4317
+ # ```text
4318
+ # <<-`HERE`\n a\n #{42}\nHERE
4319
+ # ~~~~
4320
+ # ```
4321
+ #
4322
+ # @return [Loc]
4323
+ attr_reader :heredoc_end_l
4324
+ # Location of the executable here-document identifier
4325
+ #
4326
+ # ```text
4327
+ # <<-`HERE`\n a\n #{42}\nHERE
4328
+ # ~~~~~~~
4329
+ # ```
4330
+ #
4331
+ # **Note**: This is the only node (with `Heredoc`) that has `expression_l` smaller that all other sub-locations merged.
4332
+ # The reason for that is that it's possible to add more code after here-document ID:
4333
+ #
4334
+ # ```text
4335
+ # <<-`HERE` + "rest"
4336
+ # content
4337
+ # HERE
4338
+ # ```
4339
+ #
4340
+ # @return [Loc]
4341
+ attr_reader :expression_l
4342
+ end
4343
+
4344
+ # Represents an executable string (i.e. `` `sh #{script_name}` ``)
4345
+ class Xstr < Node
4346
+ # A list of string parts (static literals and interpolated expressions)
4347
+ #
4348
+ # @return [::Array<Node>]
4349
+ attr_reader :parts
4350
+ # Location of the string begin
4351
+ #
4352
+ # ```text
4353
+ # `#{foo}`
4354
+ # ~
4355
+ #
4356
+ # %X{#{foo}}
4357
+ # ~~~
4358
+ # ```
4359
+ #
4360
+ # @return [Loc]
4361
+ attr_reader :begin_l
4362
+ # Location of the string end
4363
+ #
4364
+ # ```text
4365
+ # `#{foo}`
4366
+ # ~
4367
+ #
4368
+ # %X{#{foo}}
4369
+ # ~
4370
+ # ```
4371
+ #
4372
+ # @return [Loc]
4373
+ attr_reader :end_l
4374
+ # Location of the full expression
4375
+ #
4376
+ # ```text
4377
+ # `#{foo}`
4378
+ # ~~~~~~~~
4379
+ #
4380
+ # %X{#{foo}}
4381
+ # ~~~~~~~~~~
4382
+ # ```
4383
+ #
4384
+ # @return [Loc]
4385
+ attr_reader :expression_l
4386
+ end
4387
+
4388
+ # Represents an `yield` keyword
4389
+ class Yield < Node
4390
+ # A list of arguments given to `yield`
4391
+ #
4392
+ # @return [::Array<Node>]
4393
+ attr_reader :args
4394
+ # Location of the `yield` keyword
4395
+ #
4396
+ # ```text
4397
+ # yield 1, 2
4398
+ # ~~~~~
4399
+ # ```
4400
+ #
4401
+ # @return [Loc]
4402
+ attr_reader :keyword_l
4403
+ # Location of the open parenthesis
4404
+ #
4405
+ # ```text
4406
+ # yield(1, 2)
4407
+ # ~
4408
+ # ```
4409
+ #
4410
+ # `None` if there are no parentheses
4411
+ #
4412
+ # @return [Loc, nil]
4413
+ attr_reader :begin_l
4414
+ # Location of the closing parenthesis
4415
+ #
4416
+ # ```text
4417
+ # yield(1, 2)
4418
+ # ~
4419
+ # ```
4420
+ #
4421
+ # `None` if there are no parentheses
4422
+ #
4423
+ # @return [Loc, nil]
4424
+ attr_reader :end_l
4425
+ # Location of the full expression
4426
+ #
4427
+ # ```text
4428
+ # yield(1, 2)
4429
+ # ~~~~~~~~~~~
4430
+ # ```
4431
+ #
4432
+ # @return [Loc]
4433
+ attr_reader :expression_l
4434
+ end
4435
+
4436
+ # Represents a `super` call without arguments and parentheses
4437
+ #
4438
+ # It's different from `super()` as it implicitly forwards current arguments
4439
+ class ZSuper < Node
4440
+ # Location of the `super` keyword
4441
+ #
4442
+ # ```text
4443
+ # super
4444
+ # ~~~~~
4445
+ # ```
4446
+ #
4447
+ # @return [Loc]
4448
+ attr_reader :expression_l
4449
+ end
4450
+
4451
+ end
4452
+ end