parser 2.3.1.4 → 2.3.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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