ruby_parser 3.8.4 → 3.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.rdoc +29 -0
- data/Manifest.txt +5 -0
- data/README.rdoc +12 -0
- data/Rakefile +128 -69
- data/compare/normalize.rb +146 -0
- data/lib/rp_extensions.rb +77 -0
- data/lib/rp_stringscanner.rb +64 -0
- data/lib/ruby18_parser.rb +2180 -2175
- data/lib/ruby18_parser.y +17 -13
- data/lib/ruby19_parser.rb +2250 -2241
- data/lib/ruby19_parser.y +18 -14
- data/lib/ruby20_parser.rb +2498 -2503
- data/lib/ruby20_parser.y +18 -29
- data/lib/ruby21_parser.rb +2287 -2275
- data/lib/ruby21_parser.y +18 -24
- data/lib/ruby22_parser.rb +2573 -2560
- data/lib/ruby22_parser.y +18 -24
- data/lib/ruby23_parser.rb +2498 -2494
- data/lib/ruby23_parser.y +18 -24
- data/lib/ruby24_parser.rb +6797 -0
- data/lib/ruby24_parser.y +2367 -0
- data/lib/ruby_lexer.rb +11 -16
- data/lib/ruby_parser.rb +86 -7
- data/lib/ruby_parser.yy +57 -53
- data/lib/ruby_parser_extras.rb +34 -237
- data/test/test_ruby_lexer.rb +54 -41
- data/test/test_ruby_parser.rb +776 -700
- data/test/test_ruby_parser_extras.rb +4 -6
- metadata +7 -2
- metadata.gz.sig +0 -0
data/test/test_ruby_parser.rb
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
|
3
3
|
# ENV['VERBOSE'] = "1"
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require 'ruby_parser'
|
5
|
+
require "minitest/autorun"
|
6
|
+
require "ruby_parser"
|
8
7
|
|
9
|
-
$: << File.expand_path(
|
8
|
+
$: << File.expand_path("~/Work/p4/zss/src/sexp_processor/dev/lib")
|
10
9
|
|
11
|
-
require
|
10
|
+
require "pt_testcase"
|
12
11
|
|
13
12
|
class Sexp
|
14
13
|
alias oldeq2 ==
|
14
|
+
# TODO: push up to Sexp
|
15
15
|
def ==(obj) # :nodoc:
|
16
16
|
if obj.class == self.class then
|
17
17
|
super and
|
@@ -22,62 +22,6 @@ class Sexp
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
class RubyParserTestCase < ParseTreeTestCase
|
26
|
-
attr_accessor :result, :processor
|
27
|
-
|
28
|
-
make_my_diffs_pretty!
|
29
|
-
|
30
|
-
def self.previous key
|
31
|
-
"Ruby"
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.generate_test klass, node, data, input_name, output_name
|
35
|
-
return if node.to_s =~ /bmethod|dmethod/
|
36
|
-
return if Array === data['Ruby']
|
37
|
-
|
38
|
-
output_name = "ParseTree"
|
39
|
-
|
40
|
-
super
|
41
|
-
end
|
42
|
-
|
43
|
-
def assert_parse rb, pt
|
44
|
-
self.result = processor.parse rb
|
45
|
-
assert_equal pt, result
|
46
|
-
end
|
47
|
-
|
48
|
-
def refute_parse rb
|
49
|
-
self.result = processor.parse rb
|
50
|
-
assert_nil result
|
51
|
-
end
|
52
|
-
|
53
|
-
def assert_syntax_error rb, emsg
|
54
|
-
e = nil
|
55
|
-
assert_silent do
|
56
|
-
e = assert_raises RubyParser::SyntaxError do
|
57
|
-
processor.parse rb
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
assert_equal emsg, e.message
|
62
|
-
end
|
63
|
-
|
64
|
-
def assert_parse_error rb, emsg
|
65
|
-
e = nil
|
66
|
-
assert_silent do
|
67
|
-
e = assert_raises Racc::ParseError do
|
68
|
-
processor.parse rb
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
assert_equal emsg, e.message
|
73
|
-
end
|
74
|
-
|
75
|
-
def assert_parse_line rb, pt, line
|
76
|
-
assert_parse rb, pt
|
77
|
-
assert_equal line, result.line, "call should have line number"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
25
|
module TestRubyParserShared
|
82
26
|
def setup
|
83
27
|
super
|
@@ -388,7 +332,7 @@ module TestRubyParserShared
|
|
388
332
|
end
|
389
333
|
|
390
334
|
def test_lasgn_env
|
391
|
-
rb =
|
335
|
+
rb = "a = 42"
|
392
336
|
pt = s(:lasgn, :a, s(:lit, 42))
|
393
337
|
expected_env = { :a => :lvar }
|
394
338
|
|
@@ -397,7 +341,7 @@ module TestRubyParserShared
|
|
397
341
|
end
|
398
342
|
|
399
343
|
def test_lasgn_ivar_env
|
400
|
-
rb =
|
344
|
+
rb = "@a = 42"
|
401
345
|
pt = s(:iasgn, :@a, s(:lit, 42))
|
402
346
|
|
403
347
|
assert_parse rb, pt
|
@@ -484,15 +428,15 @@ module TestRubyParserShared
|
|
484
428
|
assert_equal s(:str, "blah"), processor.literal_concat(lhs, rhs)
|
485
429
|
end
|
486
430
|
|
487
|
-
def
|
431
|
+
def test_logical_op_12
|
488
432
|
lhs = s(:lit, 1)
|
489
433
|
rhs = s(:lit, 2)
|
490
434
|
exp = s(:and, s(:lit, 1), s(:lit, 2))
|
491
435
|
|
492
|
-
assert_equal exp, processor.
|
436
|
+
assert_equal exp, processor.logical_op(:and, lhs, rhs)
|
493
437
|
end
|
494
438
|
|
495
|
-
def
|
439
|
+
def test_logical_op_1234_5
|
496
440
|
lhs = s(:and, s(:lit, 1), s(:and, s(:lit, 2), s(:and, s(:lit, 3), s(:lit, 4))))
|
497
441
|
rhs = s(:lit, 5)
|
498
442
|
exp = s(:and,
|
@@ -505,10 +449,10 @@ module TestRubyParserShared
|
|
505
449
|
s(:lit, 4),
|
506
450
|
s(:lit, 5)))))
|
507
451
|
|
508
|
-
assert_equal exp, processor.
|
452
|
+
assert_equal exp, processor.logical_op(:and, lhs, rhs)
|
509
453
|
end
|
510
454
|
|
511
|
-
def
|
455
|
+
def test_logical_op_123_4
|
512
456
|
lhs = s(:and, s(:lit, 1), s(:and, s(:lit, 2), s(:lit, 3)))
|
513
457
|
rhs = s(:lit, 4)
|
514
458
|
exp = s(:and,
|
@@ -519,18 +463,18 @@ module TestRubyParserShared
|
|
519
463
|
s(:lit, 3),
|
520
464
|
s(:lit, 4))))
|
521
465
|
|
522
|
-
assert_equal exp, processor.
|
466
|
+
assert_equal exp, processor.logical_op(:and, lhs, rhs)
|
523
467
|
end
|
524
468
|
|
525
|
-
def
|
469
|
+
def test_logical_op_12_3
|
526
470
|
lhs = s(:and, s(:lit, 1), s(:lit, 2))
|
527
471
|
rhs = s(:lit, 3)
|
528
472
|
exp = s(:and, s(:lit, 1), s(:and, s(:lit, 2), s(:lit, 3)))
|
529
473
|
|
530
|
-
assert_equal exp, processor.
|
474
|
+
assert_equal exp, processor.logical_op(:and, lhs, rhs)
|
531
475
|
end
|
532
476
|
|
533
|
-
def
|
477
|
+
def test_logical_op_nested_mix
|
534
478
|
lhs = s(:or, s(:call, nil, :a), s(:call, nil, :b))
|
535
479
|
rhs = s(:and, s(:call, nil, :c), s(:call, nil, :d))
|
536
480
|
exp = s(:or,
|
@@ -540,7 +484,7 @@ module TestRubyParserShared
|
|
540
484
|
lhs.paren = true
|
541
485
|
rhs.paren = true
|
542
486
|
|
543
|
-
assert_equal exp, processor.
|
487
|
+
assert_equal exp, processor.logical_op(:or, lhs, rhs)
|
544
488
|
end
|
545
489
|
|
546
490
|
def test_str_evstr
|
@@ -553,7 +497,7 @@ module TestRubyParserShared
|
|
553
497
|
def test_dsym_to_sym
|
554
498
|
pt = s(:alias, s(:lit, :<<), s(:lit, :>>))
|
555
499
|
|
556
|
-
rb =
|
500
|
+
rb = "alias :<< :>>"
|
557
501
|
assert_parse rb, pt
|
558
502
|
|
559
503
|
rb = 'alias :"<<" :">>"'
|
@@ -761,6 +705,15 @@ module TestRubyParserShared
|
|
761
705
|
assert_parse rb, pt
|
762
706
|
end
|
763
707
|
|
708
|
+
def test_parse_line_hash_lit
|
709
|
+
rb = "{\n:s1 => 1,\n}"
|
710
|
+
pt = s(:hash,
|
711
|
+
s(:lit, :s1).line(2), s(:lit, 1).line(2),
|
712
|
+
).line(1)
|
713
|
+
|
714
|
+
assert_parse rb, pt
|
715
|
+
end
|
716
|
+
|
764
717
|
def test_parse_line_heredoc_evstr
|
765
718
|
skip "heredoc line numbers are just gonna be screwed for a while..."
|
766
719
|
|
@@ -857,6 +810,19 @@ module TestRubyParserShared
|
|
857
810
|
assert_parse_line rb, pt, 1
|
858
811
|
end
|
859
812
|
|
813
|
+
def test_parse_line_rescue
|
814
|
+
skip "not yet"
|
815
|
+
rb = "begin\n a\n rescue\n b\n rescue\n c\n end\n"
|
816
|
+
pt = s(:rescue,
|
817
|
+
s(:call, nil, :a).line(2),
|
818
|
+
s(:resbody, s(:array).line(3),
|
819
|
+
s(:call, nil, :b).line(4)).line(3),
|
820
|
+
s(:resbody, s(:array).line(5),
|
821
|
+
s(:call, nil, :c).line(6)).line(5)).line(1)
|
822
|
+
|
823
|
+
assert_parse_line rb, pt, 1
|
824
|
+
end
|
825
|
+
|
860
826
|
def test_parse_line_return
|
861
827
|
rb = <<-RUBY
|
862
828
|
def blah
|
@@ -943,27 +909,7 @@ module TestRubyParserShared
|
|
943
909
|
end
|
944
910
|
|
945
911
|
def ruby18
|
946
|
-
|
947
|
-
end
|
948
|
-
|
949
|
-
def ruby19
|
950
|
-
Ruby19Parser === self.processor
|
951
|
-
end
|
952
|
-
|
953
|
-
def ruby20
|
954
|
-
Ruby20Parser === self.processor
|
955
|
-
end
|
956
|
-
|
957
|
-
def ruby21
|
958
|
-
Ruby21Parser === self.processor
|
959
|
-
end
|
960
|
-
|
961
|
-
def ruby22
|
962
|
-
Ruby22Parser === self.processor
|
963
|
-
end
|
964
|
-
|
965
|
-
def ruby23
|
966
|
-
Ruby23Parser === self.processor
|
912
|
+
RubyParser::V18 === self.processor
|
967
913
|
end
|
968
914
|
|
969
915
|
def test_bug_comma
|
@@ -1021,10 +967,8 @@ module TestRubyParserShared
|
|
1021
967
|
rb = "not(a)"
|
1022
968
|
pt = if ruby18 then
|
1023
969
|
s(:not, s(:call, nil, :a))
|
1024
|
-
elsif ruby19 or ruby20 or ruby21 or ruby22 or ruby23 then
|
1025
|
-
s(:call, s(:call, nil, :a), :"!")
|
1026
970
|
else
|
1027
|
-
|
971
|
+
s(:call, s(:call, nil, :a), :"!")
|
1028
972
|
end
|
1029
973
|
|
1030
974
|
assert_parse rb, pt
|
@@ -1627,11 +1571,11 @@ module TestRubyParserShared
|
|
1627
1571
|
|
1628
1572
|
def test___ENCODING__
|
1629
1573
|
rb = "__ENCODING__"
|
1630
|
-
pt = if
|
1574
|
+
pt = if RubyParser::V18 === processor then
|
1631
1575
|
s(:call, nil, :__ENCODING__)
|
1632
1576
|
else
|
1633
1577
|
if defined? Encoding then
|
1634
|
-
if
|
1578
|
+
if RubyParser::V18 === processor then
|
1635
1579
|
s(:call, nil, :__ENCODING__)
|
1636
1580
|
else
|
1637
1581
|
s(:colon2, s(:const, :Encoding), :UTF_8)
|
@@ -1657,9 +1601,117 @@ module TestRubyParserShared
|
|
1657
1601
|
assert_syntax_error "def a; class B; end; end", err
|
1658
1602
|
assert_syntax_error "def a; def b; end; class B; end; end", err
|
1659
1603
|
end
|
1604
|
+
|
1605
|
+
def test_call_not
|
1606
|
+
rb = "not 42"
|
1607
|
+
pt = s(:not, s(:lit, 42))
|
1608
|
+
|
1609
|
+
assert_parse rb, pt
|
1610
|
+
end
|
1611
|
+
|
1612
|
+
def test_call_bang_command_call
|
1613
|
+
rb = "! a.b 1"
|
1614
|
+
pt = s(:not, s(:call, s(:call, nil, :a), :b, s(:lit, 1)))
|
1615
|
+
|
1616
|
+
assert_parse rb, pt
|
1617
|
+
end
|
1618
|
+
|
1619
|
+
def test_call_unary_bang
|
1620
|
+
rb = "!1"
|
1621
|
+
pt = s(:not, s(:lit, 1))
|
1622
|
+
|
1623
|
+
assert_parse rb, pt
|
1624
|
+
end
|
1625
|
+
|
1626
|
+
def test_bang_eq
|
1627
|
+
rb = "1 != 2"
|
1628
|
+
pt = s(:not, s(:call, s(:lit, 1), :"==", s(:lit, 2)))
|
1629
|
+
|
1630
|
+
assert_parse rb, pt
|
1631
|
+
end
|
1632
|
+
|
1633
|
+
def test_flip2_env_lvar
|
1634
|
+
rb = "if a..b then end"
|
1635
|
+
pt = s(:if, s(:flip2, s(:call, nil, :a), s(:call, nil, :b)), nil, nil)
|
1636
|
+
|
1637
|
+
assert_parse rb, pt
|
1638
|
+
|
1639
|
+
top_env = processor.env.env.first
|
1640
|
+
|
1641
|
+
assert_kind_of Hash, top_env
|
1642
|
+
|
1643
|
+
flip = top_env.find { |k,v| k =~ /^flip/ }
|
1644
|
+
|
1645
|
+
assert flip
|
1646
|
+
assert_equal :lvar, flip.last
|
1647
|
+
end
|
1648
|
+
|
1649
|
+
def test_parse_until_not_canonical
|
1650
|
+
rb = "until not var.nil?\n 'foo'\nend"
|
1651
|
+
|
1652
|
+
pt = s(:while,
|
1653
|
+
s(:call, s(:call, nil, :var), :nil?),
|
1654
|
+
s(:str, "foo"), true)
|
1655
|
+
|
1656
|
+
assert_parse rb, pt
|
1657
|
+
end
|
1658
|
+
|
1659
|
+
def test_parse_until_not_noncanonical
|
1660
|
+
rb = "until not var.nil?\n 'foo'\nend"
|
1661
|
+
pt = s(:until,
|
1662
|
+
s(:not, s(:call, s(:call, nil, :var), :nil?)),
|
1663
|
+
s(:str, "foo"), true)
|
1664
|
+
|
1665
|
+
processor.canonicalize_conditions = false
|
1666
|
+
|
1667
|
+
assert_parse rb, pt
|
1668
|
+
end
|
1669
|
+
|
1670
|
+
def test_parse_if_not_canonical
|
1671
|
+
rb = "if not var.nil? then 'foo' else 'bar'\nend"
|
1672
|
+
pt = s(:if,
|
1673
|
+
s(:call, s(:call, nil, :var), :nil?),
|
1674
|
+
s(:str, "bar"),
|
1675
|
+
s(:str, "foo"))
|
1676
|
+
|
1677
|
+
assert_parse rb, pt
|
1678
|
+
end
|
1679
|
+
|
1680
|
+
def test_parse_if_not_noncanonical
|
1681
|
+
rb = "if not var.nil? then 'foo' else 'bar'\nend"
|
1682
|
+
pt = s(:if,
|
1683
|
+
s(:not, s(:call, s(:call, nil, :var), :nil?)),
|
1684
|
+
s(:str, "foo"),
|
1685
|
+
s(:str, "bar"))
|
1686
|
+
|
1687
|
+
processor.canonicalize_conditions = false
|
1688
|
+
|
1689
|
+
assert_parse rb, pt
|
1690
|
+
end
|
1691
|
+
|
1692
|
+
def test_parse_while_not_canonical
|
1693
|
+
rb = "while not var.nil?\n 'foo'\nend"
|
1694
|
+
pt = s(:until,
|
1695
|
+
s(:call, s(:call, nil, :var), :nil?),
|
1696
|
+
s(:str, "foo"), true)
|
1697
|
+
|
1698
|
+
assert_parse rb, pt
|
1699
|
+
end
|
1700
|
+
|
1701
|
+
def test_parse_while_not_noncanonical
|
1702
|
+
rb = "while not var.nil?\n 'foo'\nend"
|
1703
|
+
pt = s(:while,
|
1704
|
+
s(:not, s(:call, s(:call, nil, :var), :nil?)),
|
1705
|
+
s(:str, "foo"), true)
|
1706
|
+
|
1707
|
+
processor.canonicalize_conditions = false
|
1708
|
+
|
1709
|
+
assert_parse rb, pt
|
1710
|
+
end
|
1711
|
+
|
1660
1712
|
end
|
1661
1713
|
|
1662
|
-
module
|
1714
|
+
module TestRubyParserShared19Plus
|
1663
1715
|
def test_aref_args_lit_assocs
|
1664
1716
|
rb = "[1, 2 => 3]"
|
1665
1717
|
pt = s(:array, s(:lit, 1), s(:hash, s(:lit, 2), s(:lit, 3)))
|
@@ -2223,429 +2275,66 @@ module TestRubyParserShared19to22
|
|
2223
2275
|
assert_parse "f(state: {\n})", pt
|
2224
2276
|
assert_parse "f(state:\n {\n})", pt
|
2225
2277
|
end
|
2226
|
-
end
|
2227
|
-
|
2228
|
-
module TestRubyParserShared20to22
|
2229
|
-
def test_non_interpolated_symbol_array_line_breaks
|
2230
2278
|
|
2231
|
-
|
2232
|
-
|
2279
|
+
def test_mlhs_back_splat
|
2280
|
+
rb = "a, b, c, *s = f"
|
2281
|
+
pt = s(:masgn,
|
2233
2282
|
s(:array,
|
2234
|
-
s(:
|
2235
|
-
s(:
|
2236
|
-
s(:
|
2283
|
+
s(:lasgn, :a), s(:lasgn, :b), s(:lasgn, :c),
|
2284
|
+
s(:splat, s(:lasgn, :s))),
|
2285
|
+
s(:to_ary, s(:call, nil, :f)))
|
2286
|
+
|
2237
2287
|
assert_parse rb, pt
|
2238
2288
|
end
|
2239
2289
|
|
2240
|
-
def
|
2241
|
-
|
2242
|
-
|
2243
|
-
pt = s(:block,
|
2290
|
+
def test_mlhs_back_anonsplat
|
2291
|
+
rb = "a, b, c, * = f"
|
2292
|
+
pt = s(:masgn,
|
2244
2293
|
s(:array,
|
2245
|
-
s(:
|
2246
|
-
s(:
|
2247
|
-
s(:
|
2294
|
+
s(:lasgn, :a), s(:lasgn, :b), s(:lasgn, :c),
|
2295
|
+
s(:splat)),
|
2296
|
+
s(:to_ary, s(:call, nil, :f)))
|
2297
|
+
|
2248
2298
|
assert_parse rb, pt
|
2249
2299
|
end
|
2250
2300
|
|
2251
|
-
def
|
2252
|
-
rb = "
|
2253
|
-
pt = s(:
|
2301
|
+
def test_mlhs_mid_splat
|
2302
|
+
rb = "a, b, c, *s, x, y, z = f"
|
2303
|
+
pt = s(:masgn,
|
2304
|
+
s(:array,
|
2305
|
+
s(:lasgn, :a), s(:lasgn, :b), s(:lasgn, :c),
|
2306
|
+
s(:splat, s(:lasgn, :s)),
|
2307
|
+
s(:lasgn, :x), s(:lasgn, :y), s(:lasgn, :z)),
|
2308
|
+
s(:to_ary, s(:call, nil, :f)))
|
2254
2309
|
|
2255
2310
|
assert_parse rb, pt
|
2256
2311
|
end
|
2257
2312
|
|
2258
|
-
def
|
2259
|
-
rb = "
|
2260
|
-
pt = s(:
|
2313
|
+
def test_mlhs_mid_anonsplat
|
2314
|
+
rb = "a, b, c, *, x, y, z = f"
|
2315
|
+
pt = s(:masgn,
|
2316
|
+
s(:array, s(:lasgn, :a), s(:splat), s(:lasgn, :z)),
|
2317
|
+
s(:to_ary, s(:call, nil, :f)))
|
2318
|
+
pt = s(:masgn,
|
2319
|
+
s(:array,
|
2320
|
+
s(:lasgn, :a), s(:lasgn, :b), s(:lasgn, :c),
|
2321
|
+
s(:splat),
|
2322
|
+
s(:lasgn, :x), s(:lasgn, :y), s(:lasgn, :z)),
|
2323
|
+
s(:to_ary, s(:call, nil, :f)))
|
2261
2324
|
|
2262
2325
|
assert_parse rb, pt
|
2263
2326
|
end
|
2264
2327
|
|
2265
|
-
def
|
2266
|
-
rb = "
|
2267
|
-
pt = s(:
|
2268
|
-
|
2269
|
-
|
2270
|
-
|
2271
|
-
|
2272
|
-
|
2273
|
-
|
2274
|
-
|
2275
|
-
s(:call, nil, :test_splat, s(:hash, s(:kwsplat, s(:lvar, :testing)))))
|
2276
|
-
|
2277
|
-
assert_parse rb, pt
|
2278
|
-
end
|
2279
|
-
|
2280
|
-
def test_dstr_lex_state
|
2281
|
-
rb = '"#{p:a}"'
|
2282
|
-
pt = s(:dstr, "", s(:evstr, s(:call, nil, :p, s(:lit, :a))))
|
2283
|
-
|
2284
|
-
assert_parse rb, pt
|
2285
|
-
end
|
2286
|
-
|
2287
|
-
def test_call_arg_kwsplat
|
2288
|
-
rb = "a(b, **1)"
|
2289
|
-
pt = s(:call, nil, :a, s(:call, nil, :b), s(:hash, s(:kwsplat, s(:lit, 1))))
|
2290
|
-
|
2291
|
-
assert_parse rb, pt
|
2292
|
-
end
|
2293
|
-
|
2294
|
-
def test_call_arg_assoc_kwsplat
|
2295
|
-
rb = "f(1, kw: 2, **3)"
|
2296
|
-
pt = s(:call, nil, :f,
|
2297
|
-
s(:lit, 1),
|
2298
|
-
s(:hash, s(:lit, :kw), s(:lit, 2), s(:kwsplat, s(:lit, 3))))
|
2299
|
-
|
2300
|
-
assert_parse rb, pt
|
2301
|
-
end
|
2302
|
-
|
2303
|
-
def test_call_kwsplat
|
2304
|
-
rb = "a(**1)"
|
2305
|
-
pt = s(:call, nil, :a, s(:hash, s(:kwsplat, s(:lit, 1))))
|
2306
|
-
|
2307
|
-
assert_parse rb, pt
|
2308
|
-
end
|
2309
|
-
|
2310
|
-
def test_iter_kwarg
|
2311
|
-
rb = "a { |b: 1| }"
|
2312
|
-
pt = s(:iter, s(:call, nil, :a), s(:args, s(:kwarg, :b, s(:lit, 1))))
|
2313
|
-
|
2314
|
-
assert_parse rb, pt
|
2315
|
-
end
|
2316
|
-
|
2317
|
-
def test_iter_kwarg_kwsplat
|
2318
|
-
rb = "a { |b: 1, **c| }"
|
2319
|
-
pt = s(:iter, s(:call, nil, :a), s(:args, s(:kwarg, :b, s(:lit, 1)), :"**c"))
|
2320
|
-
|
2321
|
-
assert_parse rb, pt
|
2322
|
-
end
|
2323
|
-
|
2324
|
-
def test_block_kwarg_lvar
|
2325
|
-
rb = "bl { |kw: :val| kw }"
|
2326
|
-
pt = s(:iter, s(:call, nil, :bl), s(:args, s(:kwarg, :kw, s(:lit, :val))),
|
2327
|
-
s(:lvar, :kw))
|
2328
|
-
|
2329
|
-
assert_parse rb, pt
|
2330
|
-
end
|
2331
|
-
|
2332
|
-
def test_block_kwarg_lvar_multiple
|
2333
|
-
rb = "bl { |kw: :val, kw2: :val2 | kw }"
|
2334
|
-
pt = s(:iter, s(:call, nil, :bl),
|
2335
|
-
s(:args,
|
2336
|
-
s(:kwarg, :kw, s(:lit, :val)),
|
2337
|
-
s(:kwarg, :kw2, s(:lit, :val2))),
|
2338
|
-
s(:lvar, :kw))
|
2339
|
-
|
2340
|
-
assert_parse rb, pt
|
2341
|
-
end
|
2342
|
-
end
|
2343
|
-
|
2344
|
-
class TestRubyParser < Minitest::Test
|
2345
|
-
def test_parse
|
2346
|
-
processor = RubyParser.new
|
2347
|
-
|
2348
|
-
# 1.8 only syntax
|
2349
|
-
rb = "while false : 42 end"
|
2350
|
-
pt = s(:while, s(:false), s(:lit, 42), true)
|
2351
|
-
|
2352
|
-
assert_silent do
|
2353
|
-
assert_equal pt, processor.parse(rb)
|
2354
|
-
end
|
2355
|
-
|
2356
|
-
# 1.9 only syntax
|
2357
|
-
rb = "a.()"
|
2358
|
-
pt = s(:call, s(:call, nil, :a), :call)
|
2359
|
-
|
2360
|
-
assert_equal pt, processor.parse(rb)
|
2361
|
-
|
2362
|
-
# bad syntax
|
2363
|
-
e = assert_raises Racc::ParseError do
|
2364
|
-
capture_io do
|
2365
|
-
processor.parse "a.("
|
2366
|
-
end
|
2367
|
-
end
|
2368
|
-
|
2369
|
-
msg = "(string):1 :: parse error on value \"(\" (tLPAREN2)"
|
2370
|
-
assert_equal msg, e.message.strip
|
2371
|
-
end
|
2372
|
-
end
|
2373
|
-
|
2374
|
-
class TestRuby18Parser < RubyParserTestCase
|
2375
|
-
include TestRubyParserShared
|
2376
|
-
|
2377
|
-
def setup
|
2378
|
-
super
|
2379
|
-
|
2380
|
-
self.processor = Ruby18Parser.new
|
2381
|
-
end
|
2382
|
-
|
2383
|
-
def test_call_space_before_paren_args
|
2384
|
-
rb = "a (:b, :c, :d => :e)"
|
2385
|
-
pt = s(:call, nil, :a,
|
2386
|
-
s(:lit, :b),
|
2387
|
-
s(:lit, :c),
|
2388
|
-
s(:hash, s(:lit, :d), s(:lit, :e)))
|
2389
|
-
|
2390
|
-
assert_parse rb, pt
|
2391
|
-
end
|
2392
|
-
|
2393
|
-
def test_flip2_env_lvar
|
2394
|
-
rb = "if a..b then end"
|
2395
|
-
pt = s(:if, s(:flip2, s(:call, nil, :a), s(:call, nil, :b)), nil, nil)
|
2396
|
-
|
2397
|
-
assert_parse rb, pt
|
2398
|
-
|
2399
|
-
top_env = processor.env.env.first
|
2400
|
-
|
2401
|
-
assert_kind_of Hash, top_env
|
2402
|
-
|
2403
|
-
flip = top_env.find { |k,v| k =~ /^flip/ }
|
2404
|
-
|
2405
|
-
assert flip
|
2406
|
-
assert_equal :lvar, flip.last
|
2407
|
-
end
|
2408
|
-
|
2409
|
-
def test_assoc_list_18
|
2410
|
-
rb = "{1, 2, 3, 4}"
|
2411
|
-
pt = s(:hash, s(:lit, 1), s(:lit, 2), s(:lit, 3), s(:lit, 4))
|
2412
|
-
|
2413
|
-
assert_parse rb, pt
|
2414
|
-
end
|
2415
|
-
|
2416
|
-
def test_case_then_colon_18
|
2417
|
-
rb = "case x; when Fixnum: 42; end"
|
2418
|
-
pt = s(:case,
|
2419
|
-
s(:call, nil, :x),
|
2420
|
-
s(:when, s(:array, s(:const, :Fixnum)), s(:lit, 42)),
|
2421
|
-
nil)
|
2422
|
-
|
2423
|
-
assert_parse rb, pt
|
2424
|
-
end
|
2425
|
-
|
2426
|
-
def test_do_colon_18
|
2427
|
-
rb = "while false : 42 end"
|
2428
|
-
pt = s(:while, s(:false), s(:lit, 42), true)
|
2429
|
-
|
2430
|
-
assert_parse rb, pt
|
2431
|
-
end
|
2432
|
-
|
2433
|
-
def test_parse_until_not_canonical
|
2434
|
-
rb = "until not var.nil?\n 'foo'\nend"
|
2435
|
-
|
2436
|
-
pt = s(:while,
|
2437
|
-
s(:call, s(:call, nil, :var), :nil?),
|
2438
|
-
s(:str, "foo"), true)
|
2439
|
-
|
2440
|
-
assert_parse rb, pt
|
2441
|
-
end
|
2442
|
-
|
2443
|
-
def test_parse_until_not_noncanonical
|
2444
|
-
rb = "until not var.nil?\n 'foo'\nend"
|
2445
|
-
pt = s(:until,
|
2446
|
-
s(:not, s(:call, s(:call, nil, :var), :nil?)),
|
2447
|
-
s(:str, "foo"), true)
|
2448
|
-
|
2449
|
-
processor.canonicalize_conditions = false
|
2450
|
-
|
2451
|
-
assert_parse rb, pt
|
2452
|
-
end
|
2453
|
-
|
2454
|
-
def test_parse_if_not_canonical
|
2455
|
-
rb = "if not var.nil? then 'foo' else 'bar'\nend"
|
2456
|
-
pt = s(:if,
|
2457
|
-
s(:call, s(:call, nil, :var), :nil?),
|
2458
|
-
s(:str, "bar"),
|
2459
|
-
s(:str, "foo"))
|
2460
|
-
|
2461
|
-
assert_parse rb, pt
|
2462
|
-
end
|
2463
|
-
|
2464
|
-
def test_parse_if_not_noncanonical
|
2465
|
-
rb = "if not var.nil? then 'foo' else 'bar'\nend"
|
2466
|
-
pt = s(:if,
|
2467
|
-
s(:not, s(:call, s(:call, nil, :var), :nil?)),
|
2468
|
-
s(:str, "foo"),
|
2469
|
-
s(:str, "bar"))
|
2470
|
-
|
2471
|
-
processor.canonicalize_conditions = false
|
2472
|
-
|
2473
|
-
assert_parse rb, pt
|
2474
|
-
end
|
2475
|
-
|
2476
|
-
def test_parse_while_not_canonical
|
2477
|
-
rb = "while not var.nil?\n 'foo'\nend"
|
2478
|
-
pt = s(:until,
|
2479
|
-
s(:call, s(:call, nil, :var), :nil?),
|
2480
|
-
s(:str, "foo"), true)
|
2481
|
-
|
2482
|
-
assert_parse rb, pt
|
2483
|
-
end
|
2484
|
-
|
2485
|
-
def test_parse_while_not_noncanonical
|
2486
|
-
rb = "while not var.nil?\n 'foo'\nend"
|
2487
|
-
pt = s(:while,
|
2488
|
-
s(:not, s(:call, s(:call, nil, :var), :nil?)),
|
2489
|
-
s(:str, "foo"), true)
|
2490
|
-
|
2491
|
-
processor.canonicalize_conditions = false
|
2492
|
-
|
2493
|
-
assert_parse rb, pt
|
2494
|
-
end
|
2495
|
-
|
2496
|
-
def test_double_block_error_10
|
2497
|
-
assert_syntax_error "a.b (&b) {}", BLOCK_DUP_MSG
|
2498
|
-
end
|
2499
|
-
|
2500
|
-
def test_double_block_error_11
|
2501
|
-
assert_syntax_error "a (1, &b) { }", BLOCK_DUP_MSG
|
2502
|
-
end
|
2503
|
-
|
2504
|
-
def test_double_block_error_12
|
2505
|
-
assert_syntax_error "a (1, &b) do end", BLOCK_DUP_MSG
|
2506
|
-
end
|
2507
|
-
|
2508
|
-
def test_double_block_error_13
|
2509
|
-
assert_syntax_error "m.a (1, &b) { }", BLOCK_DUP_MSG
|
2510
|
-
end
|
2511
|
-
|
2512
|
-
def test_double_block_error_14
|
2513
|
-
assert_syntax_error "m.a (1, &b) do end", BLOCK_DUP_MSG
|
2514
|
-
end
|
2515
|
-
|
2516
|
-
def test_double_block_error_15
|
2517
|
-
assert_syntax_error "m::a (1, &b) { }", BLOCK_DUP_MSG
|
2518
|
-
end
|
2519
|
-
|
2520
|
-
def test_double_block_error_16
|
2521
|
-
assert_syntax_error "m::a (1, &b) do end", BLOCK_DUP_MSG
|
2522
|
-
end
|
2523
|
-
|
2524
|
-
# In 1.8, block args with an outer set of parens are superfluous.
|
2525
|
-
# In 1.9, outer set of parens are NOT... they are an explicit extra masgn.
|
2526
|
-
|
2527
|
-
def test_iter_args_2_18
|
2528
|
-
rb = "f { |(a, b)| }"
|
2529
|
-
pt = s(:iter, s(:call, nil, :f), s(:args, :a, :b))
|
2530
|
-
|
2531
|
-
assert_parse rb, pt
|
2532
|
-
end
|
2533
|
-
|
2534
|
-
def test_bug_args__18
|
2535
|
-
rb = "f { |(a, b)| }"
|
2536
|
-
pt = s(:iter, s(:call, nil, :f),
|
2537
|
-
s(:args, :a, :b))
|
2538
|
-
|
2539
|
-
assert_parse rb, pt
|
2540
|
-
end
|
2541
|
-
|
2542
|
-
def test_bug_args_masgn_outer_parens__18
|
2543
|
-
rb = "f { |((a, b), c)| }"
|
2544
|
-
pt = s(:iter, # NOTE: same sexp as test_bug_args_masgn
|
2545
|
-
s(:call, nil, :f),
|
2546
|
-
s(:args, s(:masgn, :a, :b), :c))
|
2547
|
-
|
2548
|
-
assert_parse rb, pt.dup
|
2549
|
-
end
|
2550
|
-
|
2551
|
-
def test_call_unary_bang
|
2552
|
-
rb = "!1"
|
2553
|
-
pt = s(:not, s(:lit, 1))
|
2554
|
-
|
2555
|
-
assert_parse rb, pt
|
2556
|
-
end
|
2557
|
-
|
2558
|
-
def test_bang_eq
|
2559
|
-
rb = "1 != 2"
|
2560
|
-
pt = s(:not, s(:call, s(:lit, 1), :"==", s(:lit, 2)))
|
2561
|
-
|
2562
|
-
assert_parse rb, pt
|
2563
|
-
end
|
2564
|
-
|
2565
|
-
def test_call_not
|
2566
|
-
rb = "not 42"
|
2567
|
-
pt = s(:not, s(:lit, 42))
|
2568
|
-
|
2569
|
-
assert_parse rb, pt
|
2570
|
-
end
|
2571
|
-
|
2572
|
-
def test_call_bang_command_call
|
2573
|
-
rb = "! a.b 1"
|
2574
|
-
pt = s(:not, s(:call, s(:call, nil, :a), :b, s(:lit, 1)))
|
2575
|
-
|
2576
|
-
assert_parse rb, pt
|
2577
|
-
end
|
2578
|
-
end
|
2579
|
-
|
2580
|
-
class TestRuby19Parser < RubyParserTestCase
|
2581
|
-
include TestRubyParserShared
|
2582
|
-
include TestRubyParserShared19to22
|
2583
|
-
|
2584
|
-
def setup
|
2585
|
-
super
|
2586
|
-
|
2587
|
-
self.processor = Ruby19Parser.new
|
2588
|
-
end
|
2589
|
-
|
2590
|
-
def test_mlhs_back_splat
|
2591
|
-
rb = "a, b, c, *s = f"
|
2592
|
-
pt = s(:masgn,
|
2593
|
-
s(:array,
|
2594
|
-
s(:lasgn, :a), s(:lasgn, :b), s(:lasgn, :c),
|
2595
|
-
s(:splat, s(:lasgn, :s))),
|
2596
|
-
s(:to_ary, s(:call, nil, :f)))
|
2597
|
-
|
2598
|
-
assert_parse rb, pt
|
2599
|
-
end
|
2600
|
-
|
2601
|
-
def test_mlhs_back_anonsplat
|
2602
|
-
rb = "a, b, c, * = f"
|
2603
|
-
pt = s(:masgn,
|
2604
|
-
s(:array,
|
2605
|
-
s(:lasgn, :a), s(:lasgn, :b), s(:lasgn, :c),
|
2606
|
-
s(:splat)),
|
2607
|
-
s(:to_ary, s(:call, nil, :f)))
|
2608
|
-
|
2609
|
-
assert_parse rb, pt
|
2610
|
-
end
|
2611
|
-
|
2612
|
-
def test_mlhs_mid_splat
|
2613
|
-
rb = "a, b, c, *s, x, y, z = f"
|
2614
|
-
pt = s(:masgn,
|
2615
|
-
s(:array,
|
2616
|
-
s(:lasgn, :a), s(:lasgn, :b), s(:lasgn, :c),
|
2617
|
-
s(:splat, s(:lasgn, :s)),
|
2618
|
-
s(:lasgn, :x), s(:lasgn, :y), s(:lasgn, :z)),
|
2619
|
-
s(:to_ary, s(:call, nil, :f)))
|
2620
|
-
|
2621
|
-
assert_parse rb, pt
|
2622
|
-
end
|
2623
|
-
|
2624
|
-
def test_mlhs_mid_anonsplat
|
2625
|
-
rb = "a, b, c, *, x, y, z = f"
|
2626
|
-
pt = s(:masgn,
|
2627
|
-
s(:array, s(:lasgn, :a), s(:splat), s(:lasgn, :z)),
|
2628
|
-
s(:to_ary, s(:call, nil, :f)))
|
2629
|
-
pt = s(:masgn,
|
2630
|
-
s(:array,
|
2631
|
-
s(:lasgn, :a), s(:lasgn, :b), s(:lasgn, :c),
|
2632
|
-
s(:splat),
|
2633
|
-
s(:lasgn, :x), s(:lasgn, :y), s(:lasgn, :z)),
|
2634
|
-
s(:to_ary, s(:call, nil, :f)))
|
2635
|
-
|
2636
|
-
assert_parse rb, pt
|
2637
|
-
end
|
2638
|
-
|
2639
|
-
def test_mlhs_front_splat
|
2640
|
-
rb = "*s, x, y, z = f"
|
2641
|
-
pt = s(:masgn,
|
2642
|
-
s(:array, s(:splat, s(:lasgn, :s)), s(:lasgn, :z)),
|
2643
|
-
s(:to_ary, s(:call, nil, :f)))
|
2644
|
-
pt = s(:masgn,
|
2645
|
-
s(:array,
|
2646
|
-
s(:splat, s(:lasgn, :s)),
|
2647
|
-
s(:lasgn, :x), s(:lasgn, :y), s(:lasgn, :z)),
|
2648
|
-
s(:to_ary, s(:call, nil, :f)))
|
2328
|
+
def test_mlhs_front_splat
|
2329
|
+
rb = "*s, x, y, z = f"
|
2330
|
+
pt = s(:masgn,
|
2331
|
+
s(:array, s(:splat, s(:lasgn, :s)), s(:lasgn, :z)),
|
2332
|
+
s(:to_ary, s(:call, nil, :f)))
|
2333
|
+
pt = s(:masgn,
|
2334
|
+
s(:array,
|
2335
|
+
s(:splat, s(:lasgn, :s)),
|
2336
|
+
s(:lasgn, :x), s(:lasgn, :y), s(:lasgn, :z)),
|
2337
|
+
s(:to_ary, s(:call, nil, :f)))
|
2649
2338
|
|
2650
2339
|
assert_parse rb, pt
|
2651
2340
|
end
|
@@ -2866,7 +2555,7 @@ class TestRuby19Parser < RubyParserTestCase
|
|
2866
2555
|
assert_parse rb, pt
|
2867
2556
|
end
|
2868
2557
|
|
2869
|
-
def
|
2558
|
+
def test_block_args_opt2_2
|
2870
2559
|
rb = "f { |a, b = 42, c = 24| [a, b, c] }"
|
2871
2560
|
pt = s(:iter,
|
2872
2561
|
s(:call, nil, :f),
|
@@ -3062,144 +2751,341 @@ class TestRuby19Parser < RubyParserTestCase
|
|
3062
2751
|
assert_parse rb, pt
|
3063
2752
|
end
|
3064
2753
|
|
3065
|
-
def test_iter_args_11_1
|
3066
|
-
rb = "f { |a, b = 42, *c, d| }"
|
3067
|
-
pt = s(:iter, s(:call, nil, :f),
|
3068
|
-
s(:args, :a, s(:lasgn, :b, s(:lit, 42)), :"*c", :d))
|
2754
|
+
def test_iter_args_11_1
|
2755
|
+
rb = "f { |a, b = 42, *c, d| }"
|
2756
|
+
pt = s(:iter, s(:call, nil, :f),
|
2757
|
+
s(:args, :a, s(:lasgn, :b, s(:lit, 42)), :"*c", :d))
|
2758
|
+
|
2759
|
+
assert_parse rb, pt
|
2760
|
+
end
|
2761
|
+
|
2762
|
+
def test_iter_args_11_2
|
2763
|
+
rb = "f { |a, b = 42, *c, d, &e| }"
|
2764
|
+
pt = s(:iter, s(:call, nil, :f),
|
2765
|
+
s(:args, :a, s(:lasgn, :b, s(:lit, 42)), :"*c", :d, :"&e"))
|
2766
|
+
|
2767
|
+
assert_parse rb, pt
|
2768
|
+
end
|
2769
|
+
|
2770
|
+
def test_kill_me_6
|
2771
|
+
# | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
|
2772
|
+
rb = "f { |a, (b, *c, d)| }"
|
2773
|
+
pt = s(:iter,
|
2774
|
+
s(:call, nil, :f),
|
2775
|
+
s(:args, :a, s(:masgn, :b, :"*c", :d)))
|
2776
|
+
|
2777
|
+
assert_parse rb, pt
|
2778
|
+
end
|
2779
|
+
|
2780
|
+
def test_kill_me_7
|
2781
|
+
# | f_marg_list tCOMMA tSTAR
|
2782
|
+
rb = "f { |a, (b, *)| }"
|
2783
|
+
pt = s(:iter,
|
2784
|
+
s(:call, nil, :f),
|
2785
|
+
s(:args, :a, s(:masgn, :b, :*)))
|
2786
|
+
|
2787
|
+
assert_parse rb, pt
|
2788
|
+
end
|
2789
|
+
|
2790
|
+
def test_kill_me_8
|
2791
|
+
# | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
|
2792
|
+
rb = "f { |a, (b, *, c)| }"
|
2793
|
+
pt = s(:iter,
|
2794
|
+
s(:call, nil, :f),
|
2795
|
+
s(:args, :a, s(:masgn, :b, :*, :c)))
|
2796
|
+
|
2797
|
+
assert_parse rb, pt
|
2798
|
+
end
|
2799
|
+
|
2800
|
+
def test_kill_me_9
|
2801
|
+
# | tSTAR f_norm_arg
|
2802
|
+
rb = "f { |a, (*b)| }"
|
2803
|
+
pt = s(:iter,
|
2804
|
+
s(:call, nil, :f),
|
2805
|
+
s(:args, :a, s(:masgn, :"*b")))
|
2806
|
+
|
2807
|
+
assert_parse rb, pt
|
2808
|
+
end
|
2809
|
+
|
2810
|
+
def test_kill_me_10
|
2811
|
+
# | tSTAR f_norm_arg tCOMMA f_marg_list
|
2812
|
+
rb = "f { |a, (*b, c)| }"
|
2813
|
+
pt = s(:iter,
|
2814
|
+
s(:call, nil, :f),
|
2815
|
+
s(:args, :a, s(:masgn, :"*b", :c)))
|
2816
|
+
|
2817
|
+
assert_parse rb, pt
|
2818
|
+
end
|
2819
|
+
|
2820
|
+
def test_kill_me_11
|
2821
|
+
# | tSTAR
|
2822
|
+
rb = "f { |a, (*)| }"
|
2823
|
+
pt = s(:iter,
|
2824
|
+
s(:call, nil, :f),
|
2825
|
+
s(:args, :a, s(:masgn, :*)))
|
2826
|
+
|
2827
|
+
assert_parse rb, pt
|
2828
|
+
end
|
2829
|
+
|
2830
|
+
def test_kill_me_12
|
2831
|
+
# | tSTAR tCOMMA f_marg_list
|
2832
|
+
rb = "f { |a, (*, b)| }"
|
2833
|
+
pt = s(:iter,
|
2834
|
+
s(:call, nil, :f),
|
2835
|
+
s(:args, :a, s(:masgn, :*, :b)))
|
2836
|
+
|
2837
|
+
assert_parse rb, pt
|
2838
|
+
end
|
2839
|
+
|
2840
|
+
def test_index_0
|
2841
|
+
rb = "a[] = b"
|
2842
|
+
pt = s(:attrasgn, s(:call, nil, :a), :[]=, s(:call, nil, :b))
|
2843
|
+
|
2844
|
+
assert_parse rb, pt
|
2845
|
+
end
|
2846
|
+
|
2847
|
+
def test_lambda_do_vs_brace
|
2848
|
+
pt = s(:call, nil, :f, s(:iter, s(:call, nil, :lambda), s(:args)))
|
2849
|
+
|
2850
|
+
rb = "f ->() {}"
|
2851
|
+
assert_parse rb, pt
|
2852
|
+
|
2853
|
+
rb = "f ->() do end"
|
2854
|
+
assert_parse rb, pt
|
2855
|
+
|
2856
|
+
pt = s(:call, nil, :f, s(:iter, s(:call, nil, :lambda), 0))
|
2857
|
+
|
2858
|
+
rb = "f -> {}"
|
2859
|
+
assert_parse rb, pt
|
2860
|
+
|
2861
|
+
rb = "f -> do end"
|
2862
|
+
assert_parse rb, pt
|
2863
|
+
end
|
2864
|
+
|
2865
|
+
def test_thingy
|
2866
|
+
pt = s(:call, s(:call, nil, :f), :call, s(:lit, 42))
|
2867
|
+
|
2868
|
+
rb = "f.(42)"
|
2869
|
+
assert_parse rb, pt
|
2870
|
+
|
2871
|
+
rb = "f::(42)"
|
2872
|
+
assert_parse rb, pt
|
2873
|
+
end
|
2874
|
+
|
2875
|
+
def test_unary_plus_on_literal
|
2876
|
+
rb = "+:a"
|
2877
|
+
pt = s(:call, s(:lit, :a), :+@)
|
2878
|
+
|
2879
|
+
assert_parse rb, pt
|
2880
|
+
end
|
2881
|
+
end
|
2882
|
+
|
2883
|
+
module TestRubyParserShared21Plus
|
2884
|
+
def test_f_kw
|
2885
|
+
rb = "def x k:42; end"
|
2886
|
+
pt = s(:defn, :x, s(:args, s(:kwarg, :k, s(:lit, 42))), s(:nil))
|
2887
|
+
|
2888
|
+
assert_parse rb, pt
|
2889
|
+
end
|
2890
|
+
|
2891
|
+
def test_f_kw__required
|
2892
|
+
rb = "def x k:; end"
|
2893
|
+
pt = s(:defn, :x, s(:args, s(:kwarg, :k)), s(:nil))
|
2894
|
+
|
2895
|
+
assert_parse rb, pt
|
2896
|
+
end
|
2897
|
+
|
2898
|
+
def test_block_kw
|
2899
|
+
rb = "blah { |k:42| }"
|
2900
|
+
pt = s(:iter, s(:call, nil, :blah), s(:args, s(:kwarg, :k, s(:lit, 42))))
|
2901
|
+
|
2902
|
+
assert_parse rb, pt
|
2903
|
+
|
2904
|
+
rb = "blah { |k:42| }"
|
2905
|
+
assert_parse rb, pt
|
2906
|
+
end
|
2907
|
+
|
2908
|
+
def test_block_kw__required
|
2909
|
+
rb = "blah do |k:| end"
|
2910
|
+
pt = s(:iter, s(:call, nil, :blah), s(:args, s(:kwarg, :k)))
|
2911
|
+
|
2912
|
+
assert_parse rb, pt
|
2913
|
+
|
2914
|
+
rb = "blah do |k:| end"
|
2915
|
+
assert_parse rb, pt
|
2916
|
+
end
|
2917
|
+
|
2918
|
+
def test_stabby_block_kw
|
2919
|
+
rb = "-> (k:42) { }"
|
2920
|
+
pt = s(:iter, s(:call, nil, :lambda), s(:args, s(:kwarg, :k, s(:lit, 42))))
|
2921
|
+
|
2922
|
+
assert_parse rb, pt
|
2923
|
+
end
|
2924
|
+
|
2925
|
+
def test_stabby_block_kw__required
|
2926
|
+
rb = "-> (k:) { }"
|
2927
|
+
pt = s(:iter, s(:call, nil, :lambda), s(:args, s(:kwarg, :k)))
|
3069
2928
|
|
3070
2929
|
assert_parse rb, pt
|
3071
2930
|
end
|
3072
2931
|
|
3073
|
-
def
|
3074
|
-
|
3075
|
-
|
3076
|
-
|
2932
|
+
def test_parse_line_heredoc_hardnewline
|
2933
|
+
skip "not yet"
|
2934
|
+
|
2935
|
+
rb = <<-'CODE'.gsub(/^ /, '')
|
2936
|
+
<<-EOFOO
|
2937
|
+
\n\n\n\n\n\n\n\n\n
|
2938
|
+
EOFOO
|
2939
|
+
|
2940
|
+
class Foo
|
2941
|
+
end
|
2942
|
+
CODE
|
2943
|
+
|
2944
|
+
pt = s(:block,
|
2945
|
+
s(:str, "\n\n\n\n\n\n\n\n\n\n").line(1),
|
2946
|
+
s(:class, :Foo, nil).line(5)).line(1)
|
3077
2947
|
|
3078
2948
|
assert_parse rb, pt
|
3079
2949
|
end
|
2950
|
+
end
|
3080
2951
|
|
3081
|
-
|
3082
|
-
|
3083
|
-
rb = "f { |a, (b, *c, d)| }"
|
3084
|
-
pt = s(:iter,
|
3085
|
-
s(:call, nil, :f),
|
3086
|
-
s(:args, :a, s(:masgn, :b, :"*c", :d)))
|
2952
|
+
module TestRubyParserShared20Plus
|
2953
|
+
def test_non_interpolated_symbol_array_line_breaks
|
3087
2954
|
|
2955
|
+
rb = "%i(\na\nb\n)\n1"
|
2956
|
+
pt = s(:block,
|
2957
|
+
s(:array,
|
2958
|
+
s(:lit, :a).line(2),
|
2959
|
+
s(:lit, :b).line(3)).line(1),
|
2960
|
+
s(:lit, 1).line(5))
|
3088
2961
|
assert_parse rb, pt
|
3089
2962
|
end
|
3090
2963
|
|
3091
|
-
def
|
3092
|
-
# | f_marg_list tCOMMA tSTAR
|
3093
|
-
rb = "f { |a, (b, *)| }"
|
3094
|
-
pt = s(:iter,
|
3095
|
-
s(:call, nil, :f),
|
3096
|
-
s(:args, :a, s(:masgn, :b, :*)))
|
2964
|
+
def test_interpolated_symbol_array_line_breaks
|
3097
2965
|
|
2966
|
+
rb = "%I(\na\nb\n)\n1"
|
2967
|
+
pt = s(:block,
|
2968
|
+
s(:array,
|
2969
|
+
s(:lit, :a).line(2),
|
2970
|
+
s(:lit, :b).line(3)).line(1),
|
2971
|
+
s(:lit, 1).line(5))
|
3098
2972
|
assert_parse rb, pt
|
3099
2973
|
end
|
3100
2974
|
|
3101
|
-
def
|
3102
|
-
|
3103
|
-
|
3104
|
-
pt = s(:iter,
|
3105
|
-
s(:call, nil, :f),
|
3106
|
-
s(:args, :a, s(:masgn, :b, :*, :c)))
|
2975
|
+
def test_defs_kwarg
|
2976
|
+
rb = "def self.a b: 1\nend"
|
2977
|
+
pt = s(:defs, s(:self), :a, s(:args, s(:kwarg, :b, s(:lit, 1))), s(:nil))
|
3107
2978
|
|
3108
2979
|
assert_parse rb, pt
|
3109
2980
|
end
|
3110
2981
|
|
3111
|
-
def
|
3112
|
-
|
3113
|
-
|
3114
|
-
pt = s(:iter,
|
3115
|
-
s(:call, nil, :f),
|
3116
|
-
s(:args, :a, s(:masgn, :"*b")))
|
2982
|
+
def test_defn_kwarg_kwsplat
|
2983
|
+
rb = "def a(b: 1, **c) end"
|
2984
|
+
pt = s(:defn, :a, s(:args, s(:kwarg, :b, s(:lit, 1)), :"**c"), s(:nil))
|
3117
2985
|
|
3118
2986
|
assert_parse rb, pt
|
3119
2987
|
end
|
3120
2988
|
|
3121
|
-
def
|
3122
|
-
|
3123
|
-
|
3124
|
-
pt = s(:iter,
|
3125
|
-
s(:call, nil, :f),
|
3126
|
-
s(:args, :a, s(:masgn, :"*b", :c)))
|
2989
|
+
def test_defn_kwarg_kwsplat_anon
|
2990
|
+
rb = "def a(b: 1, **) end"
|
2991
|
+
pt = s(:defn, :a, s(:args, s(:kwarg, :b, s(:lit, 1)), :"**"), s(:nil))
|
3127
2992
|
|
3128
2993
|
assert_parse rb, pt
|
3129
2994
|
end
|
3130
2995
|
|
3131
|
-
def
|
3132
|
-
|
3133
|
-
|
3134
|
-
|
3135
|
-
s(:call, nil, :f),
|
3136
|
-
s(:args, :a, s(:masgn, :*)))
|
2996
|
+
def test_defn_kwarg_env
|
2997
|
+
rb = "def test(**testing) test_splat(**testing) end"
|
2998
|
+
pt = s(:defn, :test, s(:args, :"**testing"),
|
2999
|
+
s(:call, nil, :test_splat, s(:hash, s(:kwsplat, s(:lvar, :testing)))))
|
3137
3000
|
|
3138
3001
|
assert_parse rb, pt
|
3139
3002
|
end
|
3140
3003
|
|
3141
|
-
def
|
3142
|
-
|
3143
|
-
|
3144
|
-
pt = s(:iter,
|
3145
|
-
s(:call, nil, :f),
|
3146
|
-
s(:args, :a, s(:masgn, :*, :b)))
|
3004
|
+
def test_dstr_lex_state
|
3005
|
+
rb = '"#{p:a}"'
|
3006
|
+
pt = s(:dstr, "", s(:evstr, s(:call, nil, :p, s(:lit, :a))))
|
3147
3007
|
|
3148
3008
|
assert_parse rb, pt
|
3149
3009
|
end
|
3150
3010
|
|
3151
|
-
def
|
3152
|
-
rb = "a
|
3153
|
-
pt = s(:
|
3011
|
+
def test_call_arg_kwsplat
|
3012
|
+
rb = "a(b, **1)"
|
3013
|
+
pt = s(:call, nil, :a, s(:call, nil, :b), s(:hash, s(:kwsplat, s(:lit, 1))))
|
3154
3014
|
|
3155
3015
|
assert_parse rb, pt
|
3156
3016
|
end
|
3157
3017
|
|
3158
|
-
def
|
3159
|
-
|
3018
|
+
def test_call_arg_assoc_kwsplat
|
3019
|
+
rb = "f(1, kw: 2, **3)"
|
3020
|
+
pt = s(:call, nil, :f,
|
3021
|
+
s(:lit, 1),
|
3022
|
+
s(:hash, s(:lit, :kw), s(:lit, 2), s(:kwsplat, s(:lit, 3))))
|
3160
3023
|
|
3161
|
-
rb = "f ->() {}"
|
3162
3024
|
assert_parse rb, pt
|
3025
|
+
end
|
3026
|
+
|
3027
|
+
def test_call_kwsplat
|
3028
|
+
rb = "a(**1)"
|
3029
|
+
pt = s(:call, nil, :a, s(:hash, s(:kwsplat, s(:lit, 1))))
|
3163
3030
|
|
3164
|
-
rb = "f ->() do end"
|
3165
3031
|
assert_parse rb, pt
|
3032
|
+
end
|
3166
3033
|
|
3167
|
-
|
3034
|
+
def test_iter_kwarg
|
3035
|
+
rb = "a { |b: 1| }"
|
3036
|
+
pt = s(:iter, s(:call, nil, :a), s(:args, s(:kwarg, :b, s(:lit, 1))))
|
3168
3037
|
|
3169
|
-
rb = "f -> {}"
|
3170
3038
|
assert_parse rb, pt
|
3039
|
+
end
|
3040
|
+
|
3041
|
+
def test_iter_kwarg_kwsplat
|
3042
|
+
rb = "a { |b: 1, **c| }"
|
3043
|
+
pt = s(:iter, s(:call, nil, :a), s(:args, s(:kwarg, :b, s(:lit, 1)), :"**c"))
|
3171
3044
|
|
3172
|
-
rb = "f -> do end"
|
3173
3045
|
assert_parse rb, pt
|
3174
3046
|
end
|
3175
3047
|
|
3176
|
-
def
|
3177
|
-
|
3048
|
+
def test_block_kwarg_lvar
|
3049
|
+
rb = "bl { |kw: :val| kw }"
|
3050
|
+
pt = s(:iter, s(:call, nil, :bl), s(:args, s(:kwarg, :kw, s(:lit, :val))),
|
3051
|
+
s(:lvar, :kw))
|
3178
3052
|
|
3179
|
-
rb = "f.(42)"
|
3180
3053
|
assert_parse rb, pt
|
3054
|
+
end
|
3055
|
+
|
3056
|
+
def test_block_kwarg_lvar_multiple
|
3057
|
+
rb = "bl { |kw: :val, kw2: :val2 | kw }"
|
3058
|
+
pt = s(:iter, s(:call, nil, :bl),
|
3059
|
+
s(:args,
|
3060
|
+
s(:kwarg, :kw, s(:lit, :val)),
|
3061
|
+
s(:kwarg, :kw2, s(:lit, :val2))),
|
3062
|
+
s(:lvar, :kw))
|
3181
3063
|
|
3182
|
-
rb = "f::(42)"
|
3183
3064
|
assert_parse rb, pt
|
3184
3065
|
end
|
3185
3066
|
|
3186
|
-
def
|
3187
|
-
rb = "
|
3188
|
-
pt = s(:call,
|
3067
|
+
def test_stabby_block_iter_call
|
3068
|
+
rb = "x -> () do\na.b do\nend\nend"
|
3069
|
+
pt = s(:call, nil, :x,
|
3070
|
+
s(:iter,
|
3071
|
+
s(:call, nil, :lambda),
|
3072
|
+
s(:args),
|
3073
|
+
s(:iter, s(:call, s(:call, nil, :a), :b), 0)))
|
3189
3074
|
|
3190
3075
|
assert_parse rb, pt
|
3191
3076
|
end
|
3192
|
-
end
|
3193
|
-
|
3194
|
-
class TestRuby20Parser < RubyParserTestCase
|
3195
|
-
include TestRubyParserShared
|
3196
|
-
include TestRubyParserShared20to22
|
3197
|
-
include TestRubyParserShared19to22
|
3198
3077
|
|
3199
|
-
def
|
3200
|
-
|
3078
|
+
def test_stabby_block_iter_call_no_target_with_arg
|
3079
|
+
rb = "x -> () do\na(1) do\nend\nend"
|
3080
|
+
pt = s(:call, nil, :x,
|
3081
|
+
s(:iter,
|
3082
|
+
s(:call, nil, :lambda),
|
3083
|
+
s(:args),
|
3084
|
+
s(:iter,
|
3085
|
+
s(:call, nil, :a,
|
3086
|
+
s(:lit, 1)), 0)))
|
3201
3087
|
|
3202
|
-
|
3088
|
+
assert_parse rb, pt
|
3203
3089
|
end
|
3204
3090
|
|
3205
3091
|
def test_block_call_dot_op2_brace_block
|
@@ -3345,113 +3231,17 @@ class TestRuby20Parser < RubyParserTestCase
|
|
3345
3231
|
assert_parse rb, pt
|
3346
3232
|
end
|
3347
3233
|
|
3348
|
-
def test_defn_unary_not
|
3349
|
-
rb = "def !@; true; end" # I seriously HATE this
|
3350
|
-
pt = s(:defn, :"!@", s(:args), s(:true))
|
3351
|
-
|
3352
|
-
assert_parse rb, pt
|
3353
|
-
end
|
3354
|
-
|
3355
3234
|
def test_iter_array_curly
|
3356
3235
|
rb = "f :a, [:b] { |c, d| }" # yes, this is bad code... that's their problem
|
3357
3236
|
pt = s(:iter,
|
3358
3237
|
s(:call, nil, :f, s(:lit, :a), s(:array, s(:lit, :b))),
|
3359
3238
|
s(:args, :c, :d))
|
3360
3239
|
|
3361
|
-
assert_parse rb, pt
|
3362
|
-
end
|
3363
|
-
end
|
3364
|
-
|
3365
|
-
class TestRuby21Parser < RubyParserTestCase
|
3366
|
-
include TestRubyParserShared
|
3367
|
-
include TestRubyParserShared19to22
|
3368
|
-
include TestRubyParserShared20to22
|
3369
|
-
|
3370
|
-
def setup
|
3371
|
-
super
|
3372
|
-
|
3373
|
-
self.processor = Ruby21Parser.new
|
3374
|
-
end
|
3375
|
-
|
3376
|
-
def test_f_kw
|
3377
|
-
rb = "def x k:42; end"
|
3378
|
-
pt = s(:defn, :x, s(:args, s(:kwarg, :k, s(:lit, 42))), s(:nil))
|
3379
|
-
|
3380
|
-
assert_parse rb, pt
|
3381
|
-
end
|
3382
|
-
|
3383
|
-
def test_f_kw__required
|
3384
|
-
rb = "def x k:; end"
|
3385
|
-
pt = s(:defn, :x, s(:args, s(:kwarg, :k)), s(:nil))
|
3386
|
-
|
3387
|
-
assert_parse rb, pt
|
3388
|
-
end
|
3389
|
-
|
3390
|
-
def test_block_kw
|
3391
|
-
rb = "blah { |k:42| }"
|
3392
|
-
pt = s(:iter, s(:call, nil, :blah), s(:args, s(:kwarg, :k, s(:lit, 42))))
|
3393
|
-
|
3394
|
-
assert_parse rb, pt
|
3395
|
-
|
3396
|
-
rb = "blah { |k:42| }"
|
3397
|
-
assert_parse rb, pt
|
3398
|
-
end
|
3399
|
-
|
3400
|
-
def test_block_kw__required
|
3401
|
-
rb = "blah do |k:| end"
|
3402
|
-
pt = s(:iter, s(:call, nil, :blah), s(:args, s(:kwarg, :k)))
|
3403
|
-
|
3404
|
-
assert_parse rb, pt
|
3405
|
-
|
3406
|
-
rb = "blah do |k:| end"
|
3407
|
-
assert_parse rb, pt
|
3408
|
-
end
|
3409
|
-
|
3410
|
-
def test_stabby_block_kw
|
3411
|
-
rb = "-> (k:42) { }"
|
3412
|
-
pt = s(:iter, s(:call, nil, :lambda), s(:args, s(:kwarg, :k, s(:lit, 42))))
|
3413
|
-
|
3414
|
-
assert_parse rb, pt
|
3415
|
-
end
|
3416
|
-
|
3417
|
-
def test_stabby_block_kw__required
|
3418
|
-
rb = "-> (k:) { }"
|
3419
|
-
pt = s(:iter, s(:call, nil, :lambda), s(:args, s(:kwarg, :k)))
|
3420
|
-
|
3421
|
-
assert_parse rb, pt
|
3422
|
-
end
|
3423
|
-
|
3424
|
-
def test_parse_line_heredoc_hardnewline
|
3425
|
-
skip "not yet"
|
3426
|
-
|
3427
|
-
rb = <<-'CODE'.gsub(/^ /, '')
|
3428
|
-
<<-EOFOO
|
3429
|
-
\n\n\n\n\n\n\n\n\n
|
3430
|
-
EOFOO
|
3431
|
-
|
3432
|
-
class Foo
|
3433
|
-
end
|
3434
|
-
CODE
|
3435
|
-
|
3436
|
-
pt = s(:block,
|
3437
|
-
s(:str, "\n\n\n\n\n\n\n\n\n\n").line(1),
|
3438
|
-
s(:class, :Foo, nil).line(5)).line(1)
|
3439
|
-
|
3440
|
-
assert_parse rb, pt
|
3441
|
-
end
|
3442
|
-
end
|
3443
|
-
|
3444
|
-
class TestRuby22Parser < RubyParserTestCase
|
3445
|
-
include TestRubyParserShared
|
3446
|
-
include TestRubyParserShared19to22
|
3447
|
-
include TestRubyParserShared20to22
|
3448
|
-
|
3449
|
-
def setup
|
3450
|
-
super
|
3451
|
-
|
3452
|
-
self.processor = Ruby22Parser.new
|
3240
|
+
assert_parse rb, pt
|
3453
3241
|
end
|
3242
|
+
end
|
3454
3243
|
|
3244
|
+
module TestRubyParserShared22Plus
|
3455
3245
|
def test_call_args_assoc_quoted
|
3456
3246
|
pt = s(:call, nil, :x, s(:hash, s(:lit, :k), s(:lit, 42)))
|
3457
3247
|
|
@@ -3492,17 +3282,7 @@ class TestRuby22Parser < RubyParserTestCase
|
|
3492
3282
|
end
|
3493
3283
|
end
|
3494
3284
|
|
3495
|
-
|
3496
|
-
include TestRubyParserShared
|
3497
|
-
include TestRubyParserShared19to22
|
3498
|
-
include TestRubyParserShared20to22
|
3499
|
-
|
3500
|
-
def setup
|
3501
|
-
super
|
3502
|
-
|
3503
|
-
self.processor = Ruby23Parser.new
|
3504
|
-
end
|
3505
|
-
|
3285
|
+
module TestRubyParserShared23Plus
|
3506
3286
|
def test_safe_call
|
3507
3287
|
rb = "a&.b"
|
3508
3288
|
pt = s(:safe_call, s(:call, nil, :a), :b)
|
@@ -3524,6 +3304,13 @@ class TestRuby23Parser < RubyParserTestCase
|
|
3524
3304
|
assert_parse rb, pt
|
3525
3305
|
end
|
3526
3306
|
|
3307
|
+
def test_safe_call_after_newline
|
3308
|
+
rb = "a\n&.b"
|
3309
|
+
pt = s(:safe_call, s(:call, nil, :a), :b)
|
3310
|
+
|
3311
|
+
assert_parse rb, pt
|
3312
|
+
end
|
3313
|
+
|
3527
3314
|
def test_safe_calls
|
3528
3315
|
rb = "a&.b&.c(1)"
|
3529
3316
|
pt = s(:safe_call, s(:safe_call, s(:call, nil, :a), :b), :c, s(:lit, 1))
|
@@ -3604,22 +3391,311 @@ a + b
|
|
3604
3391
|
)
|
3605
3392
|
|
3606
3393
|
pt = s(:block,
|
3607
|
-
|
3608
|
-
|
3609
|
-
|
3610
|
-
|
3394
|
+
s(:call, nil, :puts, s(:str, "hello my dear friend").line(1)).line(1),
|
3395
|
+
s(:call, s(:call, nil, :a).line(6),
|
3396
|
+
:+,
|
3397
|
+
s(:call, nil, :b).line(6)).line(6)
|
3611
3398
|
).line(1)
|
3612
3399
|
|
3613
3400
|
assert_parse rb, pt
|
3614
3401
|
end
|
3615
3402
|
end
|
3616
3403
|
|
3617
|
-
|
3404
|
+
module TestRubyParserShared24Plus
|
3405
|
+
# ...version specific tests to go here...
|
3406
|
+
end
|
3407
|
+
|
3408
|
+
class TestRubyParser < Minitest::Test
|
3409
|
+
def test_cls_version
|
3410
|
+
assert_equal 18, RubyParser::V18.version
|
3411
|
+
assert_equal 23, RubyParser::V23.version
|
3412
|
+
refute RubyParser::Parser.version
|
3413
|
+
end
|
3414
|
+
|
3415
|
+
def test_parse
|
3416
|
+
processor = RubyParser.new
|
3417
|
+
|
3418
|
+
# 1.8 only syntax
|
3419
|
+
rb = "while false : 42 end"
|
3420
|
+
pt = s(:while, s(:false), s(:lit, 42), true)
|
3421
|
+
|
3422
|
+
assert_silent do
|
3423
|
+
assert_equal pt, processor.parse(rb)
|
3424
|
+
end
|
3425
|
+
|
3426
|
+
# 1.9 only syntax
|
3427
|
+
rb = "a.()"
|
3428
|
+
pt = s(:call, s(:call, nil, :a), :call)
|
3429
|
+
|
3430
|
+
assert_equal pt, processor.parse(rb)
|
3431
|
+
|
3432
|
+
# bad syntax
|
3433
|
+
e = assert_raises Racc::ParseError do
|
3434
|
+
capture_io do
|
3435
|
+
processor.parse "a.("
|
3436
|
+
end
|
3437
|
+
end
|
3438
|
+
|
3439
|
+
msg = "(string):1 :: parse error on value \"(\" (tLPAREN2)"
|
3440
|
+
assert_equal msg, e.message.strip
|
3441
|
+
end
|
3442
|
+
end
|
3443
|
+
|
3444
|
+
class RubyParserTestCase < ParseTreeTestCase
|
3445
|
+
attr_accessor :result, :processor
|
3446
|
+
|
3447
|
+
make_my_diffs_pretty!
|
3448
|
+
|
3449
|
+
def self.previous key
|
3450
|
+
"Ruby"
|
3451
|
+
end
|
3452
|
+
|
3453
|
+
def self.generate_test klass, node, data, input_name, output_name
|
3454
|
+
return if node.to_s =~ /bmethod|dmethod/
|
3455
|
+
return if Array === data['Ruby']
|
3456
|
+
|
3457
|
+
output_name = "ParseTree"
|
3458
|
+
|
3459
|
+
super
|
3460
|
+
end
|
3461
|
+
|
3462
|
+
def assert_parse rb, pt
|
3463
|
+
self.result = processor.parse rb
|
3464
|
+
assert_equal pt, result
|
3465
|
+
end
|
3466
|
+
|
3467
|
+
def refute_parse rb
|
3468
|
+
self.result = processor.parse rb
|
3469
|
+
assert_nil result
|
3470
|
+
end
|
3471
|
+
|
3472
|
+
def assert_syntax_error rb, emsg
|
3473
|
+
e = nil
|
3474
|
+
assert_silent do
|
3475
|
+
e = assert_raises RubyParser::SyntaxError do
|
3476
|
+
processor.parse rb
|
3477
|
+
end
|
3478
|
+
end
|
3479
|
+
|
3480
|
+
assert_equal emsg, e.message
|
3481
|
+
end
|
3482
|
+
|
3483
|
+
def assert_parse_error rb, emsg
|
3484
|
+
e = nil
|
3485
|
+
assert_silent do
|
3486
|
+
e = assert_raises Racc::ParseError do
|
3487
|
+
processor.parse rb
|
3488
|
+
end
|
3489
|
+
end
|
3490
|
+
|
3491
|
+
assert_equal emsg, e.message
|
3492
|
+
end
|
3493
|
+
|
3494
|
+
def assert_parse_line rb, pt, line
|
3495
|
+
old_env = ENV["VERBOSE"]
|
3496
|
+
ENV["VERBOSE"] = "1"
|
3497
|
+
|
3498
|
+
assert_parse rb, pt
|
3499
|
+
assert_equal line, result.line, "call should have line number"
|
3500
|
+
ensure
|
3501
|
+
ENV["VERBOSE"] = old_env
|
3502
|
+
end
|
3503
|
+
end
|
3504
|
+
|
3505
|
+
class TestRubyParserV18 < RubyParserTestCase
|
3506
|
+
include TestRubyParserShared
|
3507
|
+
|
3508
|
+
def setup
|
3509
|
+
super
|
3510
|
+
|
3511
|
+
self.processor = RubyParser::V18.new
|
3512
|
+
end
|
3513
|
+
|
3514
|
+
def test_assoc_list_18
|
3515
|
+
rb = "{1, 2, 3, 4}"
|
3516
|
+
pt = s(:hash, s(:lit, 1), s(:lit, 2), s(:lit, 3), s(:lit, 4))
|
3517
|
+
|
3518
|
+
assert_parse rb, pt
|
3519
|
+
end
|
3520
|
+
|
3521
|
+
def test_case_then_colon_18
|
3522
|
+
rb = "case x; when Fixnum: 42; end"
|
3523
|
+
pt = s(:case,
|
3524
|
+
s(:call, nil, :x),
|
3525
|
+
s(:when, s(:array, s(:const, :Fixnum)), s(:lit, 42)),
|
3526
|
+
nil)
|
3527
|
+
|
3528
|
+
assert_parse rb, pt
|
3529
|
+
end
|
3530
|
+
|
3531
|
+
def test_do_colon_18
|
3532
|
+
rb = "while false : 42 end"
|
3533
|
+
pt = s(:while, s(:false), s(:lit, 42), true)
|
3534
|
+
|
3535
|
+
assert_parse rb, pt
|
3536
|
+
end
|
3537
|
+
|
3538
|
+
def test_call_space_before_paren_args_18
|
3539
|
+
rb = "a (:b, :c, :d => :e)"
|
3540
|
+
pt = s(:call, nil, :a,
|
3541
|
+
s(:lit, :b),
|
3542
|
+
s(:lit, :c),
|
3543
|
+
s(:hash, s(:lit, :d), s(:lit, :e)))
|
3544
|
+
|
3545
|
+
assert_parse rb, pt
|
3546
|
+
end
|
3547
|
+
|
3548
|
+
# In 1.8, block args with an outer set of parens are superfluous.
|
3549
|
+
# In 1.9, outer set of parens are NOT... they are an explicit extra masgn.
|
3550
|
+
|
3551
|
+
def test_iter_args_2_18
|
3552
|
+
rb = "f { |(a, b)| }"
|
3553
|
+
pt = s(:iter, s(:call, nil, :f), s(:args, :a, :b))
|
3554
|
+
|
3555
|
+
assert_parse rb, pt
|
3556
|
+
end
|
3557
|
+
|
3558
|
+
def test_bug_args__18
|
3559
|
+
rb = "f { |(a, b)| }"
|
3560
|
+
pt = s(:iter, s(:call, nil, :f),
|
3561
|
+
s(:args, :a, :b))
|
3562
|
+
|
3563
|
+
assert_parse rb, pt
|
3564
|
+
end
|
3565
|
+
|
3566
|
+
def test_bug_args_masgn_outer_parens__18
|
3567
|
+
rb = "f { |((a, b), c)| }"
|
3568
|
+
pt = s(:iter, # NOTE: same sexp as test_bug_args_masgn
|
3569
|
+
s(:call, nil, :f),
|
3570
|
+
s(:args, s(:masgn, :a, :b), :c))
|
3571
|
+
|
3572
|
+
assert_parse rb, pt.dup
|
3573
|
+
end
|
3574
|
+
|
3575
|
+
def test_double_block_error_10
|
3576
|
+
assert_syntax_error "a.b (&b) {}", BLOCK_DUP_MSG
|
3577
|
+
end
|
3578
|
+
|
3579
|
+
def test_double_block_error_11
|
3580
|
+
assert_syntax_error "a (1, &b) { }", BLOCK_DUP_MSG
|
3581
|
+
end
|
3582
|
+
|
3583
|
+
def test_double_block_error_12
|
3584
|
+
assert_syntax_error "a (1, &b) do end", BLOCK_DUP_MSG
|
3585
|
+
end
|
3586
|
+
|
3587
|
+
def test_double_block_error_13
|
3588
|
+
assert_syntax_error "m.a (1, &b) { }", BLOCK_DUP_MSG
|
3589
|
+
end
|
3590
|
+
|
3591
|
+
def test_double_block_error_14
|
3592
|
+
assert_syntax_error "m.a (1, &b) do end", BLOCK_DUP_MSG
|
3593
|
+
end
|
3594
|
+
|
3595
|
+
def test_double_block_error_15
|
3596
|
+
assert_syntax_error "m::a (1, &b) { }", BLOCK_DUP_MSG
|
3597
|
+
end
|
3598
|
+
|
3599
|
+
def test_double_block_error_16
|
3600
|
+
assert_syntax_error "m::a (1, &b) do end", BLOCK_DUP_MSG
|
3601
|
+
end
|
3602
|
+
end
|
3603
|
+
|
3604
|
+
class TestRubyParserV19 < RubyParserTestCase
|
3605
|
+
include TestRubyParserShared
|
3606
|
+
include TestRubyParserShared19Plus
|
3607
|
+
|
3608
|
+
def setup
|
3609
|
+
super
|
3610
|
+
|
3611
|
+
self.processor = RubyParser::V19.new
|
3612
|
+
end
|
3613
|
+
end
|
3614
|
+
|
3615
|
+
class TestRubyParserV20 < RubyParserTestCase
|
3616
|
+
include TestRubyParserShared
|
3617
|
+
include TestRubyParserShared19Plus
|
3618
|
+
include TestRubyParserShared20Plus
|
3619
|
+
|
3620
|
+
def setup
|
3621
|
+
super
|
3622
|
+
|
3623
|
+
self.processor = RubyParser::V20.new
|
3624
|
+
end
|
3625
|
+
|
3626
|
+
def test_defn_unary_not
|
3627
|
+
rb = "def !@; true; end" # I seriously HATE this
|
3628
|
+
pt = s(:defn, :"!@", s(:args), s(:true))
|
3629
|
+
|
3630
|
+
assert_parse rb, pt
|
3631
|
+
end
|
3632
|
+
end
|
3633
|
+
|
3634
|
+
class TestRubyParserV21 < RubyParserTestCase
|
3635
|
+
include TestRubyParserShared
|
3636
|
+
include TestRubyParserShared19Plus
|
3637
|
+
include TestRubyParserShared20Plus
|
3638
|
+
include TestRubyParserShared21Plus
|
3639
|
+
|
3640
|
+
def setup
|
3641
|
+
super
|
3642
|
+
|
3643
|
+
self.processor = RubyParser::V21.new
|
3644
|
+
end
|
3645
|
+
end
|
3646
|
+
|
3647
|
+
class TestRubyParserV22 < RubyParserTestCase
|
3648
|
+
include TestRubyParserShared
|
3649
|
+
include TestRubyParserShared19Plus
|
3650
|
+
include TestRubyParserShared20Plus
|
3651
|
+
include TestRubyParserShared21Plus
|
3652
|
+
include TestRubyParserShared22Plus
|
3653
|
+
|
3654
|
+
def setup
|
3655
|
+
super
|
3656
|
+
|
3657
|
+
self.processor = RubyParser::V22.new
|
3658
|
+
end
|
3659
|
+
end
|
3660
|
+
|
3661
|
+
class TestRubyParserV23 < RubyParserTestCase
|
3662
|
+
include TestRubyParserShared
|
3663
|
+
include TestRubyParserShared19Plus
|
3664
|
+
include TestRubyParserShared20Plus
|
3665
|
+
include TestRubyParserShared21Plus
|
3666
|
+
include TestRubyParserShared22Plus
|
3667
|
+
include TestRubyParserShared23Plus
|
3668
|
+
|
3669
|
+
def setup
|
3670
|
+
super
|
3671
|
+
|
3672
|
+
self.processor = RubyParser::V23.new
|
3673
|
+
end
|
3674
|
+
end
|
3675
|
+
|
3676
|
+
class TestRubyParserV24 < RubyParserTestCase
|
3677
|
+
include TestRubyParserShared
|
3678
|
+
include TestRubyParserShared19Plus
|
3679
|
+
include TestRubyParserShared20Plus
|
3680
|
+
include TestRubyParserShared21Plus
|
3681
|
+
include TestRubyParserShared22Plus
|
3682
|
+
include TestRubyParserShared23Plus
|
3683
|
+
include TestRubyParserShared24Plus
|
3684
|
+
|
3685
|
+
def setup
|
3686
|
+
super
|
3687
|
+
|
3688
|
+
self.processor = RubyParser::V24.new
|
3689
|
+
end
|
3690
|
+
end
|
3691
|
+
|
3692
|
+
RubyParser::VERSIONS.each do |klass|
|
3693
|
+
v = klass.version
|
3618
3694
|
describe "block args arity #{v}" do
|
3619
3695
|
attr_accessor :parser
|
3620
3696
|
|
3621
3697
|
before do
|
3622
|
-
self.parser =
|
3698
|
+
self.parser = RubyParser.const_get("V#{v}").new
|
3623
3699
|
end
|
3624
3700
|
|
3625
3701
|
{
|