ripper_ruby_parser 1.5.1 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +43 -1
- data/README.md +27 -27
- data/lib/ripper_ruby_parser/commenting_ripper_parser.rb +1 -0
- data/lib/ripper_ruby_parser/sexp_handlers/assignment.rb +15 -10
- data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +4 -32
- data/lib/ripper_ruby_parser/sexp_handlers/conditionals.rb +5 -1
- data/lib/ripper_ruby_parser/sexp_handlers/helper_methods.rb +8 -0
- data/lib/ripper_ruby_parser/sexp_handlers/literals.rb +40 -36
- data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +1 -2
- data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +33 -23
- data/lib/ripper_ruby_parser/sexp_handlers/operators.rb +2 -2
- data/lib/ripper_ruby_parser/sexp_processor.rb +10 -23
- data/lib/ripper_ruby_parser/unescape.rb +1 -2
- data/lib/ripper_ruby_parser/version.rb +1 -1
- data/test/end_to_end/comments_test.rb +1 -1
- data/test/end_to_end/lib_comparison_test.rb +1 -1
- data/test/end_to_end/line_numbering_test.rb +1 -1
- data/test/end_to_end/test_comparison_test.rb +1 -1
- data/test/ripper_ruby_parser/parser_test.rb +12 -2
- data/test/ripper_ruby_parser/sexp_handlers/assignment_test.rb +150 -75
- data/test/ripper_ruby_parser/sexp_handlers/conditionals_test.rb +35 -0
- data/test/ripper_ruby_parser/sexp_handlers/literals_test.rb +133 -146
- data/test/ripper_ruby_parser/sexp_handlers/methods_test.rb +23 -2
- data/test/samples/assignment.rb +17 -0
- data/test/samples/misc.rb +77 -0
- data/test/samples/strings.rb +30 -0
- data/test/test_helper.rb +1 -1
- metadata +6 -4
@@ -10,7 +10,7 @@ module RipperRubyParser
|
|
10
10
|
ident, pos = extract_node_symbol_with_position ident
|
11
11
|
|
12
12
|
in_method do
|
13
|
-
params =
|
13
|
+
params = convert_arguments(process(params))
|
14
14
|
kwrest = kwrest_param(params)
|
15
15
|
body = with_kwrest(kwrest) { method_body(body) }
|
16
16
|
end
|
@@ -24,7 +24,7 @@ module RipperRubyParser
|
|
24
24
|
ident, = extract_node_symbol_with_position ident
|
25
25
|
|
26
26
|
in_method do
|
27
|
-
params =
|
27
|
+
params = convert_arguments(process(params))
|
28
28
|
kwrest = kwrest_param(params)
|
29
29
|
body = with_kwrest(kwrest) { method_body(body) }
|
30
30
|
end
|
@@ -87,11 +87,7 @@ module RipperRubyParser
|
|
87
87
|
when 0
|
88
88
|
[s(:nil)]
|
89
89
|
else
|
90
|
-
|
91
|
-
block.sexp_body
|
92
|
-
else
|
93
|
-
[block]
|
94
|
-
end
|
90
|
+
unwrap_block block
|
95
91
|
end
|
96
92
|
end
|
97
93
|
|
@@ -101,7 +97,7 @@ module RipperRubyParser
|
|
101
97
|
blockarg: '&'
|
102
98
|
}.freeze
|
103
99
|
|
104
|
-
def
|
100
|
+
def convert_arguments(args)
|
105
101
|
args.map! do |item|
|
106
102
|
if item.is_a? Symbol
|
107
103
|
item
|
@@ -110,9 +106,9 @@ module RipperRubyParser
|
|
110
106
|
when :lvar
|
111
107
|
item.last
|
112
108
|
when *SPECIAL_ARG_MARKER.keys
|
113
|
-
|
114
|
-
|
115
|
-
|
109
|
+
convert_marked_argument(item)
|
110
|
+
when :masgn
|
111
|
+
convert_masgn_argument(item)
|
116
112
|
else
|
117
113
|
item
|
118
114
|
end
|
@@ -120,6 +116,31 @@ module RipperRubyParser
|
|
120
116
|
end
|
121
117
|
end
|
122
118
|
|
119
|
+
def convert_marked_argument(item)
|
120
|
+
marker = SPECIAL_ARG_MARKER[item.sexp_type]
|
121
|
+
name = extract_node_symbol item.last
|
122
|
+
:"#{marker}#{name}"
|
123
|
+
end
|
124
|
+
|
125
|
+
def convert_masgn_argument(item)
|
126
|
+
args = item[1]
|
127
|
+
args.shift
|
128
|
+
s(:masgn, *convert_destructuring_arguments(args))
|
129
|
+
end
|
130
|
+
|
131
|
+
def convert_destructuring_arguments(args)
|
132
|
+
args.map! do |item|
|
133
|
+
case item.sexp_type
|
134
|
+
when :splat
|
135
|
+
convert_marked_argument(item)
|
136
|
+
when :masgn
|
137
|
+
convert_masgn_argument(item)
|
138
|
+
when :lasgn
|
139
|
+
item[1]
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
123
144
|
def kwrest_param(params)
|
124
145
|
found = params.find { |param| param.to_s =~ /^\*\*(.+)/ }
|
125
146
|
Regexp.last_match[1].to_sym if found
|
@@ -132,20 +153,9 @@ module RipperRubyParser
|
|
132
153
|
result
|
133
154
|
end
|
134
155
|
|
135
|
-
def
|
136
|
-
@block_kwrest.push kwrest
|
137
|
-
result = yield
|
138
|
-
@block_kwrest.pop
|
139
|
-
result
|
140
|
-
end
|
141
|
-
|
142
|
-
def method_kwrest_arg?(method)
|
156
|
+
def kwrest_arg?(method)
|
143
157
|
@kwrest.include?(method)
|
144
158
|
end
|
145
|
-
|
146
|
-
def block_kwrest_arg?(method)
|
147
|
-
@block_kwrest.include?(method)
|
148
|
-
end
|
149
159
|
end
|
150
160
|
end
|
151
161
|
end
|
@@ -49,7 +49,7 @@ module RipperRubyParser
|
|
49
49
|
left = process(left)
|
50
50
|
right = process(right)
|
51
51
|
if integer_literal?(left) && integer_literal?(right)
|
52
|
-
s(:lit, Range.new(left[1], right[1]))
|
52
|
+
with_line_number(left.line, s(:lit, Range.new(left[1], right[1])))
|
53
53
|
else
|
54
54
|
s(:dot2, left, right)
|
55
55
|
end
|
@@ -60,7 +60,7 @@ module RipperRubyParser
|
|
60
60
|
left = process(left)
|
61
61
|
right = process(right)
|
62
62
|
if integer_literal?(left) && integer_literal?(right)
|
63
|
-
s(:lit, Range.new(left[1], right[1], true))
|
63
|
+
with_line_number(left.line, s(:lit, Range.new(left[1], right[1], true)))
|
64
64
|
else
|
65
65
|
s(:dot3, left, right)
|
66
66
|
end
|
@@ -31,6 +31,8 @@ module RipperRubyParser
|
|
31
31
|
@processors[:@kw] = :process_at_kw
|
32
32
|
@processors[:@op] = :process_at_op
|
33
33
|
@processors[:@backref] = :process_at_backref
|
34
|
+
|
35
|
+
@processors[:@backtick] = :process_at_backtick
|
34
36
|
@processors[:@period] = :process_at_period
|
35
37
|
|
36
38
|
@processors[:@tstring_content] = :process_at_tstring_content
|
@@ -83,12 +85,7 @@ module RipperRubyParser
|
|
83
85
|
statements.first
|
84
86
|
else
|
85
87
|
first = statements.shift
|
86
|
-
|
87
|
-
first.shift
|
88
|
-
s(:block, *first, *statements)
|
89
|
-
else
|
90
|
-
s(:block, first, *statements)
|
91
|
-
end
|
88
|
+
s(:block, *unwrap_block(first), *statements)
|
92
89
|
end
|
93
90
|
end
|
94
91
|
|
@@ -150,7 +147,7 @@ module RipperRubyParser
|
|
150
147
|
def process_BEGIN(exp)
|
151
148
|
_, body = exp.shift 2
|
152
149
|
body = reject_void_stmt map_process_list body.sexp_body
|
153
|
-
s(:iter, s(:preexe),
|
150
|
+
s(:iter, s(:preexe), 0, *body)
|
154
151
|
end
|
155
152
|
|
156
153
|
def process_END(exp)
|
@@ -200,19 +197,17 @@ module RipperRubyParser
|
|
200
197
|
end
|
201
198
|
|
202
199
|
def process_at_ident(exp)
|
203
|
-
|
204
|
-
if replace_kwrest_arg_lvar? ident
|
205
|
-
s(:call, nil, ident)
|
206
|
-
else
|
207
|
-
s(:lvar, ident)
|
208
|
-
end
|
209
|
-
end
|
200
|
+
make_identifier(:lvar, exp)
|
210
201
|
end
|
211
202
|
|
212
203
|
def process_at_op(exp)
|
213
204
|
make_identifier(:op, exp)
|
214
205
|
end
|
215
206
|
|
207
|
+
def process_at_backtick(exp)
|
208
|
+
make_identifier(:backtick, exp)
|
209
|
+
end
|
210
|
+
|
216
211
|
def process_at_kw(exp)
|
217
212
|
sym, pos = extract_node_symbol_with_position(exp)
|
218
213
|
result = case sym
|
@@ -259,11 +254,7 @@ module RipperRubyParser
|
|
259
254
|
|
260
255
|
return body if body.empty?
|
261
256
|
|
262
|
-
|
263
|
-
body.sexp_body
|
264
|
-
else
|
265
|
-
[body]
|
266
|
-
end
|
257
|
+
unwrap_block body
|
267
258
|
end
|
268
259
|
|
269
260
|
def make_identifier(type, exp)
|
@@ -276,9 +267,5 @@ module RipperRubyParser
|
|
276
267
|
_, val, pos = exp.shift 3
|
277
268
|
with_position(pos, s(:lit, yield(val)))
|
278
269
|
end
|
279
|
-
|
280
|
-
def replace_kwrest_arg_lvar?(ident)
|
281
|
-
extra_compatible && @block_kwrest.include?(ident)
|
282
|
-
end
|
283
270
|
end
|
284
271
|
end
|
@@ -106,8 +106,7 @@ module RipperRubyParser
|
|
106
106
|
when /^u\{/
|
107
107
|
hex_to_unicode_char(bare[2..-2])
|
108
108
|
when /^u/
|
109
|
-
hex_to_unicode_char(bare[1..4]) +
|
110
|
-
(extra_compatible ? '' : bare[5..-1])
|
109
|
+
hex_to_unicode_char(bare[1..4]) + bare[5..-1]
|
111
110
|
when /^(c|C-).$/
|
112
111
|
control(bare[-1].ord).chr
|
113
112
|
when /^M-.$/
|
@@ -148,12 +148,12 @@ describe RipperRubyParser::Parser do
|
|
148
148
|
describe 'for the BEGIN keyword' do
|
149
149
|
it 'converts to a :preexe iterator' do
|
150
150
|
'BEGIN { foo }'.
|
151
|
-
must_be_parsed_as s(:iter, s(:preexe),
|
151
|
+
must_be_parsed_as s(:iter, s(:preexe), 0, s(:call, nil, :foo))
|
152
152
|
end
|
153
153
|
|
154
154
|
it 'works with an empty block' do
|
155
155
|
'BEGIN { }'.
|
156
|
-
must_be_parsed_as s(:iter, s(:preexe),
|
156
|
+
must_be_parsed_as s(:iter, s(:preexe), 0)
|
157
157
|
end
|
158
158
|
end
|
159
159
|
|
@@ -376,6 +376,16 @@ describe RipperRubyParser::Parser do
|
|
376
376
|
result.line.must_equal 1
|
377
377
|
end
|
378
378
|
|
379
|
+
it 'works for a range literal' do
|
380
|
+
result = parser.parse '0..4'
|
381
|
+
result.line.must_equal 1
|
382
|
+
end
|
383
|
+
|
384
|
+
it 'works for an exclusive range literal' do
|
385
|
+
result = parser.parse '0...4'
|
386
|
+
result.line.must_equal 1
|
387
|
+
end
|
388
|
+
|
379
389
|
it 'works for a regular expression back reference' do
|
380
390
|
result = parser.parse '$1'
|
381
391
|
result.line.must_equal 1
|
@@ -210,6 +210,35 @@ describe RipperRubyParser::Parser do
|
|
210
210
|
'foo = Bar.baz qux rescue quuz'.
|
211
211
|
must_be_parsed_as expected
|
212
212
|
end
|
213
|
+
|
214
|
+
it 'works with a method call with argument without brackets' do
|
215
|
+
expected = if RUBY_VERSION < '2.4.0'
|
216
|
+
s(:rescue,
|
217
|
+
s(:lasgn, :foo, s(:call, nil, :bar, s(:call, nil, :baz))),
|
218
|
+
s(:resbody, s(:array), s(:call, nil, :qux)))
|
219
|
+
else
|
220
|
+
s(:lasgn, :foo,
|
221
|
+
s(:rescue,
|
222
|
+
s(:call, nil, :bar, s(:call, nil, :baz)),
|
223
|
+
s(:resbody, s(:array), s(:call, nil, :qux))))
|
224
|
+
end
|
225
|
+
'foo = bar baz rescue qux'.must_be_parsed_as expected
|
226
|
+
end
|
227
|
+
|
228
|
+
it 'works with a class method call with argument without brackets' do
|
229
|
+
expected = if RUBY_VERSION < '2.4.0'
|
230
|
+
s(:rescue,
|
231
|
+
s(:lasgn, :foo, s(:call, s(:const, :Bar), :baz, s(:call, nil, :qux))),
|
232
|
+
s(:resbody, s(:array), s(:call, nil, :quuz)))
|
233
|
+
else
|
234
|
+
s(:lasgn, :foo,
|
235
|
+
s(:rescue,
|
236
|
+
s(:call, s(:const, :Bar), :baz, s(:call, nil, :qux)),
|
237
|
+
s(:resbody, s(:array), s(:call, nil, :quuz))))
|
238
|
+
end
|
239
|
+
'foo = Bar.baz qux rescue quuz'.
|
240
|
+
must_be_parsed_as expected
|
241
|
+
end
|
213
242
|
end
|
214
243
|
|
215
244
|
it 'sets the correct line numbers' do
|
@@ -244,6 +273,13 @@ describe RipperRubyParser::Parser do
|
|
244
273
|
s(:to_ary, s(:call, nil, :baz)))
|
245
274
|
end
|
246
275
|
|
276
|
+
it 'works with blocks' do
|
277
|
+
'foo, bar = begin; baz; end'.
|
278
|
+
must_be_parsed_as s(:masgn,
|
279
|
+
s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
|
280
|
+
s(:to_ary, s(:call, nil, :baz)))
|
281
|
+
end
|
282
|
+
|
247
283
|
it 'works with a rescue modifier' do
|
248
284
|
'foo, bar = baz rescue qux'.
|
249
285
|
must_be_parsed_as s(:rescue,
|
@@ -314,6 +350,17 @@ describe RipperRubyParser::Parser do
|
|
314
350
|
s(:call, nil, :quuz)))))
|
315
351
|
end
|
316
352
|
|
353
|
+
it 'works with destructuring with multiple levels' do
|
354
|
+
'((foo, bar)) = baz'.
|
355
|
+
must_be_parsed_as s(:masgn,
|
356
|
+
s(:array,
|
357
|
+
s(:masgn,
|
358
|
+
s(:array,
|
359
|
+
s(:lasgn, :foo),
|
360
|
+
s(:lasgn, :bar)))),
|
361
|
+
s(:to_ary, s(:call, nil, :baz)))
|
362
|
+
end
|
363
|
+
|
317
364
|
it 'works with instance variables' do
|
318
365
|
'@foo, @bar = baz'.
|
319
366
|
must_be_parsed_as s(:masgn,
|
@@ -455,7 +502,45 @@ describe RipperRubyParser::Parser do
|
|
455
502
|
s(:call, nil, :bar)))
|
456
503
|
end
|
457
504
|
|
458
|
-
it 'works
|
505
|
+
it 'works with boolean operators' do
|
506
|
+
'foo &&= bar'.
|
507
|
+
must_be_parsed_as s(:op_asgn_and,
|
508
|
+
s(:lvar, :foo), s(:lasgn, :foo, s(:call, nil, :bar)))
|
509
|
+
end
|
510
|
+
|
511
|
+
it 'works with boolean operators and blocks' do
|
512
|
+
'foo &&= begin; bar; end'.
|
513
|
+
must_be_parsed_as s(:op_asgn_and,
|
514
|
+
s(:lvar, :foo), s(:lasgn, :foo, s(:call, nil, :bar)))
|
515
|
+
end
|
516
|
+
|
517
|
+
it 'works with arithmetic operators and blocks' do
|
518
|
+
'foo += begin; bar; end'.
|
519
|
+
must_be_parsed_as s(:lasgn, :foo,
|
520
|
+
s(:call, s(:lvar, :foo), :+, s(:call, nil, :bar)))
|
521
|
+
end
|
522
|
+
end
|
523
|
+
|
524
|
+
describe 'for operator assignment to an attribute' do
|
525
|
+
it 'works with +=' do
|
526
|
+
'foo.bar += baz'.
|
527
|
+
must_be_parsed_as s(:op_asgn2,
|
528
|
+
s(:call, nil, :foo),
|
529
|
+
:bar=, :+,
|
530
|
+
s(:call, nil, :baz))
|
531
|
+
end
|
532
|
+
|
533
|
+
it 'works with ||=' do
|
534
|
+
'foo.bar ||= baz'.
|
535
|
+
must_be_parsed_as s(:op_asgn2,
|
536
|
+
s(:call, nil, :foo),
|
537
|
+
:bar=, :'||',
|
538
|
+
s(:call, nil, :baz))
|
539
|
+
end
|
540
|
+
end
|
541
|
+
|
542
|
+
describe 'for operator assignment to a collection element' do
|
543
|
+
it 'works with +=' do
|
459
544
|
'foo[bar] += baz'.
|
460
545
|
must_be_parsed_as s(:op_asgn1,
|
461
546
|
s(:call, nil, :foo),
|
@@ -464,7 +549,7 @@ describe RipperRubyParser::Parser do
|
|
464
549
|
s(:call, nil, :baz))
|
465
550
|
end
|
466
551
|
|
467
|
-
it 'works with ||=
|
552
|
+
it 'works with ||=' do
|
468
553
|
'foo[bar] ||= baz'.
|
469
554
|
must_be_parsed_as s(:op_asgn1,
|
470
555
|
s(:call, nil, :foo),
|
@@ -473,100 +558,90 @@ describe RipperRubyParser::Parser do
|
|
473
558
|
s(:call, nil, :baz))
|
474
559
|
end
|
475
560
|
|
476
|
-
it '
|
477
|
-
'foo
|
478
|
-
must_be_parsed_as s(:
|
561
|
+
it 'handles multiple indices' do
|
562
|
+
'foo[bar, baz] += qux'.
|
563
|
+
must_be_parsed_as s(:op_asgn1,
|
479
564
|
s(:call, nil, :foo),
|
480
|
-
:
|
481
|
-
|
565
|
+
s(:arglist,
|
566
|
+
s(:call, nil, :bar),
|
567
|
+
s(:call, nil, :baz)),
|
568
|
+
:+,
|
569
|
+
s(:call, nil, :qux))
|
482
570
|
end
|
483
571
|
|
484
|
-
it 'works with
|
485
|
-
'foo
|
486
|
-
must_be_parsed_as s(:
|
572
|
+
it 'works with a function call without parentheses' do
|
573
|
+
'foo[bar] += baz qux'.
|
574
|
+
must_be_parsed_as s(:op_asgn1,
|
487
575
|
s(:call, nil, :foo),
|
488
|
-
:
|
489
|
-
|
576
|
+
s(:arglist, s(:call, nil, :bar)),
|
577
|
+
:+,
|
578
|
+
s(:call, nil, :baz, s(:call, nil, :qux)))
|
490
579
|
end
|
491
580
|
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
s(:call, nil, :baz)),
|
500
|
-
:+,
|
501
|
-
s(:call, nil, :qux))
|
502
|
-
end
|
503
|
-
|
504
|
-
it 'works with boolean operators' do
|
505
|
-
'foo &&= bar'.
|
506
|
-
must_be_parsed_as s(:op_asgn_and,
|
507
|
-
s(:lvar, :foo), s(:lasgn, :foo, s(:call, nil, :bar)))
|
508
|
-
end
|
509
|
-
|
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)))
|
514
|
-
end
|
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)))
|
520
|
-
end
|
581
|
+
it 'works with a function call with parentheses' do
|
582
|
+
'foo[bar] += baz(qux)'.
|
583
|
+
must_be_parsed_as s(:op_asgn1,
|
584
|
+
s(:call, nil, :foo),
|
585
|
+
s(:arglist, s(:call, nil, :bar)),
|
586
|
+
:+,
|
587
|
+
s(:call, nil, :baz, s(:call, nil, :qux)))
|
521
588
|
end
|
522
|
-
end
|
523
589
|
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
590
|
+
it 'works with a method call without parentheses' do
|
591
|
+
'foo[bar] += baz.qux quuz'.
|
592
|
+
must_be_parsed_as s(:op_asgn1,
|
593
|
+
s(:call, nil, :foo),
|
594
|
+
s(:arglist, s(:call, nil, :bar)),
|
595
|
+
:+,
|
596
|
+
s(:call, s(:call, nil, :baz), :qux, s(:call, nil, :quuz)))
|
529
597
|
end
|
530
598
|
|
531
|
-
it 'works with a
|
532
|
-
'foo
|
533
|
-
must_be_parsed_as s(:
|
534
|
-
|
599
|
+
it 'works with a method call with parentheses' do
|
600
|
+
'foo[bar] += baz.qux(quuz)'.
|
601
|
+
must_be_parsed_as s(:op_asgn1,
|
602
|
+
s(:call, nil, :foo),
|
603
|
+
s(:arglist, s(:call, nil, :bar)),
|
604
|
+
:+,
|
605
|
+
s(:call, s(:call, nil, :baz), :qux, s(:call, nil, :quuz)))
|
535
606
|
end
|
536
607
|
|
537
|
-
it 'works with a
|
538
|
-
'foo
|
539
|
-
must_be_parsed_as s(:
|
540
|
-
s(:
|
541
|
-
|
542
|
-
|
608
|
+
it 'works with a function call without parentheses in extra compatible mode' do
|
609
|
+
'foo[bar] += baz qux'.
|
610
|
+
must_be_parsed_as s(:op_asgn1,
|
611
|
+
s(:call, nil, :foo),
|
612
|
+
s(:array, s(:call, nil, :bar)),
|
613
|
+
:+,
|
614
|
+
s(:call, nil, :baz, s(:call, nil, :qux))),
|
543
615
|
extra_compatible: true
|
544
616
|
end
|
545
617
|
|
546
|
-
it 'works with a
|
547
|
-
'foo
|
548
|
-
must_be_parsed_as s(:
|
549
|
-
s(:
|
550
|
-
|
551
|
-
|
618
|
+
it 'works with a function call with parentheses in extra compatible mode' do
|
619
|
+
'foo[bar] += baz(qux)'.
|
620
|
+
must_be_parsed_as s(:op_asgn1,
|
621
|
+
s(:call, nil, :foo),
|
622
|
+
s(:arglist, s(:call, nil, :bar)),
|
623
|
+
:+,
|
624
|
+
s(:call, nil, :baz, s(:call, nil, :qux))),
|
552
625
|
extra_compatible: true
|
553
626
|
end
|
554
627
|
|
555
|
-
it 'works with a method call
|
556
|
-
'foo
|
557
|
-
must_be_parsed_as s(:
|
558
|
-
s(:
|
559
|
-
s(:
|
628
|
+
it 'works with a method call without parentheses in extra compatible mode' do
|
629
|
+
'foo[bar] += baz.qux quuz'.
|
630
|
+
must_be_parsed_as s(:op_asgn1,
|
631
|
+
s(:call, nil, :foo),
|
632
|
+
s(:array, s(:call, nil, :bar)),
|
633
|
+
:+,
|
634
|
+
s(:call, s(:call, nil, :baz), :qux, s(:call, nil, :quuz))),
|
560
635
|
extra_compatible: true
|
561
636
|
end
|
562
637
|
|
563
|
-
it 'works with a
|
564
|
-
'foo
|
565
|
-
must_be_parsed_as s(:
|
566
|
-
s(:
|
567
|
-
|
568
|
-
|
569
|
-
s(:
|
638
|
+
it 'works with a method call with parentheses in extra compatible mode' do
|
639
|
+
'foo[bar] += baz.qux(quuz)'.
|
640
|
+
must_be_parsed_as s(:op_asgn1,
|
641
|
+
s(:call, nil, :foo),
|
642
|
+
s(:arglist, s(:call, nil, :bar)),
|
643
|
+
:+,
|
644
|
+
s(:call, s(:call, nil, :baz), :qux, s(:call, nil, :quuz))),
|
570
645
|
extra_compatible: true
|
571
646
|
end
|
572
647
|
end
|