parser 2.3.1.4 → 2.3.2.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.
@@ -1323,9 +1323,6 @@ rule
1323
1323
  concat(val[3])
1324
1324
  }
1325
1325
  | f_arg tCOMMA
1326
- {
1327
- result = [@builder.multi_lhs(nil, val[0], nil)]
1328
- }
1329
1326
  | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1330
1327
  {
1331
1328
  result = val[0].
@@ -1335,7 +1332,11 @@ rule
1335
1332
  }
1336
1333
  | f_arg opt_f_block_arg
1337
1334
  {
1338
- result = val[0].concat(val[1])
1335
+ if val[1].empty? && val[0].size == 1
1336
+ result = [@builder.procarg0(val[0][0])]
1337
+ else
1338
+ result = val[0].concat(val[1])
1339
+ end
1339
1340
  }
1340
1341
  | f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
1341
1342
  {
@@ -1,3 +1,3 @@
1
1
  module Parser
2
- VERSION = '2.3.1.4'
2
+ VERSION = '2.3.2.0'
3
3
  end
@@ -19,6 +19,13 @@ class TestParser < Minitest::Test
19
19
  parser
20
20
  end
21
21
 
22
+ SINCE_1_9 = ALL_VERSIONS - %w(1.8)
23
+ SINCE_2_0 = SINCE_1_9 - %w(1.9 mac ios)
24
+ SINCE_2_1 = SINCE_2_0 - %w(2.0)
25
+ SINCE_2_2 = SINCE_2_1 - %w(2.1)
26
+ SINCE_2_3 = SINCE_2_2 - %w(2.2)
27
+ SINCE_2_4 = SINCE_2_3 - %w(2.3)
28
+
22
29
  # Guidelines for test naming:
23
30
  # * Test structure follows structure of AST_FORMAT.md.
24
31
  # * Test names follow node names.
@@ -123,13 +130,13 @@ class TestParser < Minitest::Test
123
130
  s(:rational, Rational(42)),
124
131
  %q{42r},
125
132
  %q{~~~ expression},
126
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
133
+ SINCE_2_1)
127
134
 
128
135
  assert_parses(
129
136
  s(:rational, Rational(421, 10)),
130
137
  %q{42.1r},
131
138
  %q{~~~~~ expression},
132
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
139
+ SINCE_2_1)
133
140
  end
134
141
 
135
142
  def test_complex
@@ -137,25 +144,25 @@ class TestParser < Minitest::Test
137
144
  s(:complex, Complex(0, 42)),
138
145
  %q{42i},
139
146
  %q{~~~ expression},
140
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
147
+ SINCE_2_1)
141
148
 
142
149
  assert_parses(
143
150
  s(:complex, Complex(0, Rational(42))),
144
151
  %q{42ri},
145
152
  %q{~~~~ expression},
146
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
153
+ SINCE_2_1)
147
154
 
148
155
  assert_parses(
149
156
  s(:complex, Complex(0, 42.1)),
150
157
  %q{42.1i},
151
158
  %q{~~~~~ expression},
152
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
159
+ SINCE_2_1)
153
160
 
154
161
  assert_parses(
155
162
  s(:complex, Complex(0, Rational(421, 10))),
156
163
  %q{42.1ri},
157
164
  %q{~~~~~~ expression},
158
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
165
+ SINCE_2_1)
159
166
  end
160
167
 
161
168
  # Strings
@@ -230,7 +237,7 @@ class TestParser < Minitest::Test
230
237
  %q{?a},
231
238
  %q{^ begin
232
239
  |~~ expression},
233
- ALL_VERSIONS - %w(1.8))
240
+ SINCE_1_9)
234
241
 
235
242
  assert_parses(
236
243
  s(:int, 97),
@@ -279,21 +286,21 @@ class TestParser < Minitest::Test
279
286
  s(:dstr)),
280
287
  %Q{p <<~E\nE},
281
288
  %q{},
282
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
289
+ SINCE_2_3)
283
290
 
284
291
  assert_parses(
285
292
  s(:send, nil, :p,
286
293
  s(:dstr)),
287
294
  %Q{p <<~E\n E},
288
295
  %q{},
289
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
296
+ SINCE_2_3)
290
297
 
291
298
  assert_parses(
292
299
  s(:send, nil, :p,
293
300
  s(:str, "x\n")),
294
301
  %Q{p <<~E\n x\nE},
295
302
  %q{},
296
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
303
+ SINCE_2_3)
297
304
 
298
305
  assert_parses(
299
306
  s(:send, nil, :p,
@@ -302,7 +309,7 @@ class TestParser < Minitest::Test
302
309
  s(:str, " y\n"))),
303
310
  %Q{p <<~E\n x\n y\nE},
304
311
  %q{},
305
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
312
+ SINCE_2_3)
306
313
 
307
314
  assert_parses(
308
315
  s(:send, nil, :p,
@@ -311,7 +318,7 @@ class TestParser < Minitest::Test
311
318
  s(:str, "y\n"))),
312
319
  %Q{p <<~E\n\tx\n y\nE},
313
320
  %q{},
314
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
321
+ SINCE_2_3)
315
322
 
316
323
  assert_parses(
317
324
  s(:send, nil, :p,
@@ -320,7 +327,7 @@ class TestParser < Minitest::Test
320
327
  s(:str, "y\n"))),
321
328
  %Q{p <<~E\n\tx\n y\nE},
322
329
  %q{},
323
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
330
+ SINCE_2_3)
324
331
 
325
332
  assert_parses(
326
333
  s(:send, nil, :p,
@@ -329,7 +336,7 @@ class TestParser < Minitest::Test
329
336
  s(:str, "y\n"))),
330
337
  %Q{p <<~E\n \tx\n y\nE},
331
338
  %q{},
332
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
339
+ SINCE_2_3)
333
340
 
334
341
  assert_parses(
335
342
  s(:send, nil, :p,
@@ -338,7 +345,7 @@ class TestParser < Minitest::Test
338
345
  s(:str, "y\n"))),
339
346
  %Q{p <<~E\n \tx\n\ty\nE},
340
347
  %q{},
341
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
348
+ SINCE_2_3)
342
349
 
343
350
  assert_parses(
344
351
  s(:send, nil, :p,
@@ -348,7 +355,7 @@ class TestParser < Minitest::Test
348
355
  s(:str, "y\n"))),
349
356
  %Q{p <<~E\n x\n\ny\nE},
350
357
  %q{},
351
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
358
+ SINCE_2_3)
352
359
 
353
360
  assert_parses(
354
361
  s(:send, nil, :p,
@@ -358,7 +365,7 @@ class TestParser < Minitest::Test
358
365
  s(:str, "y\n"))),
359
366
  %Q{p <<~E\n x\n \n y\nE},
360
367
  %q{},
361
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
368
+ SINCE_2_3)
362
369
 
363
370
  assert_parses(
364
371
  s(:send, nil, :p,
@@ -367,7 +374,7 @@ class TestParser < Minitest::Test
367
374
  s(:str, " y\n"))),
368
375
  %Q{p <<~E\n x\n \\ y\nE},
369
376
  %q{},
370
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
377
+ SINCE_2_3)
371
378
 
372
379
  assert_parses(
373
380
  s(:send, nil, :p,
@@ -376,7 +383,7 @@ class TestParser < Minitest::Test
376
383
  s(:str, "\ty\n"))),
377
384
  %Q{p <<~E\n x\n \\\ty\nE},
378
385
  %q{},
379
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
386
+ SINCE_2_3)
380
387
 
381
388
  assert_parses(
382
389
  s(:send, nil, :p,
@@ -388,7 +395,7 @@ class TestParser < Minitest::Test
388
395
  s(:str, "\n"))),
389
396
  %Q{p <<~"E"\n x\n \#{foo}\nE},
390
397
  %q{},
391
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
398
+ SINCE_2_3)
392
399
 
393
400
  assert_parses(
394
401
  s(:send, nil, :p,
@@ -400,7 +407,7 @@ class TestParser < Minitest::Test
400
407
  s(:str, "\n"))),
401
408
  %Q{p <<~`E`\n x\n \#{foo}\nE},
402
409
  %q{},
403
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
410
+ SINCE_2_3)
404
411
 
405
412
  assert_parses(
406
413
  s(:send, nil, :p,
@@ -412,7 +419,7 @@ class TestParser < Minitest::Test
412
419
  s(:str, "\n"))),
413
420
  %Q{p <<~"E"\n x\n \#{" y"}\nE},
414
421
  %q{},
415
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
422
+ SINCE_2_3)
416
423
  end
417
424
 
418
425
  # Symbols
@@ -526,13 +533,13 @@ class TestParser < Minitest::Test
526
533
  [:error, :invalid_regexp, {:message => message}],
527
534
  %q[/?/],
528
535
  %q(~~~ location),
529
- ALL_VERSIONS - %w(1.8))
536
+ SINCE_1_9)
530
537
 
531
538
  assert_diagnoses(
532
539
  [:error, :invalid_regexp, {:message => message}],
533
540
  %q[/#{""}?/],
534
541
  %q(~~~~~~~~ location),
535
- ALL_VERSIONS - %w(1.8))
542
+ SINCE_1_9)
536
543
  end
537
544
 
538
545
  # Arrays
@@ -558,7 +565,7 @@ class TestParser < Minitest::Test
558
565
  | ^ operator (splat)
559
566
  | ~~~~ expression (splat)
560
567
  |~~~~~~~~~~~~ expression},
561
- ALL_VERSIONS - %w(1.8))
568
+ SINCE_1_9)
562
569
 
563
570
  assert_parses(
564
571
  s(:array,
@@ -592,7 +599,7 @@ class TestParser < Minitest::Test
592
599
  s(:hash, s(:pair, s(:int, 2), s(:int, 3)))),
593
600
  %q{[ 1, 2 => 3 ]},
594
601
  %q{},
595
- ALL_VERSIONS - %w(1.8))
602
+ SINCE_1_9)
596
603
  end
597
604
 
598
605
  def test_array_words
@@ -651,7 +658,7 @@ class TestParser < Minitest::Test
651
658
  | ^ end
652
659
  | ~~~ expression (sym)
653
660
  |~~~~~~~~~~~ expression},
654
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
661
+ SINCE_2_0)
655
662
  end
656
663
 
657
664
  def test_array_symbols_interp
@@ -668,7 +675,7 @@ class TestParser < Minitest::Test
668
675
  | ~~~~~~ expression (dsym.begin)
669
676
  | ~~~ expression (dsym.begin.lvar)
670
677
  |~~~~~~~~~~~~~~ expression},
671
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
678
+ SINCE_2_0)
672
679
 
673
680
  assert_parses(
674
681
  s(:array,
@@ -677,7 +684,7 @@ class TestParser < Minitest::Test
677
684
  s(:begin, s(:lvar, :bar)))),
678
685
  %q{%I[foo#{bar}]},
679
686
  %q{},
680
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
687
+ SINCE_2_0)
681
688
  end
682
689
 
683
690
  def test_array_symbols_empty
@@ -687,13 +694,13 @@ class TestParser < Minitest::Test
687
694
  %q{^^^ begin
688
695
  | ^ end
689
696
  |~~~~ expression},
690
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
697
+ SINCE_2_0)
691
698
 
692
699
  assert_parses(
693
700
  s(:array),
694
701
  %q{%I()},
695
702
  %q{},
696
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
703
+ SINCE_2_0)
697
704
  end
698
705
 
699
706
  # Hashes
@@ -734,7 +741,7 @@ class TestParser < Minitest::Test
734
741
  | ~~~ expression (pair.sym)
735
742
  | ~~~~~~ expression (pair)
736
743
  |~~~~~~~~~~ expression},
737
- ALL_VERSIONS - %w(1.8))
744
+ SINCE_1_9)
738
745
  end
739
746
 
740
747
  def test_hash_label_end
@@ -749,7 +756,7 @@ class TestParser < Minitest::Test
749
756
  | ~~~~~ expression (pair.sym)
750
757
  | ~~~~~~~~ expression (pair)
751
758
  |~~~~~~~~~~~~ expression},
752
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0 2.1))
759
+ SINCE_2_2)
753
760
 
754
761
  assert_parses(
755
762
  s(:hash,
@@ -757,7 +764,7 @@ class TestParser < Minitest::Test
757
764
  s(:pair, s(:sym, :bar), s(:hash))),
758
765
  %q[{ 'foo': 2, 'bar': {}}],
759
766
  %q{},
760
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0 2.1))
767
+ SINCE_2_2)
761
768
 
762
769
  assert_parses(
763
770
  s(:send, nil, :f,
@@ -766,7 +773,7 @@ class TestParser < Minitest::Test
766
773
  s(:int, 1))),
767
774
  %q{f(a ? "a":1)},
768
775
  %q{},
769
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0 2.1))
776
+ SINCE_2_2)
770
777
  end
771
778
 
772
779
  def test_hash_kwsplat
@@ -777,7 +784,7 @@ class TestParser < Minitest::Test
777
784
  %q[{ foo: 2, **bar }],
778
785
  %q{ ^^ operator (kwsplat)
779
786
  | ~~~~~ expression (kwsplat)},
780
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
787
+ SINCE_2_0)
781
788
  end
782
789
 
783
790
  def test_hash_no_hashrocket
@@ -913,7 +920,7 @@ class TestParser < Minitest::Test
913
920
  s(:const, s(:const, nil, :Encoding), :UTF_8),
914
921
  %q{__ENCODING__},
915
922
  %q{~~~~~~~~~~~~ expression},
916
- ALL_VERSIONS - %w(1.8))
923
+ SINCE_1_9)
917
924
  end
918
925
 
919
926
  # defined?
@@ -1140,7 +1147,7 @@ class TestParser < Minitest::Test
1140
1147
  s(:array, s(:splat, s(:lvar, :foo)), s(:lvar, :bar))),
1141
1148
  %q{a, b = *foo, bar},
1142
1149
  %q{},
1143
- ALL_VERSIONS - %w(1.8))
1150
+ SINCE_1_9)
1144
1151
 
1145
1152
  assert_parses(
1146
1153
  s(:masgn,
@@ -1157,7 +1164,7 @@ class TestParser < Minitest::Test
1157
1164
  s(:lvar, :bar)),
1158
1165
  %q{a, *b, c = bar},
1159
1166
  %q{},
1160
- ALL_VERSIONS - %w(1.8))
1167
+ SINCE_1_9)
1161
1168
 
1162
1169
  assert_parses(
1163
1170
  s(:masgn,
@@ -1174,7 +1181,7 @@ class TestParser < Minitest::Test
1174
1181
  s(:lvar, :bar)),
1175
1182
  %q{a, *, c = bar},
1176
1183
  %q{},
1177
- ALL_VERSIONS - %w(1.8))
1184
+ SINCE_1_9)
1178
1185
 
1179
1186
  assert_parses(
1180
1187
  s(:masgn,
@@ -1190,7 +1197,7 @@ class TestParser < Minitest::Test
1190
1197
  s(:lvar, :bar)),
1191
1198
  %q{*b, c = bar},
1192
1199
  %q{},
1193
- ALL_VERSIONS - %w(1.8))
1200
+ SINCE_1_9)
1194
1201
 
1195
1202
  assert_parses(
1196
1203
  s(:masgn,
@@ -1207,7 +1214,7 @@ class TestParser < Minitest::Test
1207
1214
  s(:lvar, :bar)),
1208
1215
  %q{*, c, d = bar},
1209
1216
  %q{},
1210
- ALL_VERSIONS - %w(1.8))
1217
+ SINCE_1_9)
1211
1218
  end
1212
1219
 
1213
1220
  def test_masgn_nested
@@ -1393,7 +1400,7 @@ class TestParser < Minitest::Test
1393
1400
  s(:int, 1)),
1394
1401
  %q{::A += 1},
1395
1402
  %q{},
1396
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
1403
+ SINCE_2_0)
1397
1404
 
1398
1405
  assert_parses(
1399
1406
  s(:op_asgn,
@@ -1401,7 +1408,7 @@ class TestParser < Minitest::Test
1401
1408
  s(:int, 1)),
1402
1409
  %q{B::A += 1},
1403
1410
  %q{},
1404
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
1411
+ SINCE_2_0)
1405
1412
 
1406
1413
  assert_parses(
1407
1414
  s(:def, :x, s(:args),
@@ -1410,7 +1417,7 @@ class TestParser < Minitest::Test
1410
1417
  s(:int, 1))),
1411
1418
  %q{def x; self::A ||= 1; end},
1412
1419
  %q{},
1413
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
1420
+ SINCE_2_0)
1414
1421
 
1415
1422
  assert_parses(
1416
1423
  s(:def, :x, s(:args),
@@ -1419,7 +1426,7 @@ class TestParser < Minitest::Test
1419
1426
  s(:int, 1))),
1420
1427
  %q{def x; ::A ||= 1; end},
1421
1428
  %q{},
1422
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
1429
+ SINCE_2_0)
1423
1430
  end
1424
1431
 
1425
1432
  def test_const_op_asgn_invalid
@@ -1493,13 +1500,19 @@ class TestParser < Minitest::Test
1493
1500
  s(:send, nil, :m, s(:lvar, :foo))),
1494
1501
  %q{foo.A += m foo})
1495
1502
 
1503
+ assert_diagnoses(
1504
+ [:error, :const_reassignment],
1505
+ %q{foo::A += m foo},
1506
+ %q{ ~~ location},
1507
+ %w(1.9 mac))
1508
+
1496
1509
  assert_parses(
1497
1510
  s(:op_asgn,
1498
- s(:send, s(:lvar, :foo), :A), :+,
1511
+ s(:casgn, s(:lvar, :foo), :A), :+,
1499
1512
  s(:send, nil, :m, s(:lvar, :foo))),
1500
1513
  %q{foo::A += m foo},
1501
1514
  %q{},
1502
- ALL_VERSIONS - %w(1.8 ios))
1515
+ SINCE_2_0)
1503
1516
  end
1504
1517
 
1505
1518
  def test_op_asgn_index
@@ -1680,7 +1693,7 @@ class TestParser < Minitest::Test
1680
1693
  nil),
1681
1694
  %q{class Foo end},
1682
1695
  %q{},
1683
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 mac ios))
1696
+ SINCE_2_3)
1684
1697
  end
1685
1698
 
1686
1699
  def test_class_super
@@ -1704,7 +1717,7 @@ class TestParser < Minitest::Test
1704
1717
  nil),
1705
1718
  %q{class Foo < a:b; end},
1706
1719
  %q{},
1707
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
1720
+ SINCE_2_0)
1708
1721
  end
1709
1722
 
1710
1723
  def test_class_invalid
@@ -1940,7 +1953,7 @@ class TestParser < Minitest::Test
1940
1953
  %q{def f(foo:); end},
1941
1954
  %q{ ~~~ name (args.kwarg)
1942
1955
  | ~~~~ expression (args.kwarg)},
1943
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
1956
+ SINCE_2_1)
1944
1957
  end
1945
1958
 
1946
1959
  def test_kwoptarg
@@ -1951,7 +1964,7 @@ class TestParser < Minitest::Test
1951
1964
  %q{def f(foo: 1); end},
1952
1965
  %q{ ~~~ name (args.kwoptarg)
1953
1966
  | ~~~~~~ expression (args.kwoptarg)},
1954
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
1967
+ SINCE_2_0)
1955
1968
  end
1956
1969
 
1957
1970
  def test_kwrestarg_named
@@ -1962,7 +1975,7 @@ class TestParser < Minitest::Test
1962
1975
  %q{def f(**foo); end},
1963
1976
  %q{ ~~~ name (args.kwrestarg)
1964
1977
  | ~~~~~ expression (args.kwrestarg)},
1965
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
1978
+ SINCE_2_0)
1966
1979
  end
1967
1980
 
1968
1981
  def test_kwrestarg_unnamed
@@ -1972,7 +1985,7 @@ class TestParser < Minitest::Test
1972
1985
  nil),
1973
1986
  %q{def f(**); end},
1974
1987
  %q{ ~~ expression (args.kwrestarg)},
1975
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
1988
+ SINCE_2_0)
1976
1989
  end
1977
1990
 
1978
1991
  def test_blockarg
@@ -2017,7 +2030,7 @@ class TestParser < Minitest::Test
2017
2030
  s(:lvar, :var)),
2018
2031
  %q{def f(var = defined?(var)) var end},
2019
2032
  %q{},
2020
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
2033
+ SINCE_2_1)
2021
2034
 
2022
2035
  assert_parses(
2023
2036
  s(:def, :f,
@@ -2025,7 +2038,7 @@ class TestParser < Minitest::Test
2025
2038
  s(:lvar, :var)),
2026
2039
  %q{def f(var: defined?(var)) var end},
2027
2040
  %q{},
2028
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
2041
+ SINCE_2_1)
2029
2042
 
2030
2043
  assert_parses(
2031
2044
  s(:block,
@@ -2034,7 +2047,7 @@ class TestParser < Minitest::Test
2034
2047
  s(:lvar, :a)),
2035
2048
  %q{lambda{|;a|a}},
2036
2049
  %q{},
2037
- ALL_VERSIONS - %w(1.8))
2050
+ SINCE_1_9)
2038
2051
  end
2039
2052
 
2040
2053
  def assert_parses_args(ast, code, versions=ALL_VERSIONS)
@@ -2064,7 +2077,7 @@ class TestParser < Minitest::Test
2064
2077
  s(:arg, :p),
2065
2078
  s(:blockarg, :b)),
2066
2079
  %q{a, o=1, *r, p, &b},
2067
- ALL_VERSIONS - %w(1.8))
2080
+ SINCE_1_9)
2068
2081
 
2069
2082
  # f_arg tCOMMA f_optarg opt_f_block_arg
2070
2083
  assert_parses_args(
@@ -2082,7 +2095,7 @@ class TestParser < Minitest::Test
2082
2095
  s(:arg, :p),
2083
2096
  s(:blockarg, :b)),
2084
2097
  %q{a, o=1, p, &b},
2085
- ALL_VERSIONS - %w(1.8))
2098
+ SINCE_1_9)
2086
2099
 
2087
2100
  # f_arg tCOMMA f_rest_arg opt_f_block_arg
2088
2101
  assert_parses_args(
@@ -2100,7 +2113,7 @@ class TestParser < Minitest::Test
2100
2113
  s(:arg, :p),
2101
2114
  s(:blockarg, :b)),
2102
2115
  %q{a, *r, p, &b},
2103
- ALL_VERSIONS - %w(1.8))
2116
+ SINCE_1_9)
2104
2117
 
2105
2118
  # f_arg opt_f_block_arg
2106
2119
  assert_parses_args(
@@ -2125,7 +2138,7 @@ class TestParser < Minitest::Test
2125
2138
  s(:arg, :p),
2126
2139
  s(:blockarg, :b)),
2127
2140
  %q{o=1, *r, p, &b},
2128
- ALL_VERSIONS - %w(1.8))
2141
+ SINCE_1_9)
2129
2142
 
2130
2143
  # f_optarg opt_f_block_arg
2131
2144
  assert_parses_args(
@@ -2141,7 +2154,7 @@ class TestParser < Minitest::Test
2141
2154
  s(:arg, :p),
2142
2155
  s(:blockarg, :b)),
2143
2156
  %q{o=1, p, &b},
2144
- ALL_VERSIONS - %w(1.8))
2157
+ SINCE_1_9)
2145
2158
 
2146
2159
  # f_rest_arg opt_f_block_arg
2147
2160
  assert_parses_args(
@@ -2157,7 +2170,7 @@ class TestParser < Minitest::Test
2157
2170
  s(:arg, :p),
2158
2171
  s(:blockarg, :b)),
2159
2172
  %q{*r, p, &b},
2160
- ALL_VERSIONS - %w(1.8))
2173
+ SINCE_1_9)
2161
2174
 
2162
2175
  # f_block_arg
2163
2176
  assert_parses_args(
@@ -2180,7 +2193,7 @@ class TestParser < Minitest::Test
2180
2193
  s(:kwrestarg, :baz),
2181
2194
  s(:blockarg, :b)),
2182
2195
  %q{(foo: 1, bar: 2, **baz, &b)},
2183
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2196
+ SINCE_2_0)
2184
2197
 
2185
2198
  # f_kwarg opt_f_block_arg
2186
2199
  assert_parses_args(
@@ -2188,7 +2201,7 @@ class TestParser < Minitest::Test
2188
2201
  s(:kwoptarg, :foo, s(:int, 1)),
2189
2202
  s(:blockarg, :b)),
2190
2203
  %q{(foo: 1, &b)},
2191
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2204
+ SINCE_2_0)
2192
2205
 
2193
2206
  # f_kwrest opt_f_block_arg
2194
2207
  assert_parses_args(
@@ -2196,14 +2209,14 @@ class TestParser < Minitest::Test
2196
2209
  s(:kwrestarg, :baz),
2197
2210
  s(:blockarg, :b)),
2198
2211
  %q{**baz, &b},
2199
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2212
+ SINCE_2_0)
2200
2213
 
2201
2214
  assert_parses_args(
2202
2215
  s(:args,
2203
2216
  s(:restarg),
2204
2217
  s(:kwrestarg)),
2205
2218
  %q{*, **},
2206
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2219
+ SINCE_2_0)
2207
2220
  end
2208
2221
 
2209
2222
  def test_kwarg_no_paren
@@ -2211,16 +2224,16 @@ class TestParser < Minitest::Test
2211
2224
  s(:args,
2212
2225
  s(:kwarg, :foo)),
2213
2226
  %Q{foo:\n},
2214
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
2227
+ SINCE_2_1)
2215
2228
 
2216
2229
  assert_parses_args(
2217
2230
  s(:args,
2218
2231
  s(:kwoptarg, :foo, s(:int, -1))),
2219
2232
  %Q{foo: -1\n},
2220
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
2233
+ SINCE_2_1)
2221
2234
  end
2222
2235
 
2223
- def assert_parses_margs(ast, code, versions=ALL_VERSIONS - %w(1.8))
2236
+ def assert_parses_margs(ast, code, versions=SINCE_1_9)
2224
2237
  assert_parses_args(
2225
2238
  s(:args, ast),
2226
2239
  %Q{(#{code})},
@@ -2319,12 +2332,12 @@ class TestParser < Minitest::Test
2319
2332
  assert_parses_blockargs(
2320
2333
  s(:args, s(:shadowarg, :a)),
2321
2334
  %q{|;a|},
2322
- ALL_VERSIONS - %w(1.8))
2335
+ SINCE_1_9)
2323
2336
 
2324
2337
  assert_parses_blockargs(
2325
2338
  s(:args, s(:shadowarg, :a)),
2326
2339
  %Q{|;\na\n|},
2327
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2340
+ SINCE_2_0)
2328
2341
 
2329
2342
  # tOROP
2330
2343
  assert_parses_blockargs(
@@ -2336,9 +2349,15 @@ class TestParser < Minitest::Test
2336
2349
  # block_par tCOMMA tAMPER lhs
2337
2350
  # f_arg opt_f_block_arg
2338
2351
  # f_arg tCOMMA
2352
+ assert_parses_blockargs(
2353
+ s(:args, s(:procarg0, :a)),
2354
+ %q{|a|},
2355
+ SINCE_1_9)
2356
+
2339
2357
  assert_parses_blockargs(
2340
2358
  s(:args, s(:arg, :a)),
2341
- %q{|a|})
2359
+ %q{|a|},
2360
+ %w(1.8))
2342
2361
 
2343
2362
  assert_parses_blockargs(
2344
2363
  s(:args, s(:arg, :a), s(:arg, :c)),
@@ -2350,7 +2369,7 @@ class TestParser < Minitest::Test
2350
2369
  %w(1.8))
2351
2370
 
2352
2371
  assert_parses_blockargs(
2353
- s(:args, s(:mlhs, s(:arg, :a))),
2372
+ s(:args, s(:arg, :a)),
2354
2373
  %q{|a,|}
2355
2374
  )
2356
2375
 
@@ -2466,7 +2485,7 @@ class TestParser < Minitest::Test
2466
2485
  s(:restarg, :r),
2467
2486
  s(:blockarg, :b)),
2468
2487
  %q{|a, o=1, o1=2, *r, &b|},
2469
- ALL_VERSIONS - %w(1.8))
2488
+ SINCE_1_9)
2470
2489
 
2471
2490
  # f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
2472
2491
  assert_parses_blockargs(
@@ -2477,7 +2496,7 @@ class TestParser < Minitest::Test
2477
2496
  s(:arg, :p),
2478
2497
  s(:blockarg, :b)),
2479
2498
  %q{|a, o=1, *r, p, &b|},
2480
- ALL_VERSIONS - %w(1.8))
2499
+ SINCE_1_9)
2481
2500
 
2482
2501
  # f_arg tCOMMA f_block_optarg opt_f_block_arg
2483
2502
  assert_parses_blockargs(
@@ -2486,7 +2505,7 @@ class TestParser < Minitest::Test
2486
2505
  s(:optarg, :o, s(:int, 1)),
2487
2506
  s(:blockarg, :b)),
2488
2507
  %q{|a, o=1, &b|},
2489
- ALL_VERSIONS - %w(1.8))
2508
+ SINCE_1_9)
2490
2509
 
2491
2510
  # f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_f_block_arg
2492
2511
  assert_parses_blockargs(
@@ -2496,7 +2515,7 @@ class TestParser < Minitest::Test
2496
2515
  s(:arg, :p),
2497
2516
  s(:blockarg, :b)),
2498
2517
  %q{|a, o=1, p, &b|},
2499
- ALL_VERSIONS - %w(1.8))
2518
+ SINCE_1_9)
2500
2519
 
2501
2520
  # f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
2502
2521
  assert_parses_blockargs(
@@ -2506,7 +2525,7 @@ class TestParser < Minitest::Test
2506
2525
  s(:arg, :p),
2507
2526
  s(:blockarg, :b)),
2508
2527
  %q{|a, *r, p, &b|},
2509
- ALL_VERSIONS - %w(1.8))
2528
+ SINCE_1_9)
2510
2529
 
2511
2530
  # f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
2512
2531
  assert_parses_blockargs(
@@ -2515,7 +2534,7 @@ class TestParser < Minitest::Test
2515
2534
  s(:restarg, :r),
2516
2535
  s(:blockarg, :b)),
2517
2536
  %q{|o=1, *r, &b|},
2518
- ALL_VERSIONS - %w(1.8))
2537
+ SINCE_1_9)
2519
2538
 
2520
2539
  # f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
2521
2540
  assert_parses_blockargs(
@@ -2525,7 +2544,7 @@ class TestParser < Minitest::Test
2525
2544
  s(:arg, :p),
2526
2545
  s(:blockarg, :b)),
2527
2546
  %q{|o=1, *r, p, &b|},
2528
- ALL_VERSIONS - %w(1.8))
2547
+ SINCE_1_9)
2529
2548
 
2530
2549
  # f_block_optarg opt_f_block_arg
2531
2550
  assert_parses_blockargs(
@@ -2533,7 +2552,7 @@ class TestParser < Minitest::Test
2533
2552
  s(:optarg, :o, s(:int, 1)),
2534
2553
  s(:blockarg, :b)),
2535
2554
  %q{|o=1, &b|},
2536
- ALL_VERSIONS - %w(1.8))
2555
+ SINCE_1_9)
2537
2556
 
2538
2557
  # f_block_optarg tCOMMA f_arg opt_f_block_arg
2539
2558
  assert_parses_blockargs(
@@ -2542,7 +2561,7 @@ class TestParser < Minitest::Test
2542
2561
  s(:arg, :p),
2543
2562
  s(:blockarg, :b)),
2544
2563
  %q{|o=1, p, &b|},
2545
- ALL_VERSIONS - %w(1.8))
2564
+ SINCE_1_9)
2546
2565
 
2547
2566
  # f_rest_arg tCOMMA f_arg opt_f_block_arg
2548
2567
  assert_parses_blockargs(
@@ -2551,7 +2570,26 @@ class TestParser < Minitest::Test
2551
2570
  s(:arg, :p),
2552
2571
  s(:blockarg, :b)),
2553
2572
  %q{|*r, p, &b|},
2554
- ALL_VERSIONS - %w(1.8))
2573
+ SINCE_1_9)
2574
+ end
2575
+
2576
+ def test_multiple_args_with_trailing_comma
2577
+ assert_parses_blockargs(
2578
+ s(:args,
2579
+ s(:arg, :a),
2580
+ s(:arg, :b)),
2581
+ %q(|a, b,|)
2582
+ )
2583
+ end
2584
+
2585
+ def test_procarg0_legacy
2586
+ Parser::Builders::Default.emit_procarg0 = false
2587
+ assert_parses_blockargs(
2588
+ s(:args,
2589
+ s(:arg, :a)),
2590
+ %q{|a|}
2591
+ )
2592
+ Parser::Builders::Default.emit_procarg0 = true
2555
2593
  end
2556
2594
 
2557
2595
  def test_block_kwarg_combinations
@@ -2563,7 +2601,7 @@ class TestParser < Minitest::Test
2563
2601
  s(:kwrestarg, :baz),
2564
2602
  s(:blockarg, :b)),
2565
2603
  %q{|foo: 1, bar: 2, **baz, &b|},
2566
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2604
+ SINCE_2_0)
2567
2605
 
2568
2606
  # f_block_kwarg opt_f_block_arg
2569
2607
  assert_parses_blockargs(
@@ -2571,7 +2609,7 @@ class TestParser < Minitest::Test
2571
2609
  s(:kwoptarg, :foo, s(:int, 1)),
2572
2610
  s(:blockarg, :b)),
2573
2611
  %q{|foo: 1, &b|},
2574
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2612
+ SINCE_2_0)
2575
2613
 
2576
2614
  # f_kwrest opt_f_block_arg
2577
2615
  assert_parses_blockargs(
@@ -2579,7 +2617,7 @@ class TestParser < Minitest::Test
2579
2617
  s(:kwrestarg, :baz),
2580
2618
  s(:blockarg, :b)),
2581
2619
  %q{|**baz, &b|},
2582
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2620
+ SINCE_2_0)
2583
2621
  end
2584
2622
 
2585
2623
  def test_block_kwarg
@@ -2587,7 +2625,7 @@ class TestParser < Minitest::Test
2587
2625
  s(:args,
2588
2626
  s(:kwarg, :foo)),
2589
2627
  %q{|foo:|},
2590
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
2628
+ SINCE_2_1)
2591
2629
  end
2592
2630
 
2593
2631
  def test_arg_invalid
@@ -2642,14 +2680,14 @@ class TestParser < Minitest::Test
2642
2680
  %q{def foo(aa, (bb, aa)); end},
2643
2681
  %q{ ^^ location
2644
2682
  | ~~ highlights (0)},
2645
- ALL_VERSIONS - %w(1.8))
2683
+ SINCE_1_9)
2646
2684
 
2647
2685
  assert_diagnoses(
2648
2686
  [:error, :duplicate_argument],
2649
2687
  %q{def foo(aa, *r, aa); end},
2650
2688
  %q{ ^^ location
2651
2689
  | ~~ highlights (0)},
2652
- ALL_VERSIONS - %w(1.8))
2690
+ SINCE_1_9)
2653
2691
 
2654
2692
 
2655
2693
  assert_diagnoses(
@@ -2657,28 +2695,28 @@ class TestParser < Minitest::Test
2657
2695
  %q{lambda do |aa; aa| end},
2658
2696
  %q{ ^^ location
2659
2697
  | ~~ highlights (0)},
2660
- ALL_VERSIONS - %w(1.8))
2698
+ SINCE_1_9)
2661
2699
 
2662
2700
  assert_diagnoses(
2663
2701
  [:error, :duplicate_argument],
2664
2702
  %q{def foo(aa, aa: 1); end},
2665
2703
  %q{ ^^ location
2666
2704
  | ~~ highlights (0)},
2667
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2705
+ SINCE_2_0)
2668
2706
 
2669
2707
  assert_diagnoses(
2670
2708
  [:error, :duplicate_argument],
2671
2709
  %q{def foo(aa, **aa); end},
2672
2710
  %q{ ^^ location
2673
2711
  | ~~ highlights (0)},
2674
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2712
+ SINCE_2_0)
2675
2713
 
2676
2714
  assert_diagnoses(
2677
2715
  [:error, :duplicate_argument],
2678
2716
  %q{def foo(aa, aa:); end},
2679
2717
  %q{ ^^ location
2680
2718
  | ~~ highlights (0)},
2681
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
2719
+ SINCE_2_1)
2682
2720
  end
2683
2721
 
2684
2722
  def test_arg_duplicate_ignored
@@ -2694,7 +2732,7 @@ class TestParser < Minitest::Test
2694
2732
  nil),
2695
2733
  %q{def foo(_, _); end},
2696
2734
  %q{},
2697
- ALL_VERSIONS - %w(1.8))
2735
+ SINCE_1_9)
2698
2736
 
2699
2737
  assert_diagnoses(
2700
2738
  [:error, :duplicate_argument],
@@ -2708,7 +2746,7 @@ class TestParser < Minitest::Test
2708
2746
  nil),
2709
2747
  %q{def foo(_a, _a); end},
2710
2748
  %q{},
2711
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2749
+ SINCE_2_0)
2712
2750
  end
2713
2751
 
2714
2752
  def test_arg_duplicate_proc
@@ -2724,7 +2762,7 @@ class TestParser < Minitest::Test
2724
2762
  [:error, :duplicate_argument],
2725
2763
  %q{proc{|a,a|}},
2726
2764
  %q{},
2727
- ALL_VERSIONS - %w(1.8))
2765
+ SINCE_1_9)
2728
2766
  end
2729
2767
 
2730
2768
  def test_kwarg_invalid
@@ -2732,13 +2770,13 @@ class TestParser < Minitest::Test
2732
2770
  [:error, :argument_const],
2733
2771
  %q{def foo(Abc: 1); end},
2734
2772
  %q{ ~~~~ location},
2735
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2773
+ SINCE_2_0)
2736
2774
 
2737
2775
  assert_diagnoses(
2738
2776
  [:error, :argument_const],
2739
2777
  %q{def foo(Abc:); end},
2740
2778
  %q{ ~~~~ location},
2741
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
2779
+ SINCE_2_1)
2742
2780
  end
2743
2781
 
2744
2782
  def test_arg_label
@@ -2747,14 +2785,14 @@ class TestParser < Minitest::Test
2747
2785
  s(:send, nil, :a, s(:sym, :b))),
2748
2786
  %q{def foo() a:b end},
2749
2787
  %q{},
2750
- ALL_VERSIONS - %w(1.8))
2788
+ SINCE_1_9)
2751
2789
 
2752
2790
  assert_parses(
2753
2791
  s(:def, :foo, s(:args),
2754
2792
  s(:send, nil, :a, s(:sym, :b))),
2755
2793
  %Q{def foo\n a:b end},
2756
2794
  %q{},
2757
- ALL_VERSIONS - %w(1.8))
2795
+ SINCE_1_9)
2758
2796
 
2759
2797
  assert_parses(
2760
2798
  s(:block,
@@ -2764,7 +2802,7 @@ class TestParser < Minitest::Test
2764
2802
  s(:sym, :b))),
2765
2803
  %Q{f { || a:b }},
2766
2804
  %q{},
2767
- ALL_VERSIONS - %w(1.8))
2805
+ SINCE_1_9)
2768
2806
  end
2769
2807
 
2770
2808
  #
@@ -2915,7 +2953,7 @@ class TestParser < Minitest::Test
2915
2953
  [:warning, :ambiguous_prefix, { :prefix => '**' }],
2916
2954
  %q{m **foo},
2917
2955
  %q{ ^^ location},
2918
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
2956
+ SINCE_2_0)
2919
2957
  end
2920
2958
 
2921
2959
  def test_send_block_chain_cmd
@@ -2977,7 +3015,7 @@ class TestParser < Minitest::Test
2977
3015
  s(:args), nil),
2978
3016
  %q{meth 1 do end.fun bar do end},
2979
3017
  %q{},
2980
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
3018
+ SINCE_2_0)
2981
3019
 
2982
3020
  assert_parses(
2983
3021
  s(:block,
@@ -2989,7 +3027,7 @@ class TestParser < Minitest::Test
2989
3027
  s(:args), nil),
2990
3028
  %q{meth 1 do end.fun(bar) {}},
2991
3029
  %q{},
2992
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
3030
+ SINCE_2_0)
2993
3031
 
2994
3032
  assert_parses(
2995
3033
  s(:block,
@@ -3001,7 +3039,7 @@ class TestParser < Minitest::Test
3001
3039
  s(:args), nil),
3002
3040
  %q{meth 1 do end.fun {}},
3003
3041
  %q{},
3004
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
3042
+ SINCE_2_0)
3005
3043
  end
3006
3044
 
3007
3045
  def test_send_paren_block_cmd
@@ -3098,7 +3136,7 @@ class TestParser < Minitest::Test
3098
3136
  s(:send, s(:lvar, :foo), :'!=', s(:int, 1)),
3099
3137
  %q{foo != 1},
3100
3138
  %q{},
3101
- ALL_VERSIONS - %w(1.8))
3139
+ SINCE_1_9)
3102
3140
 
3103
3141
  assert_parses(
3104
3142
  s(:send, s(:lvar, :foo), :===, s(:int, 1)),
@@ -3118,7 +3156,7 @@ class TestParser < Minitest::Test
3118
3156
  s(:send, s(:lvar, :foo), :'!~', s(:int, 1)),
3119
3157
  %q{foo !~ 1},
3120
3158
  %q{},
3121
- ALL_VERSIONS - %w(1.8))
3159
+ SINCE_1_9)
3122
3160
 
3123
3161
  assert_parses(
3124
3162
  s(:send, s(:lvar, :foo), :<<, s(:int, 1)),
@@ -3156,7 +3194,7 @@ class TestParser < Minitest::Test
3156
3194
  s(:send, s(:lvar, :foo), :'!'),
3157
3195
  %q{!foo},
3158
3196
  %{},
3159
- ALL_VERSIONS - %w(1.8))
3197
+ SINCE_1_9)
3160
3198
  end
3161
3199
 
3162
3200
  def test_bang_cmd
@@ -3170,7 +3208,7 @@ class TestParser < Minitest::Test
3170
3208
  s(:send, s(:send, nil, :m, s(:lvar, :foo)), :'!'),
3171
3209
  %q{!m foo},
3172
3210
  %{},
3173
- ALL_VERSIONS - %w(1.8))
3211
+ SINCE_1_9)
3174
3212
  end
3175
3213
 
3176
3214
  def test_not
@@ -3184,19 +3222,19 @@ class TestParser < Minitest::Test
3184
3222
  s(:send, s(:lvar, :foo), :'!'),
3185
3223
  %q{not foo},
3186
3224
  %{},
3187
- ALL_VERSIONS - %w(1.8))
3225
+ SINCE_1_9)
3188
3226
 
3189
3227
  assert_parses(
3190
3228
  s(:send, s(:lvar, :foo), :'!'),
3191
3229
  %q{not(foo)},
3192
3230
  %q{~~~~~~~~ expression},
3193
- ALL_VERSIONS - %w(1.8))
3231
+ SINCE_1_9)
3194
3232
 
3195
3233
  assert_parses(
3196
3234
  s(:send, s(:begin), :'!'),
3197
3235
  %q{not()},
3198
3236
  %q{~~~~~ expression},
3199
- ALL_VERSIONS - %w(1.8))
3237
+ SINCE_1_9)
3200
3238
  end
3201
3239
 
3202
3240
  def test_not_cmd
@@ -3210,7 +3248,7 @@ class TestParser < Minitest::Test
3210
3248
  s(:send, s(:send, nil, :m, s(:lvar, :foo)), :'!'),
3211
3249
  %q{not m foo},
3212
3250
  %{},
3213
- ALL_VERSIONS - %w(1.8))
3251
+ SINCE_1_9)
3214
3252
  end
3215
3253
 
3216
3254
  def test_pow_precedence
@@ -3292,7 +3330,7 @@ class TestParser < Minitest::Test
3292
3330
  | ^ begin
3293
3331
  | ^ end
3294
3332
  |~~~~~ expression},
3295
- ALL_VERSIONS - %w(1.8))
3333
+ SINCE_1_9)
3296
3334
 
3297
3335
  assert_parses(
3298
3336
  s(:block, s(:lambda),
@@ -3303,7 +3341,7 @@ class TestParser < Minitest::Test
3303
3341
  | ^ end
3304
3342
  | ^ expression (args.restarg)
3305
3343
  |~~~~~~~~ expression},
3306
- ALL_VERSIONS - %w(1.8))
3344
+ SINCE_1_9)
3307
3345
 
3308
3346
  assert_parses(
3309
3347
  s(:block, s(:lambda),
@@ -3313,7 +3351,7 @@ class TestParser < Minitest::Test
3313
3351
  | ^^ begin
3314
3352
  | ^^^ end
3315
3353
  |~~~~~~~~~ expression},
3316
- ALL_VERSIONS - %w(1.8))
3354
+ SINCE_1_9)
3317
3355
  end
3318
3356
 
3319
3357
  def test_send_lambda_args
@@ -3329,7 +3367,7 @@ class TestParser < Minitest::Test
3329
3367
  | ^ begin
3330
3368
  | ^ end
3331
3369
  |~~~~~~~~~ expression},
3332
- ALL_VERSIONS - %w(1.8))
3370
+ SINCE_1_9)
3333
3371
 
3334
3372
  assert_parses(
3335
3373
  s(:block, s(:lambda),
@@ -3338,7 +3376,7 @@ class TestParser < Minitest::Test
3338
3376
  nil),
3339
3377
  %q{-> (a) { }},
3340
3378
  %q{},
3341
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
3379
+ SINCE_2_0)
3342
3380
  end
3343
3381
 
3344
3382
  def test_send_lambda_args_shadow
@@ -3351,7 +3389,7 @@ class TestParser < Minitest::Test
3351
3389
  nil),
3352
3390
  %q{->(a; foo, bar) { }},
3353
3391
  %q{ ~~~ expression (args.shadowarg)},
3354
- ALL_VERSIONS - %w(1.8))
3392
+ SINCE_1_9)
3355
3393
  end
3356
3394
 
3357
3395
  def test_send_lambda_args_noparen
@@ -3362,7 +3400,7 @@ class TestParser < Minitest::Test
3362
3400
  nil),
3363
3401
  %q{-> a: 1 { }},
3364
3402
  %q{},
3365
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
3403
+ SINCE_2_0)
3366
3404
 
3367
3405
  assert_parses(
3368
3406
  s(:block, s(:lambda),
@@ -3371,7 +3409,7 @@ class TestParser < Minitest::Test
3371
3409
  nil),
3372
3410
  %q{-> a: { }},
3373
3411
  %q{},
3374
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
3412
+ SINCE_2_1)
3375
3413
  end
3376
3414
 
3377
3415
  def test_send_lambda_legacy
@@ -3384,7 +3422,7 @@ class TestParser < Minitest::Test
3384
3422
  | ^ begin
3385
3423
  | ^ end
3386
3424
  |~~~~~ expression},
3387
- ALL_VERSIONS - %w(1.8))
3425
+ SINCE_1_9)
3388
3426
  Parser::Builders::Default.emit_lambda = true
3389
3427
  end
3390
3428
 
@@ -3397,7 +3435,7 @@ class TestParser < Minitest::Test
3397
3435
  | ^ end
3398
3436
  | ^ dot
3399
3437
  |~~~~~~~ expression},
3400
- ALL_VERSIONS - %w(1.8))
3438
+ SINCE_1_9)
3401
3439
 
3402
3440
  assert_parses(
3403
3441
  s(:send, s(:lvar, :foo), :call,
@@ -3407,7 +3445,7 @@ class TestParser < Minitest::Test
3407
3445
  | ^ end
3408
3446
  | ^^ dot
3409
3447
  |~~~~~~~~ expression},
3410
- ALL_VERSIONS - %w(1.8))
3448
+ SINCE_1_9)
3411
3449
  end
3412
3450
 
3413
3451
  def test_send_conditional
@@ -3415,7 +3453,7 @@ class TestParser < Minitest::Test
3415
3453
  s(:csend, s(:send, nil, :a), :b),
3416
3454
  %q{a&.b},
3417
3455
  %q{ ^^ dot},
3418
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
3456
+ SINCE_2_3)
3419
3457
  end
3420
3458
 
3421
3459
  def test_send_attr_asgn_conditional
@@ -3423,7 +3461,7 @@ class TestParser < Minitest::Test
3423
3461
  s(:csend, s(:send, nil, :a), :b=, s(:int, 1)),
3424
3462
  %q{a&.b = 1},
3425
3463
  %q{ ^^ dot},
3426
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
3464
+ SINCE_2_3)
3427
3465
  end
3428
3466
 
3429
3467
  def test_send_block_conditional
@@ -3434,7 +3472,7 @@ class TestParser < Minitest::Test
3434
3472
  s(:args), nil),
3435
3473
  %q{foo&.bar {}},
3436
3474
  %q{},
3437
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
3475
+ SINCE_2_3)
3438
3476
  end
3439
3477
 
3440
3478
  def test_send_op_asgn_conditional
@@ -3442,7 +3480,7 @@ class TestParser < Minitest::Test
3442
3480
  s(:and_asgn, s(:csend, s(:send, nil, :a), :b), s(:int, 1)),
3443
3481
  %q{a&.b &&= 1},
3444
3482
  %q{},
3445
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
3483
+ SINCE_2_3)
3446
3484
  end
3447
3485
 
3448
3486
  def test_lvar_injecting_match
@@ -3457,7 +3495,7 @@ class TestParser < Minitest::Test
3457
3495
  %q{/(?<match>bar)/ =~ 'bar'; match},
3458
3496
  %q{ ~~ selector (match_with_lvasgn)
3459
3497
  |~~~~~~~~~~~~~~~~~~~~~~~~ expression (match_with_lvasgn)},
3460
- ALL_VERSIONS - %w(1.8))
3498
+ SINCE_1_9)
3461
3499
  end
3462
3500
 
3463
3501
  def test_non_lvar_injecting_match
@@ -3614,7 +3652,7 @@ class TestParser < Minitest::Test
3614
3652
  s(:lvar, :bar)),
3615
3653
  %q{foo[bar,]},
3616
3654
  %q{},
3617
- ALL_VERSIONS - %w(1.8))
3655
+ SINCE_1_9)
3618
3656
  end
3619
3657
 
3620
3658
  def test_args_assocs
@@ -3655,7 +3693,7 @@ class TestParser < Minitest::Test
3655
3693
  s(:hash, s(:pair, s(:sym, :baz), s(:int, 1)))),
3656
3694
  %q{foo[:baz => 1,]},
3657
3695
  %q{},
3658
- ALL_VERSIONS - %w(1.8))
3696
+ SINCE_1_9)
3659
3697
  end
3660
3698
 
3661
3699
  def test_args_args_assocs
@@ -3680,7 +3718,7 @@ class TestParser < Minitest::Test
3680
3718
  s(:hash, s(:pair, s(:sym, :baz), s(:int, 1)))),
3681
3719
  %q{foo[bar, :baz => 1,]},
3682
3720
  %q{},
3683
- ALL_VERSIONS - %w(1.8))
3721
+ SINCE_1_9)
3684
3722
  end
3685
3723
 
3686
3724
  def test_args_args_assocs_star
@@ -3748,7 +3786,7 @@ class TestParser < Minitest::Test
3748
3786
  s(:args), nil),
3749
3787
  %q{foo.fun (1) {}},
3750
3788
  %q{},
3751
- ALL_VERSIONS - %w(1.8))
3789
+ SINCE_1_9)
3752
3790
 
3753
3791
  assert_parses(
3754
3792
  s(:block,
@@ -3764,7 +3802,7 @@ class TestParser < Minitest::Test
3764
3802
  s(:args), nil),
3765
3803
  %q{foo::fun (1) {}},
3766
3804
  %q{},
3767
- ALL_VERSIONS - %w(1.8))
3805
+ SINCE_1_9)
3768
3806
  end
3769
3807
 
3770
3808
  def test_space_args_hash_literal_then_block
@@ -3775,8 +3813,7 @@ class TestParser < Minitest::Test
3775
3813
  s(:args),
3776
3814
  s(:int, 1)),
3777
3815
  %q{f 1, {1 => 2} {1}},
3778
- %q{},
3779
- ALL_VERSIONS)
3816
+ %q{})
3780
3817
  end
3781
3818
 
3782
3819
  def test_space_args_arg_call
@@ -4019,7 +4056,7 @@ class TestParser < Minitest::Test
4019
4056
  s(:args), nil),
4020
4057
  %q{fun () {}},
4021
4058
  %q{ ~~ expression (send.begin)},
4022
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
4059
+ SINCE_2_0)
4023
4060
  end
4024
4061
 
4025
4062
  #
@@ -4204,7 +4241,7 @@ class TestParser < Minitest::Test
4204
4241
  s(:const, nil, :T))),
4205
4242
  %q{t=1;(foo)?t:T},
4206
4243
  %q{},
4207
- ALL_VERSIONS - %w(1.8))
4244
+ SINCE_1_9)
4208
4245
  end
4209
4246
 
4210
4247
  def test_if_masgn
@@ -4221,7 +4258,7 @@ class TestParser < Minitest::Test
4221
4258
  s(:begin, nil), nil, nil),
4222
4259
  %q{if (a, b = foo); end},
4223
4260
  %q{},
4224
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 2.3 ios mac))
4261
+ SINCE_2_4)
4225
4262
  end
4226
4263
 
4227
4264
  def test_if_mod_masgn
@@ -4548,7 +4585,7 @@ class TestParser < Minitest::Test
4548
4585
  %q{break(foo)},
4549
4586
  %q{~~~~~ keyword
4550
4587
  |~~~~~~~~~~ expression},
4551
- ALL_VERSIONS - %w(1.8))
4588
+ SINCE_1_9)
4552
4589
 
4553
4590
  assert_parses(
4554
4591
  s(:break, s(:begin, s(:lvar, :foo))),
@@ -4568,7 +4605,7 @@ class TestParser < Minitest::Test
4568
4605
  %q{break()},
4569
4606
  %q{~~~~~ keyword
4570
4607
  |~~~~~~~ expression},
4571
- ALL_VERSIONS - %w(1.8))
4608
+ SINCE_1_9)
4572
4609
 
4573
4610
  assert_parses(
4574
4611
  s(:break),
@@ -4595,7 +4632,7 @@ class TestParser < Minitest::Test
4595
4632
  %q{return(foo)},
4596
4633
  %q{~~~~~~ keyword
4597
4634
  |~~~~~~~~~~~ expression},
4598
- ALL_VERSIONS - %w(1.8))
4635
+ SINCE_1_9)
4599
4636
 
4600
4637
  assert_parses(
4601
4638
  s(:return, s(:begin, s(:lvar, :foo))),
@@ -4615,7 +4652,7 @@ class TestParser < Minitest::Test
4615
4652
  %q{return()},
4616
4653
  %q{~~~~~~ keyword
4617
4654
  |~~~~~~~~ expression},
4618
- ALL_VERSIONS - %w(1.8))
4655
+ SINCE_1_9)
4619
4656
 
4620
4657
  assert_parses(
4621
4658
  s(:return),
@@ -4642,7 +4679,7 @@ class TestParser < Minitest::Test
4642
4679
  %q{next(foo)},
4643
4680
  %q{~~~~ keyword
4644
4681
  |~~~~~~~~~ expression},
4645
- ALL_VERSIONS - %w(1.8))
4682
+ SINCE_1_9)
4646
4683
 
4647
4684
  assert_parses(
4648
4685
  s(:next, s(:begin, s(:lvar, :foo))),
@@ -4662,7 +4699,7 @@ class TestParser < Minitest::Test
4662
4699
  %q{next()},
4663
4700
  %q{~~~~ keyword
4664
4701
  |~~~~~~ expression},
4665
- ALL_VERSIONS - %w(1.8))
4702
+ SINCE_1_9)
4666
4703
 
4667
4704
  assert_parses(
4668
4705
  s(:next),
@@ -4720,6 +4757,13 @@ class TestParser < Minitest::Test
4720
4757
  end
4721
4758
 
4722
4759
  def test_rescue_else_useless
4760
+ assert_parses(
4761
+ s(:kwbegin,
4762
+ s(:begin,
4763
+ s(:int, 2))),
4764
+ %q{begin; else; 2; end},
4765
+ %q{ ~~~~ begin (begin)})
4766
+
4723
4767
  assert_parses(
4724
4768
  s(:kwbegin,
4725
4769
  s(:int, 1),
@@ -4840,7 +4884,7 @@ class TestParser < Minitest::Test
4840
4884
  | ~~~~~~~~~~ expression (rescue.resbody)
4841
4885
  | ~~~~~~~~~~~~~~~ expression (rescue)
4842
4886
  |~~~~~~~~~~~~~~~~~~~~~~ expression},
4843
- ALL_VERSIONS - %w(1.8))
4887
+ SINCE_1_9)
4844
4888
  end
4845
4889
 
4846
4890
  def test_resbody_list
@@ -4982,7 +5026,7 @@ class TestParser < Minitest::Test
4982
5026
  s(:int, 1)))),
4983
5027
  %q{p begin 1.times do 1 end end},
4984
5028
  %{},
4985
- ALL_VERSIONS - %w(1.8 1.9 mac ios))
5029
+ SINCE_2_0)
4986
5030
  end
4987
5031
 
4988
5032
  def test_bug_cmdarg
@@ -5007,7 +5051,7 @@ class TestParser < Minitest::Test
5007
5051
  s(:pair, s(:sym, :do), s(:true)))),
5008
5052
  %q{assert do: true},
5009
5053
  %q{},
5010
- ALL_VERSIONS - %w(1.8))
5054
+ SINCE_1_9)
5011
5055
 
5012
5056
  assert_parses(
5013
5057
  s(:send, nil, :f,
@@ -5022,7 +5066,7 @@ class TestParser < Minitest::Test
5022
5066
  s(:args), nil))))),
5023
5067
  %q{f x: -> do meth do end end},
5024
5068
  %q{},
5025
- ALL_VERSIONS - %w(1.8))
5069
+ SINCE_1_9)
5026
5070
  end
5027
5071
 
5028
5072
  def test_file_line_non_literals
@@ -5069,7 +5113,7 @@ class TestParser < Minitest::Test
5069
5113
  s(:str, "")),
5070
5114
  %q{/\xa8/n =~ ""}.force_encoding(Encoding::UTF_8),
5071
5115
  %{},
5072
- ALL_VERSIONS - %w(1.8))
5116
+ SINCE_1_9)
5073
5117
  end
5074
5118
  end
5075
5119
 
@@ -5101,7 +5145,7 @@ class TestParser < Minitest::Test
5101
5145
  [:error, :unicode_point_too_large],
5102
5146
  %q{"\u{120 120000}"},
5103
5147
  %q{ ~~~~~~ location},
5104
- ALL_VERSIONS - %w(1.8))
5148
+ SINCE_1_9)
5105
5149
  end
5106
5150
 
5107
5151
  def test_on_error
@@ -5224,7 +5268,7 @@ class TestParser < Minitest::Test
5224
5268
  nil))),
5225
5269
  %q{bar def foo; self.each do end end},
5226
5270
  %q{},
5227
- ALL_VERSIONS - %w(1.8))
5271
+ SINCE_1_9)
5228
5272
  end
5229
5273
 
5230
5274
  def test_bug_do_block_in_cmdarg
@@ -5261,7 +5305,7 @@ class TestParser < Minitest::Test
5261
5305
  s(:while, s(:send, s(:begin, s(:true)), :"!"), nil),
5262
5306
  %q{while not (true) do end},
5263
5307
  %q{},
5264
- ALL_VERSIONS - %w(1.8))
5308
+ SINCE_1_9)
5265
5309
  end
5266
5310
 
5267
5311
  def test_bug_rescue_empty_else
@@ -5322,14 +5366,14 @@ class TestParser < Minitest::Test
5322
5366
  [:error, :invalid_encoding],
5323
5367
  %q{?\xc3},
5324
5368
  %q{^^^^^ location},
5325
- ALL_VERSIONS - %w(1.8))
5369
+ SINCE_1_9)
5326
5370
 
5327
5371
  assert_parses(
5328
5372
  s(:str, "проверка"),
5329
5373
  %q{# coding:utf-8
5330
5374
  "\xD0\xBF\xD1\x80\xD0\xBE\xD0\xB2\xD0\xB5\xD1\x80\xD0\xBA\xD0\xB0"},
5331
5375
  %q{},
5332
- ALL_VERSIONS - %w(1.8))
5376
+ SINCE_1_9)
5333
5377
  end
5334
5378
 
5335
5379
  def test_ruby_bug_9669
@@ -5337,7 +5381,7 @@ class TestParser < Minitest::Test
5337
5381
  s(:def, :a, s(:args, s(:kwarg, :b)), s(:return)),
5338
5382
  %Q{def a b:\nreturn\nend},
5339
5383
  %q{},
5340
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
5384
+ SINCE_2_1)
5341
5385
 
5342
5386
  assert_parses(
5343
5387
  s(:lvasgn, :o,
@@ -5345,7 +5389,7 @@ class TestParser < Minitest::Test
5345
5389
  s(:pair, s(:sym, :a), s(:int, 1)))),
5346
5390
  %Q{o = {\na:\n1\n}},
5347
5391
  %q{},
5348
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
5392
+ SINCE_2_1)
5349
5393
  end
5350
5394
 
5351
5395
  def test_ruby_bug_10279
@@ -5355,10 +5399,25 @@ class TestParser < Minitest::Test
5355
5399
  s(:if, s(:true), s(:int, 42), nil))),
5356
5400
  %q{{a: if true then 42 end}},
5357
5401
  %q{},
5358
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0))
5402
+ SINCE_2_1)
5359
5403
  end
5360
5404
 
5361
5405
  def test_ruby_bug_10653
5406
+ assert_parses(
5407
+ s(:if,
5408
+ s(:true),
5409
+ s(:block,
5410
+ s(:send,
5411
+ s(:int, 1), :tap),
5412
+ s(:args,
5413
+ s(:procarg0, :n)),
5414
+ s(:send, nil, :p,
5415
+ s(:lvar, :n))),
5416
+ s(:int, 0)),
5417
+ %q{true ? 1.tap do |n| p n end : 0},
5418
+ %q{},
5419
+ SINCE_1_9)
5420
+
5362
5421
  assert_parses(
5363
5422
  s(:if,
5364
5423
  s(:true),
@@ -5372,7 +5431,7 @@ class TestParser < Minitest::Test
5372
5431
  s(:int, 0)),
5373
5432
  %q{true ? 1.tap do |n| p n end : 0},
5374
5433
  %q{},
5375
- ALL_VERSIONS)
5434
+ %w(1.8))
5376
5435
 
5377
5436
  assert_parses(
5378
5437
  s(:if,
@@ -5410,7 +5469,7 @@ class TestParser < Minitest::Test
5410
5469
  s(:block, s(:send, nil, :a), s(:args), nil))),
5411
5470
  %q{p ->() do a() do end end},
5412
5471
  %q{},
5413
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0)) # no 1.9 backport
5472
+ SINCE_2_1) # no 1.9 backport
5414
5473
  end
5415
5474
 
5416
5475
  def test_ruby_bug_11380
@@ -5427,7 +5486,7 @@ class TestParser < Minitest::Test
5427
5486
  nil),
5428
5487
  %q{p -> { :hello }, a: 1 do end},
5429
5488
  %q{},
5430
- ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0)) # no 1.9 backport
5489
+ SINCE_2_1) # no 1.9 backport
5431
5490
  end
5432
5491
 
5433
5492
  def test_ruby_bug_11989
@@ -5436,7 +5495,7 @@ class TestParser < Minitest::Test
5436
5495
  s(:str, "x\n y\n")),
5437
5496
  %Q{p <<~"E"\n x\\n y\nE},
5438
5497
  %q{},
5439
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
5498
+ SINCE_2_3)
5440
5499
  end
5441
5500
 
5442
5501
  def test_ruby_bug_11990
@@ -5447,7 +5506,7 @@ class TestParser < Minitest::Test
5447
5506
  s(:str, " y"))),
5448
5507
  %Q{p <<~E " y"\n x\nE},
5449
5508
  %q{},
5450
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
5509
+ SINCE_2_3)
5451
5510
  end
5452
5511
 
5453
5512
  def test_ruby_bug_12073
@@ -5462,7 +5521,7 @@ class TestParser < Minitest::Test
5462
5521
  s(:int, 1))))),
5463
5522
  %q{a = 1; a b: 1},
5464
5523
  %q{},
5465
- ALL_VERSIONS - %w(1.8))
5524
+ SINCE_1_9)
5466
5525
 
5467
5526
  assert_parses(
5468
5527
  s(:def, :foo,
@@ -5474,7 +5533,187 @@ class TestParser < Minitest::Test
5474
5533
  s(:str, ""))),
5475
5534
  %q{def foo raise; raise A::B, ''; end},
5476
5535
  %q{},
5477
- ALL_VERSIONS - %w(1.8))
5536
+ SINCE_1_9)
5537
+ end
5538
+
5539
+ def test_ruby_bug_12402
5540
+ assert_parses(
5541
+ s(:lvasgn, :foo,
5542
+ s(:rescue,
5543
+ s(:send, nil, :raise,
5544
+ s(:lvar, :bar)),
5545
+ s(:resbody, nil, nil,
5546
+ s(:nil)), nil)),
5547
+ %q{foo = raise(bar) rescue nil},
5548
+ %q{},
5549
+ SINCE_2_4)
5550
+
5551
+ assert_parses(
5552
+ s(:op_asgn,
5553
+ s(:lvasgn, :foo), :+,
5554
+ s(:rescue,
5555
+ s(:send, nil, :raise,
5556
+ s(:lvar, :bar)),
5557
+ s(:resbody, nil, nil,
5558
+ s(:nil)), nil)),
5559
+ %q{foo += raise(bar) rescue nil},
5560
+ %q{},
5561
+ SINCE_2_4)
5562
+
5563
+ assert_parses(
5564
+ s(:op_asgn,
5565
+ s(:send,
5566
+ s(:lvar, :foo), :[],
5567
+ s(:int, 0)), :+,
5568
+ s(:rescue,
5569
+ s(:send, nil, :raise,
5570
+ s(:lvar, :bar)),
5571
+ s(:resbody, nil, nil,
5572
+ s(:nil)), nil)),
5573
+ %q{foo[0] += raise(bar) rescue nil},
5574
+ %q{},
5575
+ SINCE_2_4)
5576
+
5577
+ assert_parses(
5578
+ s(:op_asgn,
5579
+ s(:send,
5580
+ s(:lvar, :foo), :m), :+,
5581
+ s(:rescue,
5582
+ s(:send, nil, :raise,
5583
+ s(:lvar, :bar)),
5584
+ s(:resbody, nil, nil,
5585
+ s(:nil)), nil)),
5586
+ %q{foo.m += raise(bar) rescue nil},
5587
+ %q{},
5588
+ SINCE_2_4)
5589
+
5590
+ assert_parses(
5591
+ s(:op_asgn,
5592
+ s(:send,
5593
+ s(:lvar, :foo), :m), :+,
5594
+ s(:rescue,
5595
+ s(:send, nil, :raise,
5596
+ s(:lvar, :bar)),
5597
+ s(:resbody, nil, nil,
5598
+ s(:nil)), nil)),
5599
+ %q{foo::m += raise(bar) rescue nil},
5600
+ %q{},
5601
+ SINCE_2_4)
5602
+
5603
+ assert_parses(
5604
+ s(:op_asgn,
5605
+ s(:send,
5606
+ s(:lvar, :foo), :C), :+,
5607
+ s(:rescue,
5608
+ s(:send, nil, :raise,
5609
+ s(:lvar, :bar)),
5610
+ s(:resbody, nil, nil,
5611
+ s(:nil)), nil)),
5612
+ %q{foo.C += raise(bar) rescue nil},
5613
+ %q{},
5614
+ SINCE_2_4)
5615
+
5616
+ assert_parses(
5617
+ s(:or_asgn,
5618
+ s(:casgn,
5619
+ s(:lvar, :foo), :C),
5620
+ s(:rescue,
5621
+ s(:send, nil, :raise,
5622
+ s(:lvar, :bar)),
5623
+ s(:resbody, nil, nil,
5624
+ s(:nil)), nil)),
5625
+ %q{foo::C ||= raise(bar) rescue nil},
5626
+ %q{},
5627
+ SINCE_2_4)
5628
+
5629
+ assert_parses(
5630
+ s(:lvasgn, :foo,
5631
+ s(:rescue,
5632
+ s(:send, nil, :raise,
5633
+ s(:lvar, :bar)),
5634
+ s(:resbody, nil, nil,
5635
+ s(:nil)), nil)),
5636
+ %q{foo = raise bar rescue nil},
5637
+ %q{},
5638
+ SINCE_2_4)
5639
+
5640
+ assert_parses(
5641
+ s(:op_asgn,
5642
+ s(:lvasgn, :foo), :+,
5643
+ s(:rescue,
5644
+ s(:send, nil, :raise,
5645
+ s(:lvar, :bar)),
5646
+ s(:resbody, nil, nil,
5647
+ s(:nil)), nil)),
5648
+ %q{foo += raise bar rescue nil},
5649
+ %q{},
5650
+ SINCE_2_4)
5651
+
5652
+ assert_parses(
5653
+ s(:op_asgn,
5654
+ s(:send,
5655
+ s(:lvar, :foo), :[],
5656
+ s(:int, 0)), :+,
5657
+ s(:rescue,
5658
+ s(:send, nil, :raise,
5659
+ s(:lvar, :bar)),
5660
+ s(:resbody, nil, nil,
5661
+ s(:nil)), nil)),
5662
+ %q{foo[0] += raise bar rescue nil},
5663
+ %q{},
5664
+ SINCE_2_4)
5665
+
5666
+ assert_parses(
5667
+ s(:op_asgn,
5668
+ s(:send,
5669
+ s(:lvar, :foo), :m), :+,
5670
+ s(:rescue,
5671
+ s(:send, nil, :raise,
5672
+ s(:lvar, :bar)),
5673
+ s(:resbody, nil, nil,
5674
+ s(:nil)), nil)),
5675
+ %q{foo.m += raise bar rescue nil},
5676
+ %q{},
5677
+ SINCE_2_4)
5678
+
5679
+ assert_parses(
5680
+ s(:op_asgn,
5681
+ s(:send,
5682
+ s(:lvar, :foo), :m), :+,
5683
+ s(:rescue,
5684
+ s(:send, nil, :raise,
5685
+ s(:lvar, :bar)),
5686
+ s(:resbody, nil, nil,
5687
+ s(:nil)), nil)),
5688
+ %q{foo::m += raise bar rescue nil},
5689
+ %q{},
5690
+ SINCE_2_4)
5691
+
5692
+ assert_parses(
5693
+ s(:op_asgn,
5694
+ s(:send,
5695
+ s(:lvar, :foo), :C), :+,
5696
+ s(:rescue,
5697
+ s(:send, nil, :raise,
5698
+ s(:lvar, :bar)),
5699
+ s(:resbody, nil, nil,
5700
+ s(:nil)), nil)),
5701
+ %q{foo.C += raise bar rescue nil},
5702
+ %q{},
5703
+ SINCE_2_4)
5704
+
5705
+ assert_parses(
5706
+ s(:or_asgn,
5707
+ s(:casgn,
5708
+ s(:lvar, :foo), :C),
5709
+ s(:rescue,
5710
+ s(:send, nil, :raise,
5711
+ s(:lvar, :bar)),
5712
+ s(:resbody, nil, nil,
5713
+ s(:nil)), nil)),
5714
+ %q{foo::C ||= raise bar rescue nil},
5715
+ %q{},
5716
+ SINCE_2_4)
5478
5717
  end
5479
5718
 
5480
5719
  def test_ruby_bug_12686
@@ -5487,7 +5726,7 @@ class TestParser < Minitest::Test
5487
5726
  s(:nil)), nil))),
5488
5727
  %q{f (g rescue nil)},
5489
5728
  %q{},
5490
- ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 2.3 ios mac))
5729
+ SINCE_2_4)
5491
5730
 
5492
5731
  assert_diagnoses(
5493
5732
  [:error, :unexpected_token, {:token => 'kRESCUE_MOD'}],
@@ -5504,17 +5743,29 @@ class TestParser < Minitest::Test
5504
5743
  s(:str, "#")),
5505
5744
  %q{[/()\\1/, ?#]},
5506
5745
  %q{},
5507
- ALL_VERSIONS - %w(1.8))
5746
+ SINCE_1_9)
5508
5747
  end
5509
5748
 
5510
5749
  def test_parser_bug_272
5750
+ assert_parses(
5751
+ s(:block,
5752
+ s(:send, nil, :a,
5753
+ s(:ivar, :@b)),
5754
+ s(:args,
5755
+ s(:procarg0, :c)), nil),
5756
+ %q{a @b do |c|;end},
5757
+ %q{},
5758
+ SINCE_1_9)
5759
+
5511
5760
  assert_parses(
5512
5761
  s(:block,
5513
5762
  s(:send, nil, :a,
5514
5763
  s(:ivar, :@b)),
5515
5764
  s(:args,
5516
5765
  s(:arg, :c)), nil),
5517
- %q{a @b do |c|;end})
5766
+ %q{a @b do |c|;end},
5767
+ %q{},
5768
+ %w(1.8))
5518
5769
  end
5519
5770
 
5520
5771
  def test_bug_lambda_leakage
@@ -5527,7 +5778,7 @@ class TestParser < Minitest::Test
5527
5778
  s(:send, nil, :scope)),
5528
5779
  %q{->(scope) {}; scope},
5529
5780
  %q{},
5530
- ALL_VERSIONS - %w(1.8))
5781
+ SINCE_1_9)
5531
5782
  end
5532
5783
 
5533
5784
  def test_bug_regex_verification