parser 2.6.0.0 → 3.1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/lib/parser/all.rb +3 -0
  3. data/lib/parser/ast/processor.rb +48 -1
  4. data/lib/parser/base.rb +30 -6
  5. data/lib/parser/builders/default.rb +670 -38
  6. data/lib/parser/context.rb +24 -26
  7. data/lib/parser/current.rb +36 -9
  8. data/lib/parser/current_arg_stack.rb +46 -0
  9. data/lib/parser/diagnostic/engine.rb +1 -2
  10. data/lib/parser/diagnostic.rb +1 -1
  11. data/lib/parser/lexer/dedenter.rb +58 -49
  12. data/lib/parser/lexer/explanation.rb +1 -1
  13. data/lib/parser/lexer.rb +13837 -11893
  14. data/lib/parser/macruby.rb +2544 -2489
  15. data/lib/parser/max_numparam_stack.rb +56 -0
  16. data/lib/parser/messages.rb +78 -44
  17. data/lib/parser/meta.rb +13 -3
  18. data/lib/parser/ruby18.rb +2313 -2259
  19. data/lib/parser/ruby19.rb +2537 -2488
  20. data/lib/parser/ruby20.rb +2724 -2673
  21. data/lib/parser/ruby21.rb +2766 -2727
  22. data/lib/parser/ruby22.rb +2683 -2628
  23. data/lib/parser/ruby23.rb +2796 -2755
  24. data/lib/parser/ruby24.rb +2812 -2771
  25. data/lib/parser/ruby25.rb +2703 -2670
  26. data/lib/parser/ruby26.rb +2794 -2747
  27. data/lib/parser/ruby27.rb +7914 -0
  28. data/lib/parser/ruby28.rb +8047 -0
  29. data/lib/parser/ruby30.rb +8096 -0
  30. data/lib/parser/ruby31.rb +8354 -0
  31. data/lib/parser/rubymotion.rb +2527 -2485
  32. data/lib/parser/runner/ruby_parse.rb +2 -2
  33. data/lib/parser/runner/ruby_rewrite.rb +2 -2
  34. data/lib/parser/runner.rb +36 -2
  35. data/lib/parser/source/buffer.rb +53 -28
  36. data/lib/parser/source/comment/associator.rb +31 -8
  37. data/lib/parser/source/comment.rb +14 -1
  38. data/lib/parser/source/map/method_definition.rb +25 -0
  39. data/lib/parser/source/range.rb +19 -3
  40. data/lib/parser/source/tree_rewriter/action.rb +137 -28
  41. data/lib/parser/source/tree_rewriter.rb +144 -14
  42. data/lib/parser/static_environment.rb +23 -0
  43. data/lib/parser/tree_rewriter.rb +3 -3
  44. data/lib/parser/variables_stack.rb +36 -0
  45. data/lib/parser/version.rb +1 -1
  46. data/lib/parser.rb +4 -0
  47. data/parser.gemspec +12 -19
  48. metadata +34 -99
  49. data/.gitignore +0 -32
  50. data/.travis.yml +0 -45
  51. data/.yardopts +0 -21
  52. data/CHANGELOG.md +0 -943
  53. data/CONTRIBUTING.md +0 -17
  54. data/Gemfile +0 -10
  55. data/README.md +0 -301
  56. data/Rakefile +0 -165
  57. data/ci/run_rubocop_specs +0 -14
  58. data/doc/AST_FORMAT.md +0 -1735
  59. data/doc/CUSTOMIZATION.md +0 -37
  60. data/doc/INTERNALS.md +0 -21
  61. data/doc/css/.gitkeep +0 -0
  62. data/doc/css/common.css +0 -68
  63. data/lib/parser/lexer.rl +0 -2383
  64. data/lib/parser/macruby.y +0 -2198
  65. data/lib/parser/ruby18.y +0 -1934
  66. data/lib/parser/ruby19.y +0 -2175
  67. data/lib/parser/ruby20.y +0 -2353
  68. data/lib/parser/ruby21.y +0 -2357
  69. data/lib/parser/ruby22.y +0 -2364
  70. data/lib/parser/ruby23.y +0 -2370
  71. data/lib/parser/ruby24.y +0 -2408
  72. data/lib/parser/ruby25.y +0 -2405
  73. data/lib/parser/ruby26.y +0 -2413
  74. data/lib/parser/rubymotion.y +0 -2182
  75. data/test/bug_163/fixtures/input.rb +0 -5
  76. data/test/bug_163/fixtures/output.rb +0 -5
  77. data/test/bug_163/rewriter.rb +0 -20
  78. data/test/helper.rb +0 -52
  79. data/test/parse_helper.rb +0 -315
  80. data/test/racc_coverage_helper.rb +0 -133
  81. data/test/test_base.rb +0 -31
  82. data/test/test_current.rb +0 -27
  83. data/test/test_diagnostic.rb +0 -96
  84. data/test/test_diagnostic_engine.rb +0 -62
  85. data/test/test_encoding.rb +0 -99
  86. data/test/test_lexer.rb +0 -3543
  87. data/test/test_lexer_stack_state.rb +0 -78
  88. data/test/test_parse_helper.rb +0 -80
  89. data/test/test_parser.rb +0 -7087
  90. data/test/test_runner_rewrite.rb +0 -47
  91. data/test/test_source_buffer.rb +0 -162
  92. data/test/test_source_comment.rb +0 -36
  93. data/test/test_source_comment_associator.rb +0 -367
  94. data/test/test_source_map.rb +0 -15
  95. data/test/test_source_range.rb +0 -172
  96. data/test/test_source_rewriter.rb +0 -541
  97. data/test/test_source_rewriter_action.rb +0 -46
  98. data/test/test_source_tree_rewriter.rb +0 -173
  99. data/test/test_static_environment.rb +0 -45
  100. data/test/using_tree_rewriter/fixtures/input.rb +0 -3
  101. data/test/using_tree_rewriter/fixtures/output.rb +0 -3
  102. data/test/using_tree_rewriter/using_tree_rewriter.rb +0 -9
data/doc/AST_FORMAT.md DELETED
@@ -1,1735 +0,0 @@
1
- AST and Source Location
2
- =======================
3
-
4
- ## Literals
5
-
6
- ### Singletons
7
-
8
- Format:
9
-
10
- ~~~
11
- (true)
12
- "true"
13
- ~~~~ expression
14
-
15
- (false)
16
- "false"
17
- ~~~~~ expression
18
-
19
- (nil)
20
- "nil"
21
- ~~~ expression
22
- ~~~
23
-
24
- ### Integer
25
-
26
- Format:
27
-
28
- ~~~
29
- (int 123)
30
- "123"
31
- ~~~ expression
32
-
33
- (int -123)
34
- "-123"
35
- ^ operator
36
- ~~~ expression
37
-
38
- (int 1)
39
- "__LINE__"
40
- ~~~~~~~~ expression
41
- ~~~
42
-
43
- ### Float
44
-
45
- Format:
46
-
47
- ~~~
48
- (float 1.0)
49
- "1.0"
50
- ~~~ expression
51
-
52
- (float -1.0)
53
- "-1.0"
54
- ^ operator
55
- ~~~~ expression
56
- ~~~
57
-
58
- ### Complex
59
-
60
- Format:
61
-
62
- ~~~
63
- (complex (0+1i))
64
- "1i"
65
- ~~ expression
66
-
67
- (complex (0+(1/1)*i))
68
- "1ri"
69
- ~~~ expression
70
- ~~~
71
-
72
- ### Rational
73
-
74
- Format:
75
-
76
- ~~~
77
- (rational (2/1))
78
- "2.0r"
79
- ~~~~ expression
80
- ~~~
81
-
82
- ### String
83
-
84
- #### Plain
85
-
86
- Format:
87
-
88
- ~~~
89
- (str "foo")
90
- "'foo'"
91
- ^ begin
92
- ^ end
93
- ~~~~~ expresion
94
-
95
- (string "foo.rb")
96
- "__FILE__"
97
- ~~~~~~~~ expression
98
- ~~~
99
-
100
- #### With interpolation
101
-
102
- Format:
103
-
104
- ~~~
105
- (dstr (str "foo") (lvar bar) (str "baz"))
106
- '"foo#{bar}baz"'
107
- ^ begin ^ end
108
- ~~~~~~~~~~~~~~ expression
109
- ~~~
110
-
111
- #### Here document
112
-
113
- Format:
114
-
115
- ~~~
116
- (str "foo\nbar\n")
117
- '<<HERE␊foo␊bar␊HERE'
118
- ~~~~~~ expression
119
- ~~~~~~~~ heredoc_body
120
- ~~~~ heredoc_end
121
- ~~~
122
-
123
- ### Symbol
124
-
125
- #### Plain
126
-
127
- Format:
128
-
129
- ~~~
130
- (sym :foo)
131
- ":foo"
132
- ~~~~ expresion
133
-
134
- ":'foo'"
135
- ^ begin
136
- ^ end
137
- ~~~~~~ expression
138
- ~~~
139
-
140
- #### With interpolation
141
-
142
- Format:
143
-
144
- ~~~
145
- (dsym (str "foo") (lvar bar) (str "baz"))
146
- ':"foo#{bar}baz"'
147
- ^ begin ^ end
148
- ~~~~~~~~~~~~~~~ expression
149
- ~~~
150
-
151
- ### Execute-string
152
-
153
- #### Plain
154
-
155
- Format:
156
-
157
- ~~~
158
- (xstr (str "foo") (lvar bar))
159
- "`foo#{bar}`"
160
- ^ begin ^ end
161
- ~~~~~~~~~~~ expression
162
- ~~~
163
-
164
- #### Here document
165
-
166
- Format:
167
-
168
- ~~~
169
- (xstr (str "foo\nbar\n"))
170
- "<<`HERE`␊foo␊bar␊HERE"
171
- ~~~~~~~~ expression
172
- ~~~~~~~~ heredoc_body
173
- ~~~~ heredoc_end
174
- ~~~
175
-
176
- ### Regexp
177
-
178
- #### Options
179
-
180
- Format:
181
-
182
- ~~~
183
- (regopt :i :m)
184
- "im"
185
- ~~ expression
186
- ~~~
187
-
188
- #### Regexp
189
-
190
- Format:
191
-
192
- ~~~
193
- (regexp (str "foo") (lvar :bar) (regopt :i))
194
- "/foo#{bar}/i"
195
- ^ begin ^ end
196
- ~~~~~~~~~~~ expression
197
- ~~~
198
-
199
- ### Array
200
-
201
- #### Plain
202
-
203
- Format:
204
-
205
- ~~~
206
- (array (int 1) (int 2))
207
-
208
- "[1, 2]"
209
- ^ begin
210
- ^ end
211
- ~~~~~~ expression
212
- ~~~
213
-
214
- #### Splat
215
-
216
- Can also be used in argument lists: `foo(bar, *baz)`
217
-
218
- Format:
219
-
220
- ~~~
221
- (splat (lvar :foo))
222
- "*foo"
223
- ^ operator
224
- ~~~~ expression
225
- ~~~
226
-
227
- #### With interpolation
228
-
229
- Format:
230
-
231
- ~~~
232
- (array (int 1) (splat (lvar :foo)) (int 2))
233
-
234
- "[1, *foo, 2]"
235
- ^ begin ^ end
236
- ~~~~~~~~~~~~ expression
237
- ~~~
238
-
239
- ### Hash
240
-
241
- #### Pair
242
-
243
- ##### With hashrocket
244
-
245
- Format:
246
-
247
- ~~~
248
- (pair (int 1) (int 2))
249
- "1 => 2"
250
- ~~ operator
251
- ~~~~~~ expression
252
- ~~~
253
-
254
- ##### With label (1.9)
255
-
256
- Format:
257
-
258
- ~~~
259
- (pair (sym :answer) (int 42))
260
- "answer: 42"
261
- ^ operator (pair)
262
- ~~~~~~ expression (sym)
263
- ~~~~~~~~~~ expression (pair)
264
- ~~~
265
-
266
- #### Plain
267
-
268
- Format:
269
-
270
- ~~~
271
- (hash (pair (int 1) (int 2)) (pair (int 3) (int 4)))
272
- "{1 => 2, 3 => 4}"
273
- ^ begin ^ end
274
- ~~~~~~~~~~~~~~~~ expression
275
- ~~~
276
-
277
- #### Keyword splat (2.0)
278
-
279
- Can also be used in argument lists: `foo(bar, **baz)`
280
-
281
- Format:
282
-
283
- ~~~
284
- (kwsplat (lvar :foo))
285
- "**foo"
286
- ~~ operator
287
- ~~~~~ expression
288
- ~~~
289
-
290
- #### With interpolation (2.0)
291
-
292
- Format:
293
-
294
- ~~~
295
- (hash (pair (sym :foo) (int 2)) (kwsplat (lvar :bar)))
296
- "{ foo: 2, **bar }"
297
- ^ begin ^ end
298
- ~~~~~~~~~~~~~~~~~ expression
299
- ~~~
300
-
301
- ### Range
302
-
303
- #### Inclusive
304
-
305
- Format:
306
-
307
- ~~~
308
- (irange (int 1) (int 2))
309
- "1..2"
310
- ~~ operator
311
- ~~~~ expression
312
- ~~~
313
-
314
- #### Exclusive
315
-
316
- Format:
317
-
318
- ~~~
319
- (erange (int 1) (int 2))
320
- "1...2"
321
- ~~~ operator
322
- ~~~~~ expression
323
- ~~~
324
-
325
-
326
- ### Endless (2.6)
327
-
328
- Format:
329
-
330
- ~~~
331
- (irange (int 1) nil)
332
- "1.."
333
- ~~ operator
334
- ~~~ expression
335
-
336
- (erange (int 1) nil)
337
- "1..."
338
- ~~~ operator
339
- ~~~~ expression
340
- ~~~
341
-
342
- ## Access
343
-
344
- ### Self
345
-
346
- Format:
347
-
348
- ~~~
349
- (self)
350
- "self"
351
- ~~~~ expression
352
- ~~~
353
-
354
- ### Local variable
355
-
356
- Format:
357
-
358
- ~~~
359
- (lvar :foo)
360
- "foo"
361
- ~~~ expression
362
- ~~~
363
-
364
- ### Instance variable
365
-
366
- Format:
367
-
368
- ~~~
369
- (ivar :@foo)
370
- "@foo"
371
- ~~~~ expression
372
- ~~~
373
-
374
- ### Class variable
375
-
376
- Format:
377
-
378
- ~~~
379
- (cvar :@@foo)
380
- "@@foo"
381
- ~~~~~ expression
382
- ~~~
383
-
384
- ### Global variable
385
-
386
- #### Regular global variable
387
-
388
- Format:
389
-
390
- ~~~
391
- (gvar :$foo)
392
- "$foo"
393
- ~~~~ expression
394
- ~~~
395
-
396
- #### Regular expression capture groups
397
-
398
- Format:
399
-
400
- ~~~
401
- (nth-ref 1)
402
- "$1"
403
- ~~ expression
404
- ~~~
405
-
406
- #### Regular expression back-references
407
-
408
- Format:
409
-
410
- ~~~
411
- (back-ref :$&)
412
- "$&"
413
- ~~ expression
414
- (back-ref :$`)
415
- "$`"
416
- (back-ref :$')
417
- "$'"
418
- (back-ref :$+)
419
- "$+"
420
- ~~~
421
-
422
- ### Constant
423
-
424
- #### Top-level constant
425
-
426
- Format:
427
-
428
- ~~~
429
- (const (cbase) :Foo)
430
- "::Foo"
431
- ~~~ name
432
- ~~ double_colon
433
- ~~~~~ expression
434
- ~~~
435
-
436
- #### Scoped constant
437
-
438
- Format:
439
-
440
- ~~~
441
- (const (lvar :a) :Foo)
442
- "a::Foo"
443
- ~~~ name
444
- ~~ double_colon
445
- ~~~~~~ expression
446
- ~~~
447
-
448
- #### Unscoped constant
449
-
450
- Format:
451
-
452
- ~~~
453
- (const nil :Foo)
454
- "Foo"
455
- ~~~ name
456
- ~~~ expression
457
- ~~~
458
-
459
- ### defined?
460
-
461
- Format:
462
-
463
- ~~~
464
- (defined? (lvar :a))
465
- "defined? a"
466
- ~~~~~~~~ keyword
467
- ~~~~~~~~~~ expression
468
-
469
- "defined?(a)"
470
- ~~~~~~~~ keyword
471
- ^ begin
472
- ^ end
473
- ~~~~~~~~~~~ expression
474
- ~~~
475
-
476
- ## Assignment
477
-
478
- ### To local variable
479
-
480
- Format:
481
-
482
- ~~~
483
- (lvasgn :foo (lvar :bar))
484
- "foo = bar"
485
- ^ operator
486
- ~~~~~~~~~ expression
487
- ~~~
488
-
489
- ### To instance variable
490
-
491
- Format:
492
-
493
- ~~~
494
- (ivasgn :@foo (lvar :bar))
495
- "@foo = bar"
496
- ^ operator
497
- ~~~~~~~~~~ expression
498
- ~~~
499
-
500
- ### To class variable
501
-
502
- Format:
503
-
504
- ~~~
505
- (cvasgn :@@foo (lvar :bar))
506
- "@@foo = bar"
507
- ^ operator
508
- ~~~~~~~~~~~ expression
509
- ~~~
510
-
511
- ### To global variable
512
-
513
- Format:
514
-
515
- ~~~
516
- (gvasgn :$foo (lvar :bar))
517
- "$foo = bar"
518
- ^ operator
519
- ~~~~~~~~~~ expression
520
- ~~~
521
-
522
- ### To constant
523
-
524
- #### Top-level constant
525
-
526
- Format:
527
-
528
- ~~~
529
- (casgn (cbase) :Foo (int 1))
530
- "::Foo = 1"
531
- ~~~ name
532
- ~ operator
533
- ~~~~~~~ expression
534
- ~~~
535
-
536
- #### Scoped constant
537
-
538
- Format:
539
-
540
- ~~~
541
- (casgn (lvar :a) :Foo (int 1))
542
- "a::Foo = 1"
543
- ~~~ name
544
- ~ operator
545
- ~~~~~~~~ expression
546
- ~~~
547
-
548
- #### Unscoped constant
549
-
550
- Format:
551
-
552
- ~~~
553
- (casgn nil :Foo (int 1))
554
- "Foo = 1"
555
- ~~~ name
556
- ~ operator
557
- ~~~~~~~ expression
558
- ~~~
559
-
560
- ### To attribute
561
-
562
- Format:
563
-
564
- ~~~
565
- (send (self) :foo= (int 1))
566
- "self.foo = 1"
567
- ^ dot
568
- ~~~ selector
569
- ^ operator
570
- ~~~~~~~~~~~~ expression
571
- ~~~
572
-
573
- ### To attribute, using "safe navigation operator"
574
-
575
- Format:
576
-
577
- ~~~
578
- (csend (self) :foo= (int 1))
579
- "self&.foo = 1"
580
- ^^ dot
581
- ~~~ selector
582
- ^ operator
583
- ~~~~~~~~~~~~~ expression
584
- ~~~
585
-
586
- ### Multiple assignment
587
-
588
- #### Multiple left hand side
589
-
590
- Format:
591
-
592
- ~~~
593
- (mlhs (lvasgn :a) (lvasgn :b))
594
- "a, b"
595
- ~~~~ expression
596
- "(a, b)"
597
- ^ begin
598
- ^ end
599
- ~~~~~~ expression
600
- ~~~
601
-
602
- #### Assignment
603
-
604
- Rule of thumb: every node inside `(mlhs)` is "incomplete"; to make
605
- it "complete", one could imagine that a corresponding node from the
606
- mrhs is "appended" to the node in question. This applies both to
607
- side-effect free assignments (`lvasgn`, etc) and side-effectful
608
- assignments (`send`).
609
-
610
- Format:
611
-
612
- ~~~
613
- (masgn (mlhs (lvasgn :foo) (lvasgn :bar)) (array (int 1) (int 2)))
614
- "foo, bar = 1, 2"
615
- ^ operator
616
- ~~~~~~~~~~~~~~~ expression
617
-
618
- (masgn (mlhs (ivasgn :@a) (cvasgn :@@b)) (array (splat (lvar :c))))
619
- "@a, @@b = *c"
620
-
621
- (masgn (mlhs (mlhs (lvasgn :a) (lvasgn :b)) (lvasgn :c)) (lvar :d))
622
- "a, (b, c) = d"
623
-
624
- (masgn (mlhs (send (self) :a=) (send (self) :[]= (int 1))) (lvar :a))
625
- "self.a, self[1] = a"
626
- ~~~
627
-
628
- ### Binary operator-assignment
629
-
630
- Binary operator-assignment features the same "incomplete assignments" and "incomplete calls" as [multiple assignment](#assignment-1).
631
-
632
- #### Variable binary operator-assignment
633
-
634
- Format:
635
-
636
- ~~~
637
- (op-asgn (lvasgn :a) :+ (int 1))
638
- "a += 1"
639
- ~~ operator
640
- ~~~~~~ expression
641
-
642
- (op-asgn (ivasgn :a) :+ (int 1))
643
- "@a += 1"
644
- ~~~
645
-
646
- #### Method binary operator-assignment
647
-
648
- Format:
649
-
650
- ~~~
651
- (op-asgn (send (ivar :@a) :b) :+ (int 1))
652
- "@a.b += 1"
653
- ~ selector (send)
654
- ~~~~ expression (send)
655
- ~~ operator (op-asgn)
656
- ~~~~~~~~~ expression (op-asgn)
657
-
658
- (op-asgn (send (ivar :@a) :[] (int 0) (int 1))) :+ (int 1))
659
- "@a[0, 1] += 1"
660
- ~~~~~~ selector (send)
661
- ~~~~~~~~ expression (send)
662
- ~~ operator (op-asgn)
663
- ~~~~~~~~~~~~~ expression (op-asgn)
664
- ~~~
665
-
666
- ### Logical operator-assignment
667
-
668
- Logical operator-assignment features the same "incomplete assignments" and "incomplete calls" as [multiple assignment](#assignment-1).
669
-
670
- #### Variable logical operator-assignment
671
-
672
- Format:
673
-
674
- ~~~
675
- (or-asgn (ivasgn :@a) (int 1))
676
- "@a ||= 1"
677
- ~~~ operator
678
- ~~~~~~~~ expression
679
-
680
- (and-asgn (lvasgn :a) (int 1))
681
- "a &&= 1"
682
- ~~~ operator
683
- ~~~~~~~ expression
684
- ~~~
685
-
686
- #### Method logical operator-assignment
687
-
688
- Format:
689
-
690
- ~~~
691
- (or-asgn (send (ivar :@foo) :bar) (int 1))
692
- "@foo.bar ||= 1"
693
- ~~~ selector (send)
694
- ~~~~~~~~ expr (send)
695
- ~~~ operator (or-asgn)
696
- ~~~~~~~~~~~~~~ expression (or-asgn)
697
-
698
- (and-asgn (send (lvar :@foo) :bar) (int 1))
699
- "foo.bar &&= 1"
700
- ~~~ selector (send)
701
- ~~~~~~~ expr (send)
702
- ~~~ operator (and-asgn)
703
- ~~~~~~~~~~~~~ expression (and-asgn)
704
-
705
- (or-asgn (send (ivar :@foo) :[] (int 1) (int 2)) (int 1))
706
- "@foo[1, 2] ||= 1"
707
- ~~~~~~ selector (send)
708
- ~~~~~~~~~~ expr (send)
709
- ~~~ operator (or-asgn)
710
- ~~~~~~~~~~~~~~~~ expression (or-asgn)
711
-
712
- ~~~
713
-
714
- ## Class and module definition
715
-
716
- ### Module
717
-
718
- Format:
719
-
720
- ~~~
721
- (module (const nil :Foo) (nil))
722
- "module Foo; end"
723
- ~~~~~~ keyword
724
- ~~~ end
725
- ~~~
726
-
727
- ### Class
728
-
729
- Format:
730
-
731
- ~~~
732
- (class (const nil :Foo) (const nil :Bar) (nil))
733
- "class Foo < Bar; end"
734
- ~~~~~ keyword ~~~ end
735
- ~ operator
736
- ~~~~~~~~~~~~~~~~~~~~ expression
737
-
738
- (class (const nil :Foo) nil (nil))
739
- "class Foo; end"
740
- ~~~~~ keyword
741
- ~~~ end
742
- ~~~~~~~~~~~~~~ expression
743
- ~~~
744
-
745
- ### Singleton class
746
-
747
- Format:
748
-
749
- ~~~
750
- (sclass (lvar :a) (nil))
751
- "class << a; end"
752
- ~~~~~ keyword
753
- ~~ operator
754
- ~~~ end
755
- ~~~~~~~~~~~~~~~ expression
756
- ~~~
757
-
758
- ## Method (un)definition
759
-
760
- ### Instance methods
761
-
762
- Format:
763
-
764
- ~~~
765
- (def :foo (args) nil)
766
- "def foo; end"
767
- ~~~ keyword
768
- ~~~ name
769
- ~~~ end
770
- ~~~~~~~~~~~~ expression
771
- ~~~
772
-
773
- ### Singleton methods
774
-
775
- Format:
776
-
777
- ~~~
778
- (defs (self) :foo (args) nil)
779
- "def self.foo; end"
780
- ~~~ keyword
781
- ~~~ name
782
- ~~~ end
783
- ~~~~~~~~~~~~~~~~~ expression
784
- ~~~
785
-
786
- ### Undefinition
787
-
788
- Format:
789
-
790
- ~~~
791
- (undef (sym :foo) (sym :bar) (dsym (str "foo") (int 1)))
792
- "undef foo :bar :"foo#{1}""
793
- ~~~~~ keyword
794
- ~~~~~~~~~~~~~~~~~~~~~~~~~ expression
795
- ~~~
796
-
797
- ## Aliasing
798
-
799
- ### Method aliasing
800
-
801
- Format:
802
-
803
- ~~~
804
- (alias (sym :foo) (dsym (str "foo") (int 1)))
805
- "alias foo :"foo#{1}""
806
- ~~~~~ keyword
807
- ~~~~~~~~~~~~~~~~~~~~ expression
808
- ~~~
809
-
810
- ### Global variable aliasing
811
-
812
- Format:
813
-
814
- ~~~
815
- (alias (gvar :$foo) (gvar :$bar))
816
- "alias $foo $bar"
817
- ~~~~~ keyword
818
- ~~~~~~~~~~~~~~~ expression
819
-
820
- (alias (gvar :$foo) (back-ref :$&))
821
- "alias $foo $&"
822
- ~~~~~ keyword
823
- ~~~~~~~~~~~~~~~ expression
824
- ~~~
825
-
826
- ## Formal arguments
827
-
828
- Format:
829
-
830
- ~~~
831
- (args (arg :foo))
832
- "(foo)"
833
- ~~~~~ expression
834
- ~~~
835
-
836
- ### Required argument
837
-
838
- Format:
839
-
840
- ~~~
841
- (arg :foo)
842
- "foo"
843
- ~~~ expression
844
- ~~~ name
845
- ~~~
846
-
847
- ### Optional argument
848
-
849
- Format:
850
-
851
- ~~~
852
- (optarg :foo (int 1))
853
- "foo = 1"
854
- ~~~~~~~ expression
855
- ^ operator
856
- ~~~ name
857
- ~~~
858
-
859
- ### Named splat argument
860
-
861
- Format:
862
-
863
- ~~~
864
- (restarg :foo)
865
- "*foo"
866
- ~~~~ expression
867
- ~~~ name
868
- ~~~
869
-
870
- Begin of the `expression` points to `*`.
871
-
872
- ### Unnamed splat argument
873
-
874
- Format:
875
-
876
- ~~~
877
- (restarg)
878
- "*"
879
- ^ expression
880
- ~~~
881
-
882
- ### Block argument
883
-
884
- Format:
885
-
886
- ~~~
887
- (blockarg :foo)
888
- "&foo"
889
- ~~~ name
890
- ~~~~ expression
891
- ~~~
892
-
893
- Begin of the `expression` points to `&`.
894
-
895
- ### Auto-expanding proc argument (1.9)
896
-
897
- In Ruby 1.9 and later, when a proc-like closure (i.e. a closure
898
- created by capturing a block or with the `proc` method, but not
899
- with the `->{}` syntax or the `lambda` method) has exactly one
900
- argument, and it is called with more than one argument, the behavior
901
- is as if the array of all arguments was instead passed as the sole
902
- argument. This behavior can be prevented by adding a comma after
903
- the sole argument (e.g. `|foo,|`).
904
-
905
- Format:
906
-
907
- ~~~
908
- (procarg0 :foo)
909
- "|foo|"
910
- ~~~ expression
911
- ~~~ name
912
- ~~~
913
-
914
- ### Expression arguments
915
-
916
- Ruby 1.8 allows to use arbitrary expressions as block arguments,
917
- such as `@var` or `foo.bar`. Such expressions should be treated as
918
- if they were on the lhs of a multiple assignment.
919
-
920
- Format:
921
-
922
- ~~~
923
- (args (arg_expr (ivasgn :@bar)))
924
- "|@bar|"
925
-
926
- (args (arg_expr (send (send nil :foo) :a=)))
927
- "|foo.a|"
928
-
929
- (args (restarg_expr (ivasgn :@bar)))
930
- "|*@bar|"
931
-
932
- (args (blockarg_expr (ivasgn :@bar)))
933
- "|&@bar|"
934
- ~~~
935
-
936
- ### Block shadow arguments
937
-
938
- Format:
939
-
940
- ~~~
941
- (args (shadowarg :foo) (shadowarg :bar))
942
- "|; foo, bar|"
943
- ~~~
944
-
945
- ### Decomposition
946
-
947
- Format:
948
-
949
- ~~~
950
- (def :f (args (arg :a) (mlhs (arg :foo) (restarg :bar))))
951
- "def f(a, (foo, *bar)); end"
952
- ^ begin ^ end
953
- ~~~~~~~~~~~ expression
954
- ~~~
955
-
956
- ### Required keyword argument
957
-
958
- Format:
959
-
960
- ~~~
961
- (kwarg :foo)
962
- "foo:"
963
- ~~~~ expression
964
- ~~~~ name
965
- ~~~
966
-
967
- ### Optional keyword argument
968
-
969
- Format:
970
-
971
- ~~~
972
- (kwoptarg :foo (int 1))
973
- "foo: 1"
974
- ~~~~~~ expression
975
- ~~~~ name
976
- ~~~
977
-
978
- ### Named keyword splat argument
979
-
980
- Format:
981
-
982
- ~~~
983
- (kwrestarg :foo)
984
- "**foo"
985
- ~~~~~ expression
986
- ~~~ name
987
- ~~~
988
-
989
- ### Unnamed keyword splat argument
990
-
991
- Format:
992
-
993
- ~~~
994
- (kwrestarg)
995
- "**"
996
- ~~ expression
997
- ~~~
998
-
999
- ### Objective-C arguments
1000
-
1001
- MacRuby includes a few more syntactic "arguments" whose name becomes
1002
- the part of the Objective-C method name, despite looking like Ruby 2.0
1003
- keyword arguments, and are thus treated differently.
1004
-
1005
- #### Objective-C label-like keyword argument
1006
-
1007
- Format:
1008
-
1009
- ~~~
1010
- (objc-kwarg :a :b)
1011
- "a: b"
1012
- ~ keyword
1013
- ~ operator
1014
- ~ argument
1015
- ~~~~ expression
1016
- ~~~
1017
-
1018
- #### Objective-C pair-like keyword argument
1019
-
1020
- Format:
1021
-
1022
- ~~~
1023
- (objc-kwarg :a :b)
1024
- "a => b"
1025
- ~ keyword
1026
- ~~ operator
1027
- ~ argument
1028
- ~~~~~~ expression
1029
- ~~~
1030
-
1031
- #### Objective-C keyword splat argument
1032
-
1033
- Format:
1034
-
1035
- ~~~
1036
- (objc-restarg (objc-kwarg :foo))
1037
- "(*a: b)"
1038
- ~ objc-kwarg.keyword
1039
- ~ objc-kwarg.operator
1040
- ~ objc-kwarg.argument
1041
- ~ operator
1042
- ~~~~~ expression
1043
- ~~~
1044
-
1045
- Note that these splat arguments will only be parsed inside parentheses,
1046
- e.g. in the following code:
1047
-
1048
- ~~~
1049
- def f((*a: b)); end
1050
- ~~~
1051
-
1052
- However, the following code results in a parse error:
1053
-
1054
- ~~~
1055
- def f(*a: b); end
1056
- ~~~
1057
-
1058
- ## Send
1059
-
1060
- ### To self
1061
-
1062
- Format:
1063
-
1064
- ~~~
1065
- (send nil :foo (lvar :bar))
1066
- "foo(bar)"
1067
- ~~~ selector
1068
- ^ begin
1069
- ^ end
1070
- ~~~~~~~~ expression
1071
- ~~~
1072
-
1073
- ### To receiver
1074
-
1075
- Format:
1076
-
1077
- ~~~
1078
- (send (lvar :foo) :bar (int 1))
1079
- "foo.bar(1)"
1080
- ^ dot
1081
- ~~~ selector
1082
- ^ begin
1083
- ^ end
1084
- ~~~~~~~~~~ expression
1085
-
1086
- (send (lvar :foo) :+ (int 1))
1087
- "foo + 1"
1088
- ^ selector
1089
- ~~~~~~~ expression
1090
-
1091
- (send (lvar :foo) :-@)
1092
- "-foo"
1093
- ^ selector
1094
- ~~~~ expression
1095
-
1096
- (send (lvar :foo) :a= (int 1))
1097
- "foo.a = 1"
1098
- ~ selector
1099
- ^ operator
1100
- ~~~~~~~~~ expression
1101
- ~~~
1102
-
1103
- ### To superclass
1104
-
1105
- Format of super with arguments:
1106
-
1107
- ~~~
1108
- (super (lvar :a))
1109
- "super a"
1110
- ~~~~~ keyword
1111
- ~~~~~~~ expression
1112
-
1113
- (super)
1114
- "super()"
1115
- ^ begin
1116
- ^ end
1117
- ~~~~~ keyword
1118
- ~~~~~~~ expression
1119
- ~~~
1120
-
1121
- Format of super without arguments (**z**ero-arity):
1122
-
1123
- ~~~
1124
- (zsuper)
1125
- "super"
1126
- ~~~~~ keyword
1127
- ~~~~~ expression
1128
- ~~~
1129
-
1130
- ### To block argument
1131
-
1132
- Format:
1133
-
1134
- ~~~
1135
- (yield (lvar :foo))
1136
- "yield(foo)"
1137
- ~~~~~ keyword
1138
- ^ begin
1139
- ^ end
1140
- ~~~~~~~~~~ expression
1141
- ~~~
1142
-
1143
- ### Indexing
1144
-
1145
- Format:
1146
-
1147
- ~~~
1148
- (index (lvar :foo) (int 1))
1149
- "foo[1]"
1150
- ^ begin
1151
- ^ end
1152
- ~~~~~~ expression
1153
-
1154
- (indexasgn (lvar :bar) (int 1) (int 2) (lvar :baz))
1155
- "bar[1, 2] = baz"
1156
- ^ begin
1157
- ^ end
1158
- ^ operator
1159
- ~~~~~~~~~~~~~~~ expression
1160
-
1161
- ~~~
1162
-
1163
- ### Passing a literal block
1164
-
1165
- ~~~
1166
- (block (send nil :foo) (args (arg :bar)) (begin ...))
1167
- "foo do |bar|; end"
1168
- ~~ begin
1169
- ~~~ end
1170
- ~~~~~~~~~~~~~ expression
1171
- ~~~
1172
-
1173
- ### Passing expression as block
1174
-
1175
- Used when passing expression as block `foo(&bar)`
1176
-
1177
- ~~~
1178
- (send nil :foo (int 1) (block-pass (lvar :foo)))
1179
- "foo(1, &foo)"
1180
- ^ operator
1181
- ~~~~ expression
1182
- ~~~
1183
-
1184
- ### "Stabby lambda"
1185
-
1186
- ~~~
1187
- (block (lambda) (args) nil)
1188
- "-> {}"
1189
- ~~ lambda.expression
1190
- ~~~
1191
-
1192
- ### "Safe navigation operator"
1193
-
1194
- ~~~
1195
- (csend (send nil :foo) :bar)
1196
- "foo&.bar"
1197
- ~~ dot
1198
- ~~~
1199
-
1200
- ### Objective-C variadic send
1201
-
1202
- MacRuby allows to pass a variadic amount of arguments via the last
1203
- keyword "argument". Semantically, these, together with the pair value
1204
- of the last pair in the hash implicitly passed as the last argument,
1205
- form an array, which replaces the pair value. Despite that, the node
1206
- is called `objc-varargs` to distinguish it from a literal array passed
1207
- as a value.
1208
-
1209
- ~~~
1210
- (send nil :foo (int 1) (hash (pair (sym :bar) (objc-varargs (int 1) (int 2) (nil)))))
1211
- "foo(1, bar: 2, 3, nil)"
1212
- ~~~~~~~~~ expression (array)
1213
- ~~~
1214
-
1215
- ## Control flow
1216
-
1217
- ### Logical operators
1218
-
1219
- #### Binary (and or && ||)
1220
-
1221
- Format:
1222
-
1223
- ~~~
1224
- (and (lvar :foo) (lvar :bar))
1225
- "foo and bar"
1226
- ~~~ operator
1227
- ~~~~~~~~~~~ expression
1228
- ~~~
1229
-
1230
- ~~~
1231
- (or (lvar :foo) (lvar :bar))
1232
- "foo or bar"
1233
- ~~ operator
1234
- ~~~~~~~~~~ expression
1235
- ~~~
1236
-
1237
- #### Unary (! not) (1.8)
1238
-
1239
- Format:
1240
-
1241
- ~~~
1242
- (not (lvar :foo))
1243
- "!foo"
1244
- ^ operator
1245
- "not foo"
1246
- ~~~ operator
1247
- ~~~
1248
-
1249
- ### Branching
1250
-
1251
- #### Without else
1252
-
1253
- Format:
1254
-
1255
- ~~~
1256
- (if (lvar :cond) (lvar :iftrue) nil)
1257
- "if cond then iftrue; end"
1258
- ~~ keyword
1259
- ~~~~ begin
1260
- ~~~ end
1261
- ~~~~~~~~~~~~~~~~~~~~~~~~ expression
1262
-
1263
- "if cond; iftrue; end"
1264
- ~~ keyword
1265
- ~~~ end
1266
- ~~~~~~~~~~~~~~~~~~~~ expression
1267
-
1268
- "iftrue if cond"
1269
- ~~ keyword
1270
- ~~~~~~~~~~~~~~ expression
1271
-
1272
- (if (lvar :cond) nil (lvar :iftrue))
1273
- "unless cond then iftrue; end"
1274
- ~~~~~~ keyword
1275
- ~~~~ begin
1276
- ~~~ end
1277
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1278
-
1279
- "unless cond; iftrue; end"
1280
- ~~~~~~ keyword
1281
- ~~~ end
1282
- ~~~~~~~~~~~~~~~~~~~~~~~~ expression
1283
-
1284
- "iftrue unless cond"
1285
- ~~~~~~ keyword
1286
- ~~~~~~~~~~~~~~~~~~ expression
1287
- ~~~
1288
-
1289
- #### With else
1290
-
1291
- Format:
1292
-
1293
- ~~~
1294
- (if (lvar :cond) (lvar :iftrue) (lvar :iffalse))
1295
- "if cond then iftrue; else; iffalse; end"
1296
- ~~ keyword
1297
- ~~~~ begin
1298
- ~~~~ else
1299
- ~~~ end
1300
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1301
-
1302
- "if cond; iftrue; else; iffalse; end"
1303
- ~~ keyword
1304
- ~~~~ else
1305
- ~~~ end
1306
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1307
-
1308
- (if (lvar :cond) (lvar :iffalse) (lvar :iftrue))
1309
- "unless cond then iftrue; else; iffalse; end"
1310
- ~~~~~~ keyword
1311
- ~~~~ begin
1312
- ~~~~ else
1313
- ~~~ end
1314
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1315
-
1316
- "unless cond; iftrue; else; iffalse; end"
1317
- ~~~~~~ keyword
1318
- ~~~~ else
1319
- ~~~ end
1320
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1321
- ~~~
1322
-
1323
- #### With elsif
1324
-
1325
- Format:
1326
-
1327
- ~~~
1328
- (if (lvar :cond1) (int 1) (if (lvar :cond2 (int 2) (int 3))))
1329
- "if cond1; 1; elsif cond2; 2; else 3; end"
1330
- ~~ keyword (left)
1331
- ~~~~~ else (left)
1332
- ~~~ end (left)
1333
- ~~~~~ keyword (right)
1334
- ~~~~ else (right)
1335
- ~~~ end (right)
1336
- ~~~
1337
-
1338
- #### Ternary
1339
-
1340
- Format:
1341
-
1342
- ~~~
1343
- (if (lvar :cond) (lvar :iftrue) (lvar :iffalse))
1344
- "cond ? iftrue : iffalse"
1345
- ^ question
1346
- ^ colon
1347
- ~~~~~~~~~~~~~~~~~~~~~~~ expression
1348
- ~~~
1349
-
1350
- ### Case matching
1351
-
1352
- #### When clause
1353
-
1354
- Format:
1355
-
1356
- ~~~
1357
- (when (regexp "foo" (regopt)) (begin (lvar :bar)))
1358
- "when /foo/ then bar"
1359
- ~~~~ keyword
1360
- ~~~~ begin
1361
- ~~~~~~~~~~~~~~~~~~~ expression
1362
-
1363
- (when (int 1) (int 2) (send nil :meth))
1364
- "when 1, 2; meth"
1365
-
1366
- (when (int 1) (splat (lvar :foo)) (send nil :meth))
1367
- "when 1, *foo; meth"
1368
-
1369
- (when (splat (lvar :foo)) (send nil :meth))
1370
- "when *foo; meth"
1371
- ~~~
1372
-
1373
- #### Case-expression clause
1374
-
1375
- ##### Without else
1376
-
1377
- Format:
1378
-
1379
- ~~~
1380
- (case (lvar :foo) (when (str "bar") (lvar :bar)) nil)
1381
- "case foo; when "bar"; bar; end"
1382
- ~~~~ keyword ~~~ end
1383
- ~~~
1384
-
1385
- ##### With else
1386
-
1387
- Format:
1388
-
1389
- ~~~
1390
- (case (lvar :foo) (when (str "bar") (lvar :bar)) (lvar :baz))
1391
- "case foo; when "bar"; bar; else baz; end"
1392
- ~~~~ keyword ~~~~ else ~~~ end
1393
- ~~~
1394
-
1395
- #### Case-conditions clause
1396
-
1397
- ##### Without else
1398
-
1399
- Format:
1400
-
1401
- ~~~
1402
- (case nil (when (lvar :bar) (lvar :bar)) nil)
1403
- "case; when bar; bar; end"
1404
- ~~~~ keyword ~~~ end
1405
- ~~~
1406
-
1407
- ##### With else
1408
-
1409
- Format:
1410
-
1411
- ~~~
1412
- (case nil (when (lvar :bar) (lvar :bar)) (lvar :baz))
1413
- "case; when bar; bar; else baz; end"
1414
- ~~~~ keyword ~~~~ else ~~~ end
1415
-
1416
- (case nil (lvar :baz))
1417
- "case; else baz; end"
1418
- ~~~~ keyword
1419
- ~~~~ else
1420
- ~~~ end
1421
- ~~~
1422
-
1423
- ### Looping
1424
-
1425
- #### With precondition
1426
-
1427
- Format:
1428
-
1429
- ~~~
1430
- (while (lvar :condition) (send nil :foo))
1431
- "while condition do foo; end"
1432
- ~~~~~ keyword
1433
- ~~ begin
1434
- ~~~ end
1435
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1436
-
1437
- "while condition; foo; end"
1438
- ~~~~~ keyword
1439
- ~~~ end
1440
- ~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1441
-
1442
- "foo while condition"
1443
- ~~~~~ keyword
1444
- ~~~~~~~~~~~~~~~~~~~ expression
1445
-
1446
- (until (lvar :condition) (send nil :foo))
1447
- "until condition do foo; end"
1448
- ~~~~~ keyword
1449
- ~~ begin
1450
- ~~~ end
1451
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1452
-
1453
- (until (lvar :condition) (send nil :foo))
1454
- "until condition; foo; end"
1455
- ~~~~~ keyword
1456
- ~~~ end
1457
- ~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1458
-
1459
- "foo until condition"
1460
- ~~~~~ keyword
1461
- ~~~~~~~~~~~~~~~~~~~ expression
1462
- ~~~
1463
-
1464
- #### With postcondition
1465
-
1466
- Format:
1467
-
1468
- ~~~
1469
- (while-post (lvar :condition) (kwbegin (send nil :foo)))
1470
- "begin; foo; end while condition"
1471
- ~~~~~ begin (begin)
1472
- ~~~ end (begin)
1473
- ~~~~~ keyword (while-post)
1474
-
1475
- (until-post (lvar :condition) (kwbegin (send nil :foo)))
1476
- "begin; foo; end until condition"
1477
- ~~~~~ begin (begin)
1478
- ~~~ end (begin)
1479
- ~~~~~ keyword (until-post)
1480
- ~~~
1481
-
1482
- #### For-in
1483
-
1484
- Format:
1485
-
1486
- ~~~
1487
- (for (lvasgn :a) (lvar :array) (send nil :p (lvar :a)))
1488
- "for a in array do p a; end"
1489
- ~~~ keyword
1490
- ~~ in
1491
- ~~ begin
1492
- ~~~ end
1493
-
1494
- "for a in array; p a; end"
1495
- ~~~ keyword
1496
- ~~ in
1497
- ~~~ end
1498
-
1499
- (for
1500
- (mlhs (lvasgn :a) (lvasgn :b)) (lvar :array)
1501
- (send nil :p (lvar :a) (lvar :b)))
1502
- "for a, b in array; p a, b; end"
1503
- ~~~
1504
-
1505
- #### Break
1506
-
1507
- Format:
1508
-
1509
- ~~~
1510
- (break (int 1))
1511
- "break 1"
1512
- ~~~~~ keyword
1513
- ~~~~~~~ expression
1514
- ~~~
1515
-
1516
- #### Next
1517
-
1518
- Format:
1519
-
1520
- ~~~
1521
- (next (int 1))
1522
- "next 1"
1523
- ~~~~ keyword
1524
- ~~~~~~ expression
1525
- ~~~
1526
-
1527
- #### Redo
1528
-
1529
- Format:
1530
-
1531
- ~~~
1532
- (redo)
1533
- "redo"
1534
- ~~~~ keyword
1535
- ~~~~ expression
1536
- ~~~
1537
-
1538
- ### Return
1539
-
1540
- Format:
1541
-
1542
- ~~~
1543
- (return (lvar :foo))
1544
- "return(foo)"
1545
- ~~~~~~ keyword
1546
- ~~~~~~~~~~~ expression
1547
- ~~~
1548
-
1549
- ### Exception handling
1550
-
1551
- #### Rescue body
1552
-
1553
- Format:
1554
-
1555
- ~~~
1556
- (resbody (array (const nil :Exception) (const nil :A)) (lvasgn :bar) (int 1))
1557
- "rescue Exception, A => bar; 1"
1558
- ~~~~~~ keyword ~~ assoc
1559
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1560
-
1561
- "rescue Exception, A => bar then 1"
1562
- ~~~~~~ keyword ~~ assoc
1563
- ~~~~ begin
1564
-
1565
- (resbody (array (const nil :Exception)) (ivasgn :bar) (int 1))
1566
- "rescue Exception => @bar; 1"
1567
- ~~~~~~ keyword ~~ assoc
1568
-
1569
- (resbody nil (lvasgn :bar) (int 1))
1570
- "rescue => bar; 1"
1571
- ~~~~~~ keyword
1572
- ~~ assoc
1573
-
1574
- (resbody nil nil (int 1))
1575
- "rescue; 1"
1576
- ~~~~~~ keyword
1577
- ~~~
1578
-
1579
- #### Rescue statement
1580
-
1581
- ##### Without else
1582
-
1583
- Format:
1584
-
1585
- ~~~
1586
- (begin
1587
- (rescue (send nil :foo) (resbody ...) (resbody ...) nil))
1588
- "begin; foo; rescue Exception; rescue; end"
1589
- ~~~~~ begin ~~~ end
1590
- ~~~~~~~~~~~~~~~~~ expression (rescue.resbody/1)
1591
- ~~~~~~~ expression (rescue.resbody/2)
1592
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (rescue)
1593
- ~~~
1594
-
1595
- ##### With else
1596
-
1597
- Format:
1598
-
1599
- ~~~
1600
- (begin
1601
- (rescue (send nil :foo) (resbody ...) (resbody ...) (true)))
1602
- "begin; foo; rescue Exception; rescue; else true end"
1603
- ~~~~~ begin ~~~~ else (rescue)
1604
- ~~~ end
1605
- ~~~
1606
-
1607
- #### Ensure statement
1608
-
1609
- Format:
1610
-
1611
- ~~~
1612
- (begin
1613
- (ensure (send nil :foo) (send nil :bar))
1614
- "begin; foo; ensure; bar; end"
1615
- ~~~~~ begin ~~~~~~ keyword (ensure)
1616
- ~~~ end
1617
- ~~~
1618
-
1619
- #### Rescue with ensure
1620
-
1621
- Format:
1622
-
1623
- ~~~
1624
- (begin
1625
- (ensure
1626
- (rescue (send nil :foo) (resbody ...) (int 1))
1627
- (send nil :bar))
1628
- "begin; foo; rescue; nil; else; 1; ensure; bar; end"
1629
- ~~~~~ begin
1630
- ~~~~ else (ensure.rescue)
1631
- ~~~~~~~~~~~~~~~~~~~~~ expression (rescue)
1632
- ~~~~~~ keyword (ensure)
1633
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (ensure)
1634
- ~~~ end
1635
- ~~~
1636
-
1637
- #### Retry
1638
-
1639
- Format:
1640
-
1641
- ~~~
1642
- (retry)
1643
- "retry"
1644
- ~~~~~ keyword
1645
- ~~~~~ expression
1646
- ~~~
1647
-
1648
- ### BEGIN and END
1649
-
1650
- Format:
1651
-
1652
- ~~~
1653
- (preexe (send nil :puts (str "foo")))
1654
- "BEGIN { puts "foo" }"
1655
- ~~~~~ keyword
1656
- ^ begin ^ end
1657
- ~~~~~~~~~~~~~~~~~~~~ expression
1658
-
1659
- (postexe (send nil :puts (str "bar")))
1660
- "END { puts "bar" }"
1661
- ~~~ keyword
1662
- ^ begin ^ end
1663
- ~~~~~~~~~~~~~~~~~~ expression
1664
- ~~~
1665
-
1666
- ## Miscellanea
1667
-
1668
- ### Flip-flops
1669
-
1670
- Format:
1671
-
1672
- ~~~
1673
- (iflipflop (lvar :a) (lvar :b))
1674
- "if a..b; end"
1675
- ~~ operator
1676
- ~~~~ expression
1677
-
1678
- (eflipflop (lvar :a) (lvar :b))
1679
- "if a...b; end"
1680
- ~~~ operator
1681
- ~~~~~ expression
1682
- ~~~
1683
-
1684
- ### Implicit matches
1685
-
1686
- Format:
1687
-
1688
- ~~~
1689
- (match-current-line (regexp (str "a") (regopt)))
1690
- "if /a/; end"
1691
- ~~~ expression
1692
- ~~~
1693
-
1694
- ### Local variable injecting matches
1695
-
1696
- Format:
1697
-
1698
- ~~~
1699
- (match-with-lvasgn (regexp (str "(?<match>bar)") (regopt)) (lvar :baz))
1700
- "/(?<match>bar)/ =~ baz"
1701
- ~~ selector
1702
- ~~~~~~~~~~~~~~~~~~~~~~ expression
1703
- ~~~
1704
-
1705
- ## Special constants
1706
-
1707
- ### File
1708
-
1709
- Format:
1710
-
1711
- ~~~
1712
- (__FILE__)
1713
- "__FILE__"
1714
- ~~~~~~~~ expression
1715
- ~~~
1716
-
1717
- ### Line
1718
-
1719
- Format:
1720
-
1721
- ~~~
1722
- (__LINE__)
1723
- "__LINE__"
1724
- ~~~~~~~~ expression
1725
- ~~~
1726
-
1727
- ### Encoding
1728
-
1729
- Format:
1730
-
1731
- ~~~
1732
- (__ENCODING__)
1733
- "__ENCODING__"
1734
- ~~~~~~~~~~~~ expression
1735
- ~~~