ruby_parser 3.13.0 → 3.13.1
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 +32 -0
- data/Rakefile +2 -3
- data/bin/ruby_parse_extract_error +10 -32
- data/lib/rp_extensions.rb +1 -1
- data/lib/ruby20_parser.rb +2427 -2432
- data/lib/ruby20_parser.y +32 -29
- data/lib/ruby21_parser.rb +2101 -2109
- data/lib/ruby21_parser.y +32 -29
- data/lib/ruby22_parser.rb +2080 -2095
- data/lib/ruby22_parser.y +32 -29
- data/lib/ruby23_parser.rb +2337 -2332
- data/lib/ruby23_parser.y +32 -29
- data/lib/ruby24_parser.rb +2347 -2335
- data/lib/ruby24_parser.y +32 -23
- data/lib/ruby25_parser.rb +2347 -2334
- data/lib/ruby25_parser.y +32 -23
- data/lib/ruby26_parser.rb +2351 -2338
- data/lib/ruby26_parser.y +32 -23
- data/lib/ruby_lexer.rb +253 -161
- data/lib/ruby_lexer.rex +25 -25
- data/lib/ruby_lexer.rex.rb +68 -26
- data/lib/ruby_parser.rb +3 -1
- data/lib/ruby_parser.yy +34 -23
- data/lib/ruby_parser_extras.rb +64 -43
- data/test/test_ruby_lexer.rb +1013 -952
- data/test/test_ruby_parser.rb +161 -24
- data/tools/munge.rb +2 -1
- data/tools/ripper.rb +6 -1
- metadata +2 -2
- metadata.gz.sig +0 -0
data/test/test_ruby_parser.rb
CHANGED
@@ -30,6 +30,25 @@ module TestRubyParserShared
|
|
30
30
|
|
31
31
|
BLOCK_DUP_MSG = "Both block arg and actual block given."
|
32
32
|
|
33
|
+
def test_bug191
|
34
|
+
pt = s(:if, s(:call, nil, :a), s(:str, ""), s(:call, nil, :b))
|
35
|
+
|
36
|
+
rb = "a ? '': b"
|
37
|
+
assert_parse rb, pt
|
38
|
+
|
39
|
+
rb = "a ? \"\": b"
|
40
|
+
assert_parse rb, pt
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_bug202
|
44
|
+
rb = "$测试 = 1\n测试 = 1"
|
45
|
+
pt = s(:block,
|
46
|
+
s(:gasgn, :$测试, s(:lit, 1)),
|
47
|
+
s(:lasgn, :测试, s(:lit, 1)))
|
48
|
+
|
49
|
+
assert_parse rb, pt
|
50
|
+
end
|
51
|
+
|
33
52
|
def test_double_block_error_01
|
34
53
|
assert_syntax_error "a(1, &b) { }", BLOCK_DUP_MSG
|
35
54
|
end
|
@@ -499,6 +518,14 @@ module TestRubyParserShared
|
|
499
518
|
assert_parse rb, pt
|
500
519
|
end
|
501
520
|
|
521
|
+
def test_str_evstr_escape
|
522
|
+
char = [0x00bd].pack("U")
|
523
|
+
rb = "\"a #\{b}\\302\\275\""
|
524
|
+
pt = s(:dstr, "a ", s(:evstr, s(:call, nil, :b)), s(:str, char))
|
525
|
+
|
526
|
+
assert_parse rb, pt
|
527
|
+
end
|
528
|
+
|
502
529
|
def test_dsym_to_sym
|
503
530
|
pt = s(:alias, s(:lit, :<<), s(:lit, :>>))
|
504
531
|
|
@@ -525,6 +552,10 @@ module TestRubyParserShared
|
|
525
552
|
# TODO: add more including interpolation etc
|
526
553
|
end
|
527
554
|
|
555
|
+
def test_regexp_escape_extended
|
556
|
+
assert_parse '/\“/', s(:lit, /“/)
|
557
|
+
end
|
558
|
+
|
528
559
|
def test_label_vs_string
|
529
560
|
rb = "_buf << ':\n'"
|
530
561
|
pt = s(:call, s(:call, nil, :_buf), :<<, s(:str, ":\n"))
|
@@ -702,8 +733,6 @@ module TestRubyParserShared
|
|
702
733
|
end
|
703
734
|
|
704
735
|
def test_parse_line_dstr_newline
|
705
|
-
skip "dstr line numbers are just gonna be screwed for a while..."
|
706
|
-
|
707
736
|
rb = <<-'CODE'
|
708
737
|
"a\n#{
|
709
738
|
}"
|
@@ -1259,6 +1288,16 @@ module TestRubyParserShared
|
|
1259
1288
|
assert_parse rb, pt
|
1260
1289
|
end
|
1261
1290
|
|
1291
|
+
def test_lasgn_call_bracket_rescue_arg
|
1292
|
+
rb = "a = b(1) rescue 2"
|
1293
|
+
pt = s(:lasgn, :a,
|
1294
|
+
s(:rescue,
|
1295
|
+
s(:call, nil, :b, s(:lit, 1)),
|
1296
|
+
s(:resbody, s(:array), s(:lit, 2))))
|
1297
|
+
|
1298
|
+
assert_parse rb, pt
|
1299
|
+
end
|
1300
|
+
|
1262
1301
|
def test_call_bang_squiggle
|
1263
1302
|
rb = "1 !~ 2"
|
1264
1303
|
pt = s(:not, s(:call, s(:lit, 1), :=~, s(:lit, 2))) # TODO: check for 1.9+
|
@@ -1554,6 +1593,20 @@ module TestRubyParserShared
|
|
1554
1593
|
assert_parse rb, pt
|
1555
1594
|
end
|
1556
1595
|
|
1596
|
+
def test_heredoc_bad_hex_escape
|
1597
|
+
rb = "s = <<eos\na\\xE9b\neos"
|
1598
|
+
pt = s(:lasgn, :s, s(:str, "a\xE9b\n".b))
|
1599
|
+
|
1600
|
+
assert_parse rb, pt
|
1601
|
+
end
|
1602
|
+
|
1603
|
+
def test_heredoc_bad_oct_escape
|
1604
|
+
rb = "s = <<-EOS\na\\247b\ncöd\nEOS\n"
|
1605
|
+
pt = s(:lasgn, :s, s(:str, "a\xa7b\nc\xc3\xb6d\n".b))
|
1606
|
+
|
1607
|
+
assert_parse rb, pt
|
1608
|
+
end
|
1609
|
+
|
1557
1610
|
def test_masgn_double_paren
|
1558
1611
|
rb = "((a,b))=c" # TODO: blog
|
1559
1612
|
pt = s(:masgn,
|
@@ -1708,6 +1761,22 @@ module TestRubyParserShared
|
|
1708
1761
|
|
1709
1762
|
assert_parse rb, pt
|
1710
1763
|
end
|
1764
|
+
|
1765
|
+
def test_str_interp_ternary_or_label
|
1766
|
+
env = processor.env
|
1767
|
+
env[:a] = :lvar
|
1768
|
+
|
1769
|
+
rb = '"#{a.b? ? ""+a+"": ""}"'
|
1770
|
+
pt = s(:dstr,
|
1771
|
+
"",
|
1772
|
+
s(:evstr,
|
1773
|
+
s(:if,
|
1774
|
+
s(:call, s(:lvar, :a), :b?),
|
1775
|
+
s(:call, s(:call, s(:str, ""), :+, s(:lvar, :a)), :+, s(:str, "")),
|
1776
|
+
s(:str, ""))))
|
1777
|
+
|
1778
|
+
assert_parse rb, pt
|
1779
|
+
end
|
1711
1780
|
end
|
1712
1781
|
|
1713
1782
|
module TestRubyParserShared19Plus
|
@@ -2537,10 +2606,8 @@ module TestRubyParserShared19Plus
|
|
2537
2606
|
end
|
2538
2607
|
|
2539
2608
|
def test_pipe_semicolon
|
2540
|
-
skip "not yet"
|
2541
|
-
|
2542
2609
|
rb = "a.b do | ; c | end"
|
2543
|
-
pt = s(:iter, s(:call, s(:call, nil, :a), :b),
|
2610
|
+
pt = s(:iter, s(:call, s(:call, nil, :a), :b), s(:args, s(:shadow, :c)))
|
2544
2611
|
|
2545
2612
|
assert_parse rb, pt
|
2546
2613
|
end
|
@@ -2648,10 +2715,13 @@ module TestRubyParserShared19Plus
|
|
2648
2715
|
end
|
2649
2716
|
|
2650
2717
|
def test_kill_me5
|
2651
|
-
skip "not yet"
|
2652
|
-
|
2653
2718
|
rb = "f ->() { g do end }"
|
2654
|
-
pt =
|
2719
|
+
pt = s(:call, nil, :f,
|
2720
|
+
s(:iter,
|
2721
|
+
s(:call, nil, :lambda),
|
2722
|
+
s(:args),
|
2723
|
+
s(:iter, s(:call, nil, :g), 0)))
|
2724
|
+
|
2655
2725
|
|
2656
2726
|
assert_parse rb, pt
|
2657
2727
|
end
|
@@ -2664,8 +2734,6 @@ module TestRubyParserShared19Plus
|
|
2664
2734
|
end
|
2665
2735
|
|
2666
2736
|
def test_iter_args_5
|
2667
|
-
skip "not yet"
|
2668
|
-
|
2669
2737
|
rb = "f { |a, &b| }"
|
2670
2738
|
pt = s(:iter, s(:call, nil, :f), s(:args, :a, :"&b"))
|
2671
2739
|
|
@@ -3264,8 +3332,6 @@ module TestRubyParserShared21Plus
|
|
3264
3332
|
end
|
3265
3333
|
|
3266
3334
|
def test_parse_line_heredoc_hardnewline
|
3267
|
-
skip "not yet"
|
3268
|
-
|
3269
3335
|
rb = <<-'CODE'.gsub(/^ /, '')
|
3270
3336
|
<<-EOFOO
|
3271
3337
|
\n\n\n\n\n\n\n\n\n
|
@@ -3286,6 +3352,13 @@ end
|
|
3286
3352
|
module TestRubyParserShared22Plus
|
3287
3353
|
include TestRubyParserShared21Plus
|
3288
3354
|
|
3355
|
+
def test_bug_hash_interp_array
|
3356
|
+
rp = '{ "#{}": [] }'
|
3357
|
+
pt = s(:hash, s(:dsym, "", s(:evstr)), s(:array))
|
3358
|
+
|
3359
|
+
assert_parse rp, pt
|
3360
|
+
end
|
3361
|
+
|
3289
3362
|
def test_call_args_assoc_quoted
|
3290
3363
|
pt = s(:call, nil, :x, s(:hash, s(:lit, :k), s(:lit, 42)))
|
3291
3364
|
|
@@ -3301,16 +3374,6 @@ module TestRubyParserShared22Plus
|
|
3301
3374
|
assert_parse rb, pt
|
3302
3375
|
end
|
3303
3376
|
|
3304
|
-
def test_bug191
|
3305
|
-
pt = s(:if, s(:call, nil, :a), s(:str, ""), s(:call, nil, :b))
|
3306
|
-
|
3307
|
-
rb = "a ? '': b"
|
3308
|
-
assert_parse rb, pt
|
3309
|
-
|
3310
|
-
rb = "a ? \"\": b"
|
3311
|
-
assert_parse rb, pt
|
3312
|
-
end
|
3313
|
-
|
3314
3377
|
def test_quoted_symbol_keys
|
3315
3378
|
rb = "{ 'a': :b }"
|
3316
3379
|
pt = s(:hash, s(:lit, :a), s(:lit, :b))
|
@@ -3329,6 +3392,13 @@ end
|
|
3329
3392
|
module TestRubyParserShared23Plus
|
3330
3393
|
include TestRubyParserShared22Plus
|
3331
3394
|
|
3395
|
+
def test_bug_215
|
3396
|
+
rb = 'undef %s(foo)'
|
3397
|
+
pt = s(:undef, s(:lit, :foo))
|
3398
|
+
|
3399
|
+
assert_parse rb, pt
|
3400
|
+
end
|
3401
|
+
|
3332
3402
|
def test_safe_call
|
3333
3403
|
rb = "a&.b"
|
3334
3404
|
pt = s(:safe_call, s(:call, nil, :a), :b)
|
@@ -3406,6 +3476,41 @@ module TestRubyParserShared23Plus
|
|
3406
3476
|
assert_parse rb, pt
|
3407
3477
|
end
|
3408
3478
|
|
3479
|
+
def test_const_op_asgn_or
|
3480
|
+
rb = "X::Y ||= 1"
|
3481
|
+
pt = s(:op_asgn_or, s(:colon2, s(:const, :X), :Y), s(:lit, 1))
|
3482
|
+
|
3483
|
+
assert_parse rb, pt
|
3484
|
+
end
|
3485
|
+
|
3486
|
+
def test_const_2_op_asgn_or2
|
3487
|
+
rb = "::X::Y ||= 1"
|
3488
|
+
pt = s(:op_asgn_or, s(:colon2, s(:colon3, :X), :Y), s(:lit, 1))
|
3489
|
+
|
3490
|
+
assert_parse rb, pt
|
3491
|
+
end
|
3492
|
+
|
3493
|
+
def test_const_3_op_asgn_or
|
3494
|
+
rb = "::X ||= 1"
|
3495
|
+
pt = s(:op_asgn_or, s(:colon3, :X), s(:lit, 1))
|
3496
|
+
|
3497
|
+
assert_parse rb, pt
|
3498
|
+
end
|
3499
|
+
|
3500
|
+
def test_const_op_asgn_and2
|
3501
|
+
rb = "::X &&= 1"
|
3502
|
+
pt = s(:op_asgn_and, s(:colon3, :X), s(:lit, 1))
|
3503
|
+
|
3504
|
+
assert_parse rb, pt
|
3505
|
+
end
|
3506
|
+
|
3507
|
+
def test_const_op_asgn_and1
|
3508
|
+
rb = "::X &= 1"
|
3509
|
+
pt = s(:op_asgn, s(:colon3, :X), :"&", s(:lit, 1))
|
3510
|
+
|
3511
|
+
assert_parse rb, pt
|
3512
|
+
end
|
3513
|
+
|
3409
3514
|
def test_ruby21_numbers
|
3410
3515
|
rb = "[1i, 2r, 3ri]"
|
3411
3516
|
pt = s(:array, s(:lit, Complex(0, 1)), s(:lit, Rational(2)), s(:lit, Complex(0, Rational(3))))
|
@@ -3468,7 +3573,15 @@ end
|
|
3468
3573
|
module TestRubyParserShared24Plus
|
3469
3574
|
include TestRubyParserShared23Plus
|
3470
3575
|
|
3471
|
-
|
3576
|
+
def test_lasgn_call_nobracket_rescue_arg
|
3577
|
+
rb = "a = b 1 rescue 2"
|
3578
|
+
pt = s(:lasgn, :a,
|
3579
|
+
s(:rescue,
|
3580
|
+
s(:call, nil, :b, s(:lit, 1)),
|
3581
|
+
s(:resbody, s(:array), s(:lit, 2))))
|
3582
|
+
|
3583
|
+
assert_parse rb, pt
|
3584
|
+
end
|
3472
3585
|
end
|
3473
3586
|
|
3474
3587
|
module TestRubyParserShared25Plus
|
@@ -3591,7 +3704,11 @@ class RubyParserTestCase < ParseTreeTestCase
|
|
3591
3704
|
end
|
3592
3705
|
end
|
3593
3706
|
|
3594
|
-
|
3707
|
+
if Regexp === emsg then
|
3708
|
+
assert_match emsg, e.message
|
3709
|
+
else
|
3710
|
+
assert_equal emsg, e.message
|
3711
|
+
end
|
3595
3712
|
end
|
3596
3713
|
|
3597
3714
|
def assert_parse_line rb, pt, line
|
@@ -3643,6 +3760,15 @@ class TestRubyParserV23 < RubyParserTestCase
|
|
3643
3760
|
|
3644
3761
|
self.processor = RubyParser::V23.new
|
3645
3762
|
end
|
3763
|
+
|
3764
|
+
def test_lasgn_call_nobracket_rescue_arg
|
3765
|
+
rb = "a = b 1 rescue 2"
|
3766
|
+
pt = s(:rescue,
|
3767
|
+
s(:lasgn, :a, s(:call, nil, :b, s(:lit, 1))),
|
3768
|
+
s(:resbody, s(:array), s(:lit, 2)))
|
3769
|
+
|
3770
|
+
assert_parse rb, pt
|
3771
|
+
end
|
3646
3772
|
end
|
3647
3773
|
|
3648
3774
|
class TestRubyParserV24 < RubyParserTestCase
|
@@ -3653,6 +3779,17 @@ class TestRubyParserV24 < RubyParserTestCase
|
|
3653
3779
|
|
3654
3780
|
self.processor = RubyParser::V24.new
|
3655
3781
|
end
|
3782
|
+
|
3783
|
+
def test_rescue_parens
|
3784
|
+
rb = "a (b rescue c)"
|
3785
|
+
pt = s(:call, nil, :a,
|
3786
|
+
s(:rescue, s(:call, nil, :b),
|
3787
|
+
s(:resbody, s(:array), s(:call, nil, :c))))
|
3788
|
+
|
3789
|
+
assert_parse rb, pt
|
3790
|
+
|
3791
|
+
assert_parse_error "a(b rescue c)", /parse error on value ..rescue/
|
3792
|
+
end
|
3656
3793
|
end
|
3657
3794
|
|
3658
3795
|
class TestRubyParserV25 < RubyParserTestCase
|
data/tools/munge.rb
CHANGED
@@ -107,6 +107,7 @@ def munge s
|
|
107
107
|
|
108
108
|
'"defined?"', "kDEFINED",
|
109
109
|
|
110
|
+
"<none>", "none",
|
110
111
|
|
111
112
|
'"do (for condition)"', "kDO_COND",
|
112
113
|
'"do (for lambda)"', "kDO_LAMBDA",
|
@@ -167,7 +168,7 @@ ARGF.each_line do |line|
|
|
167
168
|
item = $1
|
168
169
|
stack << munge(item)
|
169
170
|
when /^-> \$\$ = (?:token|nterm) (.+) \(.*\)/ then
|
170
|
-
stack << "
|
171
|
+
stack << "none" if stack.empty?
|
171
172
|
item = munge $1
|
172
173
|
x = stack.map { |s| s.strip }.join " "
|
173
174
|
if x != item then # prevent kdef -> kdef
|
data/tools/ripper.rb
CHANGED
@@ -6,8 +6,13 @@ $p ||= false
|
|
6
6
|
require "ripper/sexp"
|
7
7
|
require "pp" if $p
|
8
8
|
|
9
|
+
if ARGV.empty? then
|
10
|
+
warn "reading from stdin"
|
11
|
+
ARGV << "-"
|
12
|
+
end
|
13
|
+
|
9
14
|
ARGV.each do |path|
|
10
|
-
src = File.read
|
15
|
+
src = path == "-" ? $stdin.read : File.read(path)
|
11
16
|
rip = Ripper::SexpBuilderPP.new src
|
12
17
|
rip.yydebug = $d
|
13
18
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.13.
|
4
|
+
version: 3.13.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Davis
|
@@ -29,7 +29,7 @@ cert_chain:
|
|
29
29
|
Em82dBUFsipwMLCYj39kcyHWAxyl6Ae1Cn9r/ItVBCxoeFdrHjfavnrIEoXUt4bU
|
30
30
|
UfBugfLD19bu3nvL+zTAGx/U
|
31
31
|
-----END CERTIFICATE-----
|
32
|
-
date: 2019-03-
|
32
|
+
date: 2019-03-26 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: sexp_processor
|
metadata.gz.sig
CHANGED
Binary file
|