parser 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +7 -7
  2. data/.gitignore +0 -1
  3. data/README.md +4 -2
  4. data/bin/{parse → ruby-parse} +2 -2
  5. data/bin/ruby-rewrite +6 -0
  6. data/{AST_FORMAT.md → doc/AST_FORMAT.md} +45 -29
  7. data/doc/CUSTOMIZATION.md +37 -0
  8. data/doc/INTERNALS.md +21 -0
  9. data/lib/parser.rb +14 -3
  10. data/lib/parser/ast/node.rb +6 -0
  11. data/lib/parser/ast/processor.rb +216 -0
  12. data/lib/parser/builders/default.rb +613 -215
  13. data/lib/parser/compatibility/slop.rb +12 -0
  14. data/lib/parser/lexer.rl +30 -10
  15. data/lib/parser/lexer/explanation.rb +1 -1
  16. data/lib/parser/lexer/literal.rb +5 -6
  17. data/lib/parser/ruby18.y +31 -24
  18. data/lib/parser/ruby19.y +26 -19
  19. data/lib/parser/ruby20.y +27 -20
  20. data/lib/parser/ruby21.y +27 -20
  21. data/lib/parser/runner.rb +198 -0
  22. data/lib/parser/runner/ruby_parse.rb +87 -0
  23. data/lib/parser/runner/ruby_rewrite.rb +13 -0
  24. data/lib/parser/source/buffer.rb +1 -0
  25. data/lib/parser/source/map.rb +20 -0
  26. data/lib/parser/source/map/block.rb +16 -0
  27. data/lib/parser/source/map/collection.rb +16 -0
  28. data/lib/parser/source/map/condition.rb +19 -0
  29. data/lib/parser/source/map/constant.rb +27 -0
  30. data/lib/parser/source/map/definition.rb +21 -0
  31. data/lib/parser/source/map/for.rb +17 -0
  32. data/lib/parser/source/map/keyword.rb +18 -0
  33. data/lib/parser/source/map/rescue_body.rb +19 -0
  34. data/lib/parser/source/map/send.rb +29 -0
  35. data/lib/parser/source/map/ternary.rb +16 -0
  36. data/lib/parser/source/map/variable.rb +26 -0
  37. data/lib/parser/source/range.rb +25 -24
  38. data/lib/parser/version.rb +3 -0
  39. data/parser.gemspec +4 -2
  40. data/test/parse_helper.rb +13 -10
  41. data/test/test_lexer.rb +32 -11
  42. data/test/test_parse_helper.rb +1 -0
  43. data/test/test_parser.rb +176 -128
  44. data/test/test_source_range.rb +18 -6
  45. metadata +161 -91
  46. data/bin/benchmark +0 -47
  47. data/bin/explain-parse +0 -14
  48. data/lib/parser/source/map/variable_assignment.rb +0 -15
@@ -68,6 +68,7 @@ class TestParseHelper < MiniTest::Unit::TestCase
68
68
  assert_equal nil, traverse_ast(ast, %w(str))
69
69
 
70
70
  assert_equal s(:str, "foo"), traverse_ast(ast, %w(dstr str))
71
+ assert_equal s(:int, 2), traverse_ast(ast, %w(dstr int))
71
72
  assert_equal s(:int, 2), traverse_ast(ast, %w(dstr int/1))
72
73
  assert_equal s(:int, 3), traverse_ast(ast, %w(dstr int/2))
73
74
  assert_equal nil, traverse_ast(ast, %w(dstr int/3))
data/test/test_parser.rb CHANGED
@@ -107,6 +107,13 @@ class TestParser < MiniTest::Unit::TestCase
107
107
  %q{^ begin
108
108
  | ^ end
109
109
  |~~~~~~~~ expression})
110
+
111
+ assert_parses(
112
+ s(:str, 'foobar'),
113
+ %q{%q(foobar)},
114
+ %q{^^^ begin
115
+ | ^ end
116
+ |~~~~~~~~~~ expression})
110
117
  end
111
118
 
112
119
  def test_string_interp
@@ -140,12 +147,10 @@ class TestParser < MiniTest::Unit::TestCase
140
147
  s(:ivar, :@a)),
141
148
  s(:str, 'bar')),
142
149
  %q{"foo#@a" "bar"},
143
- %q{^ begin
144
- |^ begin (dstr)
150
+ %q{^ begin (dstr)
145
151
  | ^ end (dstr)
146
152
  | ^ begin (str)
147
153
  | ^ end (str)
148
- | ^ end
149
154
  |~~~~~~~~~~~~~~ expression})
150
155
  end
151
156
 
@@ -167,7 +172,7 @@ class TestParser < MiniTest::Unit::TestCase
167
172
  assert_parses(
168
173
  s(:sym, :foo),
169
174
  %q{:'foo'},
170
- %q{ ^ begin
175
+ %q{^^ begin
171
176
  | ^ end
172
177
  |~~~~~~ expression})
173
178
  end
@@ -179,9 +184,9 @@ class TestParser < MiniTest::Unit::TestCase
179
184
  s(:lvar, :bar),
180
185
  s(:str, 'baz')),
181
186
  %q{:"foo#{bar}baz"},
182
- %q{ ^ begin
187
+ %q{^^ begin
183
188
  | ^ end
184
- | ~~~~~~~~~~~~~~ expression})
189
+ |~~~~~~~~~~~~~~~ expression})
185
190
  end
186
191
 
187
192
  def test_symbol_empty
@@ -429,8 +434,7 @@ class TestParser < MiniTest::Unit::TestCase
429
434
  %q[{ foo: 2 }],
430
435
  %q{^ begin
431
436
  | ^ end
432
- | ^ operator (pair)
433
- | ~~~ expression (pair.sym)
437
+ | ~~~~ expression (pair.sym)
434
438
  | ~~~~~~ expression (pair)
435
439
  |~~~~~~~~~~ expression},
436
440
  ALL_VERSIONS - %w(1.8))
@@ -546,6 +550,7 @@ class TestParser < MiniTest::Unit::TestCase
546
550
  s(:const, s(:cbase), :Foo),
547
551
  %q{::Foo},
548
552
  %q{ ~~~ name
553
+ |~~ double_colon
549
554
  |~~~~~ expression})
550
555
  end
551
556
 
@@ -554,6 +559,7 @@ class TestParser < MiniTest::Unit::TestCase
554
559
  s(:const, s(:const, nil, :Bar), :Foo),
555
560
  %q{Bar::Foo},
556
561
  %q{ ~~~ name
562
+ | ~~ double_colon
557
563
  |~~~~~~~~ expression})
558
564
  end
559
565
 
@@ -715,6 +721,7 @@ class TestParser < MiniTest::Unit::TestCase
715
721
  %q{::Foo = 10},
716
722
  %q{ ~~~ name
717
723
  | ^ operator
724
+ |~~ double_colon
718
725
  |~~~~~~~~~~ expression
719
726
  })
720
727
  end
@@ -725,6 +732,7 @@ class TestParser < MiniTest::Unit::TestCase
725
732
  %q{Bar::Foo = 10},
726
733
  %q{ ~~~ name
727
734
  | ^ operator
735
+ | ~~ double_colon
728
736
  |~~~~~~~~~~~~~ expression
729
737
  })
730
738
  end
@@ -775,8 +783,10 @@ class TestParser < MiniTest::Unit::TestCase
775
783
  s(:mlhs, s(:lvasgn, :foo), s(:lvasgn, :bar)),
776
784
  s(:array, s(:int, 1), s(:int, 2))),
777
785
  %q{(foo, bar) = 1, 2},
778
- %q{^ begin
779
- | ^ end})
786
+ %q{^ begin (mlhs)
787
+ | ^ end (mlhs)
788
+ |~~~~~~~~~~ expression (mlhs)
789
+ |~~~~~~~~~~~~~~~~~ expression})
780
790
 
781
791
  assert_parses(
782
792
  s(:masgn,
@@ -962,7 +972,7 @@ class TestParser < MiniTest::Unit::TestCase
962
972
  s(:lvasgn, :foo,
963
973
  s(:array, s(:lvar, :bar), s(:int, 1))),
964
974
  %q{foo = bar, 1},
965
- %q{ ~~~~~~ array
975
+ %q{ ~~~~~~ expression (array)
966
976
  |~~~~~~~~~~~~ expression})
967
977
 
968
978
  assert_parses(
@@ -1367,6 +1377,14 @@ class TestParser < MiniTest::Unit::TestCase
1367
1377
  %q{~~~ keyword
1368
1378
  | ~~~ name
1369
1379
  | ~~~ end})
1380
+
1381
+ assert_parses(
1382
+ s(:def, :String, s(:args), s(:nil)),
1383
+ %q{def String; end})
1384
+
1385
+ assert_parses(
1386
+ s(:def, :String=, s(:args), s(:nil)),
1387
+ %q{def String=; end})
1370
1388
  end
1371
1389
 
1372
1390
  def test_defs
@@ -1389,6 +1407,16 @@ class TestParser < MiniTest::Unit::TestCase
1389
1407
  assert_parses(
1390
1408
  s(:defs, s(:lvar, :foo), :foo, s(:args), s(:nil)),
1391
1409
  %q{def (foo).foo; end})
1410
+
1411
+ assert_parses(
1412
+ s(:defs, s(:const, nil, :String), :foo,
1413
+ s(:args), s(:nil)),
1414
+ %q{def String.foo; end})
1415
+
1416
+ assert_parses(
1417
+ s(:defs, s(:const, nil, :String), :foo,
1418
+ s(:args), s(:nil)),
1419
+ %q{def String::foo; end})
1392
1420
  end
1393
1421
 
1394
1422
  def test_defs_invalid
@@ -1410,7 +1438,7 @@ class TestParser < MiniTest::Unit::TestCase
1410
1438
  assert_diagnoses(
1411
1439
  [:error, :singleton_literal],
1412
1440
  %q{def (:foo).foo; end},
1413
- %q{ ~ location})
1441
+ %q{ ~~~~ location})
1414
1442
 
1415
1443
  assert_diagnoses(
1416
1444
  [:error, :singleton_literal],
@@ -1442,8 +1470,8 @@ class TestParser < MiniTest::Unit::TestCase
1442
1470
  %q{undef foo, :bar, :"foo#{1}"},
1443
1471
  %q{~~~~~ keyword
1444
1472
  | ~~~ expression (sym/1)
1445
- | ~~~~ expression (sym/2)
1446
- |~~~~~~~~~~~~~~~~~~~~~~~~ expression})
1473
+ | ~~~~ expression (sym/2)
1474
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
1447
1475
  end
1448
1476
 
1449
1477
  #
@@ -2700,7 +2728,8 @@ class TestParser < MiniTest::Unit::TestCase
2700
2728
  assert_parses(
2701
2729
  s(:send, s(:lvar, :foo), :a=, s(:int, 1)),
2702
2730
  %q{foo.a = 1},
2703
- %q{ ~~~ selector
2731
+ %q{ ~ selector
2732
+ | ^ operator
2704
2733
  |~~~~~~~~~ expression})
2705
2734
 
2706
2735
  assert_parses(
@@ -2722,8 +2751,6 @@ class TestParser < MiniTest::Unit::TestCase
2722
2751
  s(:int, 1), s(:int, 2)),
2723
2752
  %q{foo[1, 2]},
2724
2753
  %q{ ~~~~~~ selector
2725
- | ^ begin
2726
- | ^ end
2727
2754
  |~~~~~~~~~ expression})
2728
2755
  end
2729
2756
 
@@ -2739,9 +2766,8 @@ class TestParser < MiniTest::Unit::TestCase
2739
2766
  s(:send, s(:lvar, :foo), :[]=,
2740
2767
  s(:int, 1), s(:int, 2), s(:int, 3)),
2741
2768
  %q{foo[1, 2] = 3},
2742
- %q{ ~~~~~~~~ selector
2743
- | ^ begin
2744
- | ^ end
2769
+ %q{ ~~~~~~ selector
2770
+ | ^ operator
2745
2771
  |~~~~~~~~~~~~~ expression})
2746
2772
  end
2747
2773
 
@@ -2779,7 +2805,7 @@ class TestParser < MiniTest::Unit::TestCase
2779
2805
  | ^ end (args)
2780
2806
  | ^ begin
2781
2807
  | ^ end
2782
- |~~~~~ expression},
2808
+ |~~~~~~~~~ expression},
2783
2809
  ALL_VERSIONS - %w(1.8))
2784
2810
 
2785
2811
  assert_parses(
@@ -3034,32 +3060,32 @@ class TestParser < MiniTest::Unit::TestCase
3034
3060
  def test_space_args_cmd
3035
3061
  assert_parses(
3036
3062
  s(:send, nil, :fun,
3037
- s(:send, nil, :f, s(:lvar, :bar))),
3063
+ s(:begin, s(:send, nil, :f, s(:lvar, :bar)))),
3038
3064
  %q{fun (f bar)})
3039
3065
  end
3040
3066
 
3041
3067
  def test_space_args_arg
3042
3068
  assert_parses(
3043
- s(:send, nil, :fun, s(:int, 1)),
3069
+ s(:send, nil, :fun, s(:begin, s(:int, 1))),
3044
3070
  %q{fun (1)})
3045
3071
  end
3046
3072
 
3047
3073
  def test_space_args_arg_block
3048
3074
  assert_parses(
3049
3075
  s(:block,
3050
- s(:send, nil, :fun, s(:int, 1)),
3076
+ s(:send, nil, :fun, s(:begin, s(:int, 1))),
3051
3077
  s(:args), s(:nil)),
3052
3078
  %q{fun (1) {}})
3053
3079
 
3054
3080
  assert_parses(
3055
3081
  s(:block,
3056
- s(:send, s(:lvar, :foo), :fun, s(:int, 1)),
3082
+ s(:send, s(:lvar, :foo), :fun, s(:begin, s(:int, 1))),
3057
3083
  s(:args), s(:nil)),
3058
3084
  %q{foo.fun (1) {}})
3059
3085
 
3060
3086
  assert_parses(
3061
3087
  s(:block,
3062
- s(:send, s(:lvar, :foo), :fun, s(:int, 1)),
3088
+ s(:send, s(:lvar, :foo), :fun, s(:begin, s(:int, 1))),
3063
3089
  s(:args), s(:nil)),
3064
3090
  %q{foo::fun (1) {}})
3065
3091
  end
@@ -3067,7 +3093,7 @@ class TestParser < MiniTest::Unit::TestCase
3067
3093
  def test_space_args_arg_call
3068
3094
  assert_parses(
3069
3095
  s(:send, nil, :fun,
3070
- s(:send, s(:int, 1), :to_i)),
3096
+ s(:send, s(:begin, s(:int, 1)), :to_i)),
3071
3097
  %q{fun (1).to_i})
3072
3098
  end
3073
3099
 
@@ -3461,8 +3487,8 @@ class TestParser < MiniTest::Unit::TestCase
3461
3487
  %q{~~ keyword
3462
3488
  | ~~~~~ else
3463
3489
  | ~~~~~ keyword (if)
3490
+ | ~~~~ else (if)
3464
3491
  | ~~~ end
3465
- | ~~~ end (if)
3466
3492
  |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3467
3493
  end
3468
3494
 
@@ -3479,21 +3505,28 @@ class TestParser < MiniTest::Unit::TestCase
3479
3505
  assert_diagnoses(
3480
3506
  [:error, :masgn_as_condition],
3481
3507
  %q{if (a, b = foo); end},
3482
- %q{ ~~~~~~~~~~~~ location})
3508
+ %q{ ~~~~~~~~~~ location})
3483
3509
  end
3484
3510
 
3485
3511
  def test_if_mod_masgn
3486
3512
  assert_diagnoses(
3487
3513
  [:error, :masgn_as_condition],
3488
3514
  %q{1 if (a, b = foo)},
3489
- %q{ ~~~~~~~~~~~~ location})
3515
+ %q{ ~~~~~~~~~~ location})
3490
3516
  end
3491
3517
 
3492
3518
  def test_tern_masgn
3493
3519
  assert_diagnoses(
3494
3520
  [:error, :masgn_as_condition],
3495
3521
  %q{(a, b = foo) ? 1 : 2},
3496
- %q{~~~~~~~~~~~~ location})
3522
+ %q{ ~~~~~~~~~~ location})
3523
+ end
3524
+
3525
+ def test_cond_begin_masgn
3526
+ assert_diagnoses(
3527
+ [:error, :masgn_as_condition],
3528
+ %q{if (bar; a, b = foo); end},
3529
+ %q{ ~~~~~~~~~~ location})
3497
3530
  end
3498
3531
 
3499
3532
  # Case matching
@@ -3672,14 +3705,14 @@ class TestParser < MiniTest::Unit::TestCase
3672
3705
  assert_diagnoses(
3673
3706
  [:error, :masgn_as_condition],
3674
3707
  %q{while (a, b = foo); end},
3675
- %q{ ~~~~~~~~~~~~ location})
3708
+ %q{ ~~~~~~~~~~ location})
3676
3709
  end
3677
3710
 
3678
3711
  def test_while_mod_masgn
3679
3712
  assert_diagnoses(
3680
3713
  [:error, :masgn_as_condition],
3681
3714
  %q{foo while (a, b = foo)},
3682
- %q{ ~~~~~~~~~~~~ location})
3715
+ %q{ ~~~~~~~~~~ location})
3683
3716
  end
3684
3717
 
3685
3718
  def test_for
@@ -3719,16 +3752,14 @@ class TestParser < MiniTest::Unit::TestCase
3719
3752
 
3720
3753
  def test_break
3721
3754
  assert_parses(
3722
- s(:break, s(:lvar, :foo)),
3755
+ s(:break, s(:begin, s(:lvar, :foo))),
3723
3756
  %q{break(foo)},
3724
3757
  %q{~~~~~ keyword
3725
- | ^ begin
3726
- | ^ end
3727
3758
  |~~~~~~~~~~ expression},
3728
3759
  ALL_VERSIONS - %w(1.8))
3729
3760
 
3730
3761
  assert_parses(
3731
- s(:break, s(:lvar, :foo)),
3762
+ s(:break, s(:begin, s(:lvar, :foo))),
3732
3763
  %q{break(foo)},
3733
3764
  %q{~~~~~ keyword
3734
3765
  |~~~~~~~~~~ expression},
@@ -3756,16 +3787,14 @@ class TestParser < MiniTest::Unit::TestCase
3756
3787
 
3757
3788
  def test_return
3758
3789
  assert_parses(
3759
- s(:return, s(:lvar, :foo)),
3790
+ s(:return, s(:begin, s(:lvar, :foo))),
3760
3791
  %q{return(foo)},
3761
3792
  %q{~~~~~~ keyword
3762
- | ^ begin
3763
- | ^ end
3764
3793
  |~~~~~~~~~~~ expression},
3765
3794
  ALL_VERSIONS - %w(1.8))
3766
3795
 
3767
3796
  assert_parses(
3768
- s(:return, s(:lvar, :foo)),
3797
+ s(:return, s(:begin, s(:lvar, :foo))),
3769
3798
  %q{return(foo)},
3770
3799
  %q{~~~~~~ keyword
3771
3800
  |~~~~~~~~~~~ expression},
@@ -3793,16 +3822,14 @@ class TestParser < MiniTest::Unit::TestCase
3793
3822
 
3794
3823
  def test_next
3795
3824
  assert_parses(
3796
- s(:next, s(:lvar, :foo)),
3825
+ s(:next, s(:begin, s(:lvar, :foo))),
3797
3826
  %q{next(foo)},
3798
3827
  %q{~~~~ keyword
3799
- | ^ begin
3800
- | ^ end
3801
3828
  |~~~~~~~~~ expression},
3802
3829
  ALL_VERSIONS - %w(1.8))
3803
3830
 
3804
3831
  assert_parses(
3805
- s(:next, s(:lvar, :foo)),
3832
+ s(:next, s(:begin, s(:lvar, :foo))),
3806
3833
  %q{next(foo)},
3807
3834
  %q{~~~~ keyword
3808
3835
  |~~~~~~~~~ expression},
@@ -3840,25 +3867,28 @@ class TestParser < MiniTest::Unit::TestCase
3840
3867
 
3841
3868
  def test_rescue
3842
3869
  assert_parses(
3843
- s(:rescue, s(:send, nil, :meth),
3844
- s(:resbody, nil, nil, s(:lvar, :foo)),
3845
- nil),
3870
+ s(:begin,
3871
+ s(:rescue, s(:send, nil, :meth),
3872
+ s(:resbody, nil, nil, s(:lvar, :foo)),
3873
+ nil)),
3846
3874
  %q{begin; meth; rescue; foo; end},
3847
3875
  %q{~~~~~ begin
3876
+ | ~~~~~~ keyword (rescue.resbody)
3877
+ | ~~~~~~~~~~~ expression (rescue.resbody)
3878
+ | ~~~~~~~~~~~~~~~~~ expression (rescue)
3848
3879
  | ~~~ end
3849
3880
  |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3850
3881
  end
3851
3882
 
3852
3883
  def test_rescue_else
3853
3884
  assert_parses(
3854
- s(:rescue, s(:send, nil, :meth),
3855
- s(:resbody, nil, nil, s(:lvar, :foo)),
3856
- s(:lvar, :bar)),
3885
+ s(:begin,
3886
+ s(:rescue, s(:send, nil, :meth),
3887
+ s(:resbody, nil, nil, s(:lvar, :foo)),
3888
+ s(:lvar, :bar))),
3857
3889
  %q{begin; meth; rescue; foo; else; bar; end},
3858
- %q{~~~~~ begin
3859
- | ~~~~ else
3860
- | ~~~ end
3861
- |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3890
+ %q{ ~~~~ else (rescue)
3891
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (rescue)})
3862
3892
  end
3863
3893
 
3864
3894
  def test_rescue_else_useless
@@ -3870,52 +3900,61 @@ class TestParser < MiniTest::Unit::TestCase
3870
3900
 
3871
3901
  def test_ensure
3872
3902
  assert_parses(
3873
- s(:ensure, s(:send, nil, :meth),
3874
- s(:lvar, :bar)),
3903
+ s(:begin,
3904
+ s(:ensure, s(:send, nil, :meth),
3905
+ s(:lvar, :bar))),
3875
3906
  %q{begin; meth; ensure; bar; end},
3876
3907
  %q{~~~~~ begin
3877
- | ~~~~~~ keyword
3908
+ | ~~~~~~ keyword (ensure)
3909
+ | ~~~~~~~~~~~~~~~~~ expression (ensure)
3878
3910
  | ~~~ end
3879
3911
  |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3880
3912
  end
3881
3913
 
3914
+ def test_ensure_empty
3915
+ assert_parses(
3916
+ s(:begin,
3917
+ s(:ensure, s(:nil),
3918
+ s(:nil))),
3919
+ %q{begin ensure end},
3920
+ %q{~~~~~ begin
3921
+ | ~~~~~~ keyword (ensure)
3922
+ | ~~~~~~ expression (ensure)
3923
+ | ~~~ end
3924
+ |~~~~~~~~~~~~~~~~ expression})
3925
+ end
3926
+
3882
3927
  def test_rescue_ensure
3883
3928
  assert_parses(
3884
- s(:ensure,
3885
- s(:rescue,
3886
- s(:send, nil, :meth),
3887
- s(:resbody, nil, nil, s(:lvar, :baz)),
3888
- nil),
3889
- s(:lvar, :bar)),
3929
+ s(:begin,
3930
+ s(:ensure,
3931
+ s(:rescue,
3932
+ s(:send, nil, :meth),
3933
+ s(:resbody, nil, nil, s(:lvar, :baz)),
3934
+ nil),
3935
+ s(:lvar, :bar))),
3890
3936
  %q{begin; meth; rescue; baz; ensure; bar; end},
3891
- %q{~~~~~ begin
3892
- |~~~~~ begin (rescue)
3893
- | ~~~~~~ keyword
3894
- | ~~~~~~ keyword (rescue)
3895
- | ~~~ end
3896
- | ~~~ end (rescue)
3897
- |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
3898
- |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (rescue)})
3937
+ %q{ ~~~~~~ keyword (ensure)
3938
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (ensure)
3939
+ | ~~~~~~ keyword (ensure.rescue.resbody)
3940
+ | ~~~~~~~~~~~~~~~~~ expression (ensure.rescue)})
3899
3941
  end
3900
3942
 
3901
3943
  def test_rescue_else_ensure
3902
3944
  assert_parses(
3903
- s(:ensure,
3904
- s(:rescue,
3905
- s(:send, nil, :meth),
3906
- s(:resbody, nil, nil, s(:lvar, :baz)),
3907
- s(:lvar, :foo)),
3908
- s(:lvar, :bar)),
3945
+ s(:begin,
3946
+ s(:ensure,
3947
+ s(:rescue,
3948
+ s(:send, nil, :meth),
3949
+ s(:resbody, nil, nil, s(:lvar, :baz)),
3950
+ s(:lvar, :foo)),
3951
+ s(:lvar, :bar))),
3909
3952
  %q{begin; meth; rescue; baz; else foo; ensure; bar end},
3910
- %q{~~~~~ begin
3911
- |~~~~~ begin (rescue)
3912
- | ~~~~~~ keyword
3913
- | ~~~~~~ keyword (rescue)
3914
- | ~~~~ else (rescue)
3915
- | ~~~ end
3916
- | ~~~ end (rescue)
3917
- |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
3918
- |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (rescue)})
3953
+ %q{ ~~~~~~ keyword (ensure)
3954
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (ensure)
3955
+ | ~~~~~~ keyword (ensure.rescue.resbody)
3956
+ | ~~~~ else (ensure.rescue)
3957
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (ensure.rescue)})
3919
3958
  end
3920
3959
 
3921
3960
  def test_rescue_mod
@@ -3926,6 +3965,7 @@ class TestParser < MiniTest::Unit::TestCase
3926
3965
  nil),
3927
3966
  %q{meth rescue bar},
3928
3967
  %q{ ~~~~~~ keyword (resbody)
3968
+ | ~~~~~~~~~~ expression (resbody)
3929
3969
  |~~~~~~~~~~~~~~~ expression})
3930
3970
  end
3931
3971
 
@@ -3938,6 +3978,7 @@ class TestParser < MiniTest::Unit::TestCase
3938
3978
  nil)),
3939
3979
  %q{foo = meth rescue bar},
3940
3980
  %q{ ~~~~~~ keyword (rescue.resbody)
3981
+ | ~~~~~~~~~~ expression (rescue.resbody)
3941
3982
  | ~~~~~~~~~~~~~~~ expression (rescue)
3942
3983
  |~~~~~~~~~~~~~~~~~~~~~ expression})
3943
3984
  end
@@ -3952,6 +3993,7 @@ class TestParser < MiniTest::Unit::TestCase
3952
3993
  nil)),
3953
3994
  %q{foo += meth rescue bar},
3954
3995
  %q{ ~~~~~~ keyword (rescue.resbody)
3996
+ | ~~~~~~~~~~ expression (rescue.resbody)
3955
3997
  | ~~~~~~~~~~~~~~~ expression (rescue)
3956
3998
  |~~~~~~~~~~~~~~~~~~~~~~ expression},
3957
3999
  ALL_VERSIONS - %w(1.8))
@@ -3959,55 +4001,60 @@ class TestParser < MiniTest::Unit::TestCase
3959
4001
 
3960
4002
  def test_resbody_list
3961
4003
  assert_parses(
3962
- s(:rescue,
3963
- s(:send, nil, :meth),
3964
- s(:resbody,
3965
- s(:array, s(:const, nil, :Exception)),
3966
- nil,
3967
- s(:lvar, :bar)),
3968
- nil),
4004
+ s(:begin,
4005
+ s(:rescue,
4006
+ s(:send, nil, :meth),
4007
+ s(:resbody,
4008
+ s(:array, s(:const, nil, :Exception)),
4009
+ nil,
4010
+ s(:lvar, :bar)),
4011
+ nil)),
3969
4012
  %q{begin; meth; rescue Exception; bar; end})
3970
4013
  end
3971
4014
 
3972
4015
  def test_resbody_list_mrhs
3973
4016
  assert_parses(
3974
- s(:rescue,
3975
- s(:send, nil, :meth),
3976
- s(:resbody,
3977
- s(:array,
3978
- s(:const, nil, :Exception),
3979
- s(:lvar, :foo)),
3980
- nil,
3981
- s(:lvar, :bar)),
3982
- nil),
4017
+ s(:begin,
4018
+ s(:rescue,
4019
+ s(:send, nil, :meth),
4020
+ s(:resbody,
4021
+ s(:array,
4022
+ s(:const, nil, :Exception),
4023
+ s(:lvar, :foo)),
4024
+ nil,
4025
+ s(:lvar, :bar)),
4026
+ nil)),
3983
4027
  %q{begin; meth; rescue Exception, foo; bar; end})
3984
4028
  end
3985
4029
 
3986
4030
  def test_resbody_var
3987
4031
  assert_parses(
3988
- s(:rescue,
3989
- s(:send, nil, :meth),
3990
- s(:resbody, nil, s(:lvasgn, :ex), s(:lvar, :bar)),
3991
- nil),
4032
+ s(:begin,
4033
+ s(:rescue,
4034
+ s(:send, nil, :meth),
4035
+ s(:resbody, nil, s(:lvasgn, :ex), s(:lvar, :bar)),
4036
+ nil)),
3992
4037
  %q{begin; meth; rescue => ex; bar; end})
3993
4038
 
3994
4039
  assert_parses(
3995
- s(:rescue,
3996
- s(:send, nil, :meth),
3997
- s(:resbody, nil, s(:ivasgn, :@ex), s(:lvar, :bar)),
3998
- nil),
4040
+ s(:begin,
4041
+ s(:rescue,
4042
+ s(:send, nil, :meth),
4043
+ s(:resbody, nil, s(:ivasgn, :@ex), s(:lvar, :bar)),
4044
+ nil)),
3999
4045
  %q{begin; meth; rescue => @ex; bar; end})
4000
4046
  end
4001
4047
 
4002
4048
  def test_resbody_list_var
4003
4049
  assert_parses(
4004
- s(:rescue,
4005
- s(:send, nil, :meth),
4006
- s(:resbody,
4007
- s(:array, s(:lvar, :foo)),
4008
- s(:lvasgn, :ex),
4009
- s(:lvar, :bar)),
4010
- nil),
4050
+ s(:begin,
4051
+ s(:rescue,
4052
+ s(:send, nil, :meth),
4053
+ s(:resbody,
4054
+ s(:array, s(:lvar, :foo)),
4055
+ s(:lvasgn, :ex),
4056
+ s(:lvar, :bar)),
4057
+ nil)),
4011
4058
  %q{begin; meth; rescue foo => ex; bar; end})
4012
4059
  end
4013
4060
 
@@ -4025,9 +4072,9 @@ class TestParser < MiniTest::Unit::TestCase
4025
4072
  assert_parses(
4026
4073
  s(:preexe, s(:int, 1)),
4027
4074
  %q{BEGIN { 1 }},
4028
- %q{~~~~~ keyword
4029
- | ^ begin
4030
- | ^ end})
4075
+ %q{ ^ begin
4076
+ | ^ end
4077
+ |~~~~~~~~~~~ expression})
4031
4078
  end
4032
4079
 
4033
4080
  def test_preexe_invalid
@@ -4043,9 +4090,9 @@ class TestParser < MiniTest::Unit::TestCase
4043
4090
  assert_parses(
4044
4091
  s(:postexe, s(:int, 1)),
4045
4092
  %q{END { 1 }},
4046
- %q{~~~ keyword
4047
- | ^ begin
4048
- | ^ end})
4093
+ %q{ ^ begin
4094
+ | ^ end
4095
+ |~~~~~~~~~ expression})
4049
4096
 
4050
4097
  assert_diagnoses(
4051
4098
  [:warning, :end_in_method],
@@ -4060,10 +4107,11 @@ class TestParser < MiniTest::Unit::TestCase
4060
4107
  def test_begin_cmdarg
4061
4108
  assert_parses(
4062
4109
  s(:send, nil, :p,
4063
- s(:block,
4064
- s(:send, s(:int, 1), :times),
4065
- s(:args),
4066
- s(:int, 1))),
4110
+ s(:begin,
4111
+ s(:block,
4112
+ s(:send, s(:int, 1), :times),
4113
+ s(:args),
4114
+ s(:int, 1)))),
4067
4115
  %q{p begin 1.times do 1 end end},
4068
4116
  %{},
4069
4117
  ALL_VERSIONS - %w(1.8 1.9))