parser 1.1.0 → 1.2.0

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