ripper_ruby_parser 1.4.2 → 1.5.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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -1
  3. data/README.md +41 -9
  4. data/Rakefile +2 -0
  5. data/lib/ripper_ruby_parser.rb +2 -0
  6. data/lib/ripper_ruby_parser/commenting_ripper_parser.rb +23 -45
  7. data/lib/ripper_ruby_parser/parser.rb +11 -1
  8. data/lib/ripper_ruby_parser/sexp_handlers.rb +2 -6
  9. data/lib/ripper_ruby_parser/sexp_handlers/assignment.rb +49 -35
  10. data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +78 -39
  11. data/lib/ripper_ruby_parser/sexp_handlers/conditionals.rb +16 -15
  12. data/lib/ripper_ruby_parser/sexp_handlers/helper_methods.rb +19 -15
  13. data/lib/ripper_ruby_parser/sexp_handlers/literals.rb +138 -30
  14. data/lib/ripper_ruby_parser/sexp_handlers/loops.rb +10 -6
  15. data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +59 -14
  16. data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +56 -32
  17. data/lib/ripper_ruby_parser/sexp_handlers/operators.rb +20 -27
  18. data/lib/ripper_ruby_parser/sexp_processor.rb +40 -10
  19. data/lib/ripper_ruby_parser/syntax_error.rb +2 -0
  20. data/lib/ripper_ruby_parser/unescape.rb +32 -11
  21. data/lib/ripper_ruby_parser/version.rb +3 -1
  22. data/test/end_to_end/comments_test.rb +2 -0
  23. data/test/end_to_end/comparison_test.rb +2 -0
  24. data/test/end_to_end/lib_comparison_test.rb +2 -0
  25. data/test/end_to_end/line_numbering_test.rb +2 -0
  26. data/test/end_to_end/samples_comparison_test.rb +5 -29
  27. data/test/end_to_end/test_comparison_test.rb +2 -0
  28. data/test/pt_testcase/pt_test.rb +2 -0
  29. data/test/ripper_ruby_parser/commenting_ripper_parser_test.rb +16 -2
  30. data/test/ripper_ruby_parser/parser_test.rb +17 -688
  31. data/test/ripper_ruby_parser/sexp_handlers/assignment_test.rb +459 -26
  32. data/test/ripper_ruby_parser/sexp_handlers/blocks_test.rb +152 -82
  33. data/test/ripper_ruby_parser/sexp_handlers/conditionals_test.rb +91 -0
  34. data/test/ripper_ruby_parser/sexp_handlers/literals_test.rb +331 -24
  35. data/test/ripper_ruby_parser/sexp_handlers/loops_test.rb +88 -0
  36. data/test/ripper_ruby_parser/sexp_handlers/method_calls_test.rb +58 -5
  37. data/test/ripper_ruby_parser/sexp_handlers/methods_test.rb +392 -0
  38. data/test/ripper_ruby_parser/sexp_handlers/operators_test.rb +174 -12
  39. data/test/ripper_ruby_parser/sexp_processor_test.rb +8 -18
  40. data/test/ripper_ruby_parser/version_test.rb +2 -0
  41. data/test/samples/comments.rb +13 -0
  42. data/test/samples/conditionals.rb +23 -0
  43. data/test/samples/loops.rb +36 -0
  44. data/test/samples/misc.rb +157 -5
  45. data/test/samples/number.rb +7 -0
  46. data/test/samples/strings.rb +39 -0
  47. data/test/test_helper.rb +22 -1
  48. metadata +18 -12
  49. data/lib/ripper_ruby_parser/sexp_handlers/arguments.rb +0 -29
  50. data/lib/ripper_ruby_parser/sexp_handlers/arrays.rb +0 -21
  51. data/lib/ripper_ruby_parser/sexp_handlers/hashes.rb +0 -48
@@ -1,6 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
2
4
 
3
5
  describe RipperRubyParser::Parser do
6
+ let(:parser) { RipperRubyParser::Parser.new }
7
+
4
8
  describe '#parse' do
5
9
  describe 'for single assignment' do
6
10
  it 'works when assigning to a namespaced constant' do
@@ -17,8 +21,13 @@ describe RipperRubyParser::Parser do
17
21
  s(:call, nil, :bar))
18
22
  end
19
23
 
24
+ it 'works with blocks' do
25
+ 'foo = begin; bar; end'.
26
+ must_be_parsed_as s(:lasgn, :foo, s(:call, nil, :bar))
27
+ end
28
+
20
29
  describe 'with a right-hand splat' do
21
- specify do
30
+ it 'works in the simple case' do
22
31
  'foo = *bar'.
23
32
  must_be_parsed_as s(:lasgn, :foo,
24
33
  s(:svalue,
@@ -26,19 +35,15 @@ describe RipperRubyParser::Parser do
26
35
  s(:call, nil, :bar))))
27
36
  end
28
37
 
29
- specify do
30
- 'foo = bar, *baz'.
38
+ it 'works with blocks' do
39
+ 'foo = *begin; bar; end'.
31
40
  must_be_parsed_as s(:lasgn, :foo,
32
- s(:svalue,
33
- s(:array,
34
- s(:call, nil, :bar),
35
- s(:splat,
36
- s(:call, nil, :baz)))))
41
+ s(:svalue, s(:splat, s(:call, nil, :bar))))
37
42
  end
38
43
  end
39
44
 
40
45
  describe 'with several items on the right hand side' do
41
- specify do
46
+ it 'works in the simple case' do
42
47
  'foo = bar, baz'.
43
48
  must_be_parsed_as s(:lasgn, :foo,
44
49
  s(:svalue,
@@ -46,6 +51,16 @@ describe RipperRubyParser::Parser do
46
51
  s(:call, nil, :bar),
47
52
  s(:call, nil, :baz))))
48
53
  end
54
+
55
+ it 'works with a splat' do
56
+ 'foo = bar, *baz'.
57
+ must_be_parsed_as s(:lasgn, :foo,
58
+ s(:svalue,
59
+ s(:array,
60
+ s(:call, nil, :bar),
61
+ s(:splat,
62
+ s(:call, nil, :baz)))))
63
+ end
49
64
  end
50
65
 
51
66
  describe 'with an array literal on the right hand side' do
@@ -57,6 +72,150 @@ describe RipperRubyParser::Parser do
57
72
  s(:call, nil, :baz)))
58
73
  end
59
74
  end
75
+
76
+ it 'works when assigning to an instance variable' do
77
+ '@foo = bar'.
78
+ must_be_parsed_as s(:iasgn,
79
+ :@foo,
80
+ s(:call, nil, :bar))
81
+ end
82
+
83
+ it 'works when assigning to a constant' do
84
+ 'FOO = bar'.
85
+ must_be_parsed_as s(:cdecl,
86
+ :FOO,
87
+ s(:call, nil, :bar))
88
+ end
89
+
90
+ it 'works when assigning to a collection element' do
91
+ 'foo[bar] = baz'.
92
+ must_be_parsed_as s(:attrasgn,
93
+ s(:call, nil, :foo),
94
+ :[]=,
95
+ s(:call, nil, :bar),
96
+ s(:call, nil, :baz))
97
+ end
98
+
99
+ it 'works when assigning to an attribute' do
100
+ 'foo.bar = baz'.
101
+ must_be_parsed_as s(:attrasgn,
102
+ s(:call, nil, :foo),
103
+ :bar=,
104
+ s(:call, nil, :baz))
105
+ end
106
+
107
+ describe 'when assigning to a class variable' do
108
+ it 'works outside a method' do
109
+ '@@foo = bar'.
110
+ must_be_parsed_as s(:cvdecl,
111
+ :@@foo,
112
+ s(:call, nil, :bar))
113
+ end
114
+
115
+ it 'works inside a method' do
116
+ 'def foo; @@bar = baz; end'.
117
+ must_be_parsed_as s(:defn,
118
+ :foo, s(:args),
119
+ s(:cvasgn, :@@bar, s(:call, nil, :baz)))
120
+ end
121
+
122
+ it 'works inside a method with a receiver' do
123
+ 'def self.foo; @@bar = baz; end'.
124
+ must_be_parsed_as s(:defs,
125
+ s(:self),
126
+ :foo, s(:args),
127
+ s(:cvasgn, :@@bar, s(:call, nil, :baz)))
128
+ end
129
+
130
+ it 'works inside method arguments' do
131
+ 'def foo(bar = (@@baz = qux)); end'.
132
+ must_be_parsed_as s(:defn,
133
+ :foo,
134
+ s(:args,
135
+ s(:lasgn, :bar,
136
+ s(:cvasgn, :@@baz, s(:call, nil, :qux)))),
137
+ s(:nil))
138
+ end
139
+
140
+ it 'works inside method arguments of a singleton method' do
141
+ 'def self.foo(bar = (@@baz = qux)); end'.
142
+ must_be_parsed_as s(:defs,
143
+ s(:self),
144
+ :foo,
145
+ s(:args,
146
+ s(:lasgn, :bar,
147
+ s(:cvasgn, :@@baz, s(:call, nil, :qux)))),
148
+ s(:nil))
149
+ end
150
+
151
+ it 'works inside the receiver in a method definition' do
152
+ 'def (bar = (@@baz = qux)).foo; end'.
153
+ must_be_parsed_as s(:defs,
154
+ s(:lasgn, :bar,
155
+ s(:cvdecl, :@@baz,
156
+ s(:call, nil, :qux))), :foo,
157
+ s(:args), s(:nil))
158
+ end
159
+ end
160
+
161
+ it 'works when assigning to a global variable' do
162
+ '$foo = bar'.
163
+ must_be_parsed_as s(:gasgn,
164
+ :$foo,
165
+ s(:call, nil, :bar))
166
+ end
167
+
168
+ describe 'with a rescue modifier' do
169
+ it 'works with assigning a bare method call' do
170
+ 'foo = bar rescue baz'.
171
+ must_be_parsed_as s(:lasgn, :foo,
172
+ s(:rescue,
173
+ s(:call, nil, :bar),
174
+ s(:resbody, s(:array), s(:call, nil, :baz))))
175
+ end
176
+
177
+ it 'works with a method call with argument' do
178
+ 'foo = bar(baz) rescue qux'.
179
+ must_be_parsed_as s(:lasgn, :foo,
180
+ s(:rescue,
181
+ s(:call, nil, :bar, s(:call, nil, :baz)),
182
+ s(:resbody, s(:array), s(:call, nil, :qux))))
183
+ end
184
+
185
+ it 'works with a method call with argument without brackets' do
186
+ expected = if RUBY_VERSION < '2.4.0'
187
+ s(:rescue,
188
+ s(:lasgn, :foo, s(:call, nil, :bar, s(:call, nil, :baz))),
189
+ s(:resbody, s(:array), s(:call, nil, :qux)))
190
+ else
191
+ s(:lasgn, :foo,
192
+ s(:rescue,
193
+ s(:call, nil, :bar, s(:call, nil, :baz)),
194
+ s(:resbody, s(:array), s(:call, nil, :qux))))
195
+ end
196
+ 'foo = bar baz rescue qux'.must_be_parsed_as expected
197
+ end
198
+
199
+ it 'works with a class method call with argument without brackets' do
200
+ expected = if RUBY_VERSION < '2.4.0'
201
+ s(:rescue,
202
+ s(:lasgn, :foo, s(:call, s(:const, :Bar), :baz, s(:call, nil, :qux))),
203
+ s(:resbody, s(:array), s(:call, nil, :quuz)))
204
+ else
205
+ s(:lasgn, :foo,
206
+ s(:rescue,
207
+ s(:call, s(:const, :Bar), :baz, s(:call, nil, :qux)),
208
+ s(:resbody, s(:array), s(:call, nil, :quuz))))
209
+ end
210
+ 'foo = Bar.baz qux rescue quuz'.
211
+ must_be_parsed_as expected
212
+ end
213
+ end
214
+
215
+ it 'sets the correct line numbers' do
216
+ result = parser.parse 'foo = {}'
217
+ result.line.must_equal 1
218
+ end
60
219
  end
61
220
 
62
221
  describe 'for multiple assignment' do
@@ -84,6 +243,155 @@ describe RipperRubyParser::Parser do
84
243
  s(:lasgn, :bar)),
85
244
  s(:to_ary, s(:call, nil, :baz)))
86
245
  end
246
+
247
+ it 'works with a rescue modifier' do
248
+ 'foo, bar = baz rescue qux'.
249
+ must_be_parsed_as s(:rescue,
250
+ s(:masgn,
251
+ s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
252
+ s(:to_ary, s(:call, nil, :baz))),
253
+ s(:resbody, s(:array), s(:call, nil, :qux)))
254
+ end
255
+
256
+ it 'works the same number of items on each side' do
257
+ 'foo, bar = baz, qux'.
258
+ must_be_parsed_as s(:masgn,
259
+ s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
260
+ s(:array,
261
+ s(:call, nil, :baz),
262
+ s(:call, nil, :qux)))
263
+ end
264
+
265
+ it 'works with a single item on the right-hand side' do
266
+ 'foo, bar = baz'.
267
+ must_be_parsed_as s(:masgn,
268
+ s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
269
+ s(:to_ary, s(:call, nil, :baz)))
270
+ end
271
+
272
+ it 'works with left-hand splat' do
273
+ 'foo, *bar = baz, qux'.
274
+ must_be_parsed_as s(:masgn,
275
+ s(:array, s(:lasgn, :foo), s(:splat, s(:lasgn, :bar))),
276
+ s(:array,
277
+ s(:call, nil, :baz),
278
+ s(:call, nil, :qux)))
279
+ end
280
+
281
+ it 'works with parentheses around the left-hand side' do
282
+ '(foo, bar) = baz'.
283
+ must_be_parsed_as s(:masgn,
284
+ s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
285
+ s(:to_ary, s(:call, nil, :baz)))
286
+ end
287
+
288
+ it 'works with complex destructuring' do
289
+ 'foo, (bar, baz) = qux'.
290
+ must_be_parsed_as s(:masgn,
291
+ s(:array,
292
+ s(:lasgn, :foo),
293
+ s(:masgn,
294
+ s(:array,
295
+ s(:lasgn, :bar),
296
+ s(:lasgn, :baz)))),
297
+ s(:to_ary, s(:call, nil, :qux)))
298
+ end
299
+
300
+ it 'works with complex destructuring of the value' do
301
+ 'foo, (bar, baz) = [qux, [quz, quuz]]'.
302
+ must_be_parsed_as s(:masgn,
303
+ s(:array,
304
+ s(:lasgn, :foo),
305
+ s(:masgn,
306
+ s(:array,
307
+ s(:lasgn, :bar),
308
+ s(:lasgn, :baz)))),
309
+ s(:to_ary,
310
+ s(:array,
311
+ s(:call, nil, :qux),
312
+ s(:array,
313
+ s(:call, nil, :quz),
314
+ s(:call, nil, :quuz)))))
315
+ end
316
+
317
+ it 'works with instance variables' do
318
+ '@foo, @bar = baz'.
319
+ must_be_parsed_as s(:masgn,
320
+ s(:array, s(:iasgn, :@foo), s(:iasgn, :@bar)),
321
+ s(:to_ary, s(:call, nil, :baz)))
322
+ end
323
+
324
+ it 'works with class variables' do
325
+ '@@foo, @@bar = baz'.
326
+ must_be_parsed_as s(:masgn,
327
+ s(:array, s(:cvdecl, :@@foo), s(:cvdecl, :@@bar)),
328
+ s(:to_ary, s(:call, nil, :baz)))
329
+ end
330
+
331
+ it 'works with attributes' do
332
+ 'foo.bar, foo.baz = qux'.
333
+ must_be_parsed_as s(:masgn,
334
+ s(:array,
335
+ s(:attrasgn, s(:call, nil, :foo), :bar=),
336
+ s(:attrasgn, s(:call, nil, :foo), :baz=)),
337
+ s(:to_ary, s(:call, nil, :qux)))
338
+ end
339
+
340
+ it 'works with collection elements' do
341
+ 'foo[1], bar[2] = baz'.
342
+ must_be_parsed_as s(:masgn,
343
+ s(:array,
344
+ s(:attrasgn,
345
+ s(:call, nil, :foo), :[]=, s(:lit, 1)),
346
+ s(:attrasgn,
347
+ s(:call, nil, :bar), :[]=, s(:lit, 2))),
348
+ s(:to_ary, s(:call, nil, :baz)))
349
+ end
350
+
351
+ it 'works with constants' do
352
+ 'Foo, Bar = baz'.
353
+ must_be_parsed_as s(:masgn,
354
+ s(:array, s(:cdecl, :Foo), s(:cdecl, :Bar)),
355
+ s(:to_ary, s(:call, nil, :baz)))
356
+ end
357
+
358
+ it 'works with instance variables and splat' do
359
+ '@foo, *@bar = baz'.
360
+ must_be_parsed_as s(:masgn,
361
+ s(:array,
362
+ s(:iasgn, :@foo),
363
+ s(:splat, s(:iasgn, :@bar))),
364
+ s(:to_ary, s(:call, nil, :baz)))
365
+ end
366
+
367
+ it 'works with a right-hand single splat' do
368
+ 'foo, bar = *baz'.
369
+ must_be_parsed_as s(:masgn,
370
+ s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
371
+ s(:splat, s(:call, nil, :baz)))
372
+ end
373
+
374
+ it 'works with a splat in a list of values on the right hand' do
375
+ 'foo, bar = baz, *qux'.
376
+ must_be_parsed_as s(:masgn,
377
+ s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
378
+ s(:array,
379
+ s(:call, nil, :baz),
380
+ s(:splat, s(:call, nil, :qux))))
381
+ end
382
+
383
+ it 'works with a right-hand single splat with begin..end block' do
384
+ 'foo, bar = *begin; baz; end'.
385
+ must_be_parsed_as s(:masgn,
386
+ s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
387
+ s(:splat,
388
+ s(:call, nil, :baz)))
389
+ end
390
+
391
+ it 'sets the correct line numbers' do
392
+ result = parser.parse 'foo, bar = {}, {}'
393
+ result.line.must_equal 1
394
+ end
87
395
  end
88
396
 
89
397
  describe 'for assignment to a collection element' do
@@ -99,6 +407,88 @@ describe RipperRubyParser::Parser do
99
407
  end
100
408
 
101
409
  describe 'for operator assignment' do
410
+ it 'works with +=' do
411
+ 'foo += bar'.
412
+ must_be_parsed_as s(:lasgn, :foo,
413
+ s(:call, s(:lvar, :foo),
414
+ :+,
415
+ s(:call, nil, :bar)))
416
+ end
417
+
418
+ it 'works with -=' do
419
+ 'foo -= bar'.
420
+ must_be_parsed_as s(:lasgn, :foo,
421
+ s(:call, s(:lvar, :foo),
422
+ :-,
423
+ s(:call, nil, :bar)))
424
+ end
425
+
426
+ it 'works with *=' do
427
+ 'foo *= bar'.
428
+ must_be_parsed_as s(:lasgn, :foo,
429
+ s(:call, s(:lvar, :foo),
430
+ :*,
431
+ s(:call, nil, :bar)))
432
+ end
433
+
434
+ it 'works with /=' do
435
+ 'foo /= bar'.
436
+ must_be_parsed_as s(:lasgn, :foo,
437
+ s(:call,
438
+ s(:lvar, :foo), :/,
439
+ s(:call, nil, :bar)))
440
+ end
441
+
442
+ it 'works with ||=' do
443
+ 'foo ||= bar'.
444
+ must_be_parsed_as s(:op_asgn_or,
445
+ s(:lvar, :foo),
446
+ s(:lasgn, :foo,
447
+ s(:call, nil, :bar)))
448
+ end
449
+
450
+ it 'works when assigning to an instance variable' do
451
+ '@foo += bar'.
452
+ must_be_parsed_as s(:iasgn, :@foo,
453
+ s(:call,
454
+ s(:ivar, :@foo), :+,
455
+ s(:call, nil, :bar)))
456
+ end
457
+
458
+ it 'works when assigning to a collection element' do
459
+ 'foo[bar] += baz'.
460
+ must_be_parsed_as s(:op_asgn1,
461
+ s(:call, nil, :foo),
462
+ s(:arglist, s(:call, nil, :bar)),
463
+ :+,
464
+ s(:call, nil, :baz))
465
+ end
466
+
467
+ it 'works with ||= when assigning to a collection element' do
468
+ 'foo[bar] ||= baz'.
469
+ must_be_parsed_as s(:op_asgn1,
470
+ s(:call, nil, :foo),
471
+ s(:arglist, s(:call, nil, :bar)),
472
+ :"||",
473
+ s(:call, nil, :baz))
474
+ end
475
+
476
+ it 'works when assigning to an attribute' do
477
+ 'foo.bar += baz'.
478
+ must_be_parsed_as s(:op_asgn2,
479
+ s(:call, nil, :foo),
480
+ :bar=, :+,
481
+ s(:call, nil, :baz))
482
+ end
483
+
484
+ it 'works with ||= when assigning to an attribute' do
485
+ 'foo.bar ||= baz'.
486
+ must_be_parsed_as s(:op_asgn2,
487
+ s(:call, nil, :foo),
488
+ :bar=, :'||',
489
+ s(:call, nil, :baz))
490
+ end
491
+
102
492
  describe 'assigning to a collection element' do
103
493
  it 'handles multiple indices' do
104
494
  'foo[bar, baz] += qux'.
@@ -111,31 +501,74 @@ describe RipperRubyParser::Parser do
111
501
  s(:call, nil, :qux))
112
502
  end
113
503
 
114
- it 'works with &&=' do
504
+ it 'works with boolean operators' do
115
505
  'foo &&= bar'.
116
506
  must_be_parsed_as s(:op_asgn_and,
117
507
  s(:lvar, :foo), s(:lasgn, :foo, s(:call, nil, :bar)))
118
508
  end
119
- end
120
- end
121
509
 
122
- describe 'for multiple assignment' do
123
- describe 'with a right-hand splat' do
124
- specify do
125
- 'foo, bar = *baz'.
126
- must_be_parsed_as s(:masgn,
127
- s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
128
- s(:splat, s(:call, nil, :baz)))
510
+ it 'works with boolean operators and blocks' do
511
+ 'foo &&= begin; bar; end'.
512
+ must_be_parsed_as s(:op_asgn_and,
513
+ s(:lvar, :foo), s(:lasgn, :foo, s(:call, nil, :bar)))
129
514
  end
130
- specify do
131
- 'foo, bar = baz, *qux'.
132
- must_be_parsed_as s(:masgn,
133
- s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
134
- s(:array,
135
- s(:call, nil, :baz),
136
- s(:splat, s(:call, nil, :qux))))
515
+
516
+ it 'works with arithmetic operators and blocks' do
517
+ 'foo += begin; bar; end'.
518
+ must_be_parsed_as s(:lasgn, :foo,
519
+ s(:call, s(:lvar, :foo), :+, s(:call, nil, :bar)))
137
520
  end
138
521
  end
139
522
  end
523
+
524
+ describe 'when extra compatibility is turned on' do
525
+ it 'works with a bare method call' do
526
+ 'foo = bar'.
527
+ must_be_parsed_as s(:lasgn, :foo, s(:call, nil, :bar)),
528
+ extra_compatible: true
529
+ end
530
+
531
+ it 'works with a literal' do
532
+ 'foo = 0'.
533
+ must_be_parsed_as s(:lasgn, :foo, s(:lit, 0)),
534
+ extra_compatible: true
535
+ end
536
+
537
+ it 'works with a bare method call with rescue modifier' do
538
+ 'foo = bar rescue baz'.
539
+ must_be_parsed_as s(:lasgn, :foo,
540
+ s(:rescue,
541
+ s(:call, nil, :bar),
542
+ s(:resbody, s(:array), s(:call, nil, :baz)))),
543
+ extra_compatible: true
544
+ end
545
+
546
+ it 'works with a method call with argument with bracket with rescue modifier' do
547
+ 'foo = bar(baz) rescue qux'.
548
+ must_be_parsed_as s(:lasgn, :foo,
549
+ s(:rescue,
550
+ s(:call, nil, :bar, s(:call, nil, :baz)),
551
+ s(:resbody, s(:array), s(:call, nil, :qux)))),
552
+ extra_compatible: true
553
+ end
554
+
555
+ it 'works with a method call with argument without bracket with rescue modifier' do
556
+ 'foo = bar baz rescue qux'.
557
+ must_be_parsed_as s(:rescue,
558
+ s(:lasgn, :foo, s(:call, nil, :bar, s(:call, nil, :baz))),
559
+ s(:resbody, s(:array), s(:call, nil, :qux))),
560
+ extra_compatible: true
561
+ end
562
+
563
+ it 'works with a class method call with argument without bracket with rescue modifier' do
564
+ 'foo = Bar.baz qux rescue quuz'.
565
+ must_be_parsed_as s(:rescue,
566
+ s(:lasgn,
567
+ :foo,
568
+ s(:call, s(:const, :Bar), :baz, s(:call, nil, :qux))),
569
+ s(:resbody, s(:array), s(:call, nil, :quuz))),
570
+ extra_compatible: true
571
+ end
572
+ end
140
573
  end
141
574
  end