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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +33 -1
- data/README.md +41 -9
- data/Rakefile +2 -0
- data/lib/ripper_ruby_parser.rb +2 -0
- data/lib/ripper_ruby_parser/commenting_ripper_parser.rb +23 -45
- data/lib/ripper_ruby_parser/parser.rb +11 -1
- data/lib/ripper_ruby_parser/sexp_handlers.rb +2 -6
- data/lib/ripper_ruby_parser/sexp_handlers/assignment.rb +49 -35
- data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +78 -39
- data/lib/ripper_ruby_parser/sexp_handlers/conditionals.rb +16 -15
- data/lib/ripper_ruby_parser/sexp_handlers/helper_methods.rb +19 -15
- data/lib/ripper_ruby_parser/sexp_handlers/literals.rb +138 -30
- data/lib/ripper_ruby_parser/sexp_handlers/loops.rb +10 -6
- data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +59 -14
- data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +56 -32
- data/lib/ripper_ruby_parser/sexp_handlers/operators.rb +20 -27
- data/lib/ripper_ruby_parser/sexp_processor.rb +40 -10
- data/lib/ripper_ruby_parser/syntax_error.rb +2 -0
- data/lib/ripper_ruby_parser/unescape.rb +32 -11
- data/lib/ripper_ruby_parser/version.rb +3 -1
- data/test/end_to_end/comments_test.rb +2 -0
- data/test/end_to_end/comparison_test.rb +2 -0
- data/test/end_to_end/lib_comparison_test.rb +2 -0
- data/test/end_to_end/line_numbering_test.rb +2 -0
- data/test/end_to_end/samples_comparison_test.rb +5 -29
- data/test/end_to_end/test_comparison_test.rb +2 -0
- data/test/pt_testcase/pt_test.rb +2 -0
- data/test/ripper_ruby_parser/commenting_ripper_parser_test.rb +16 -2
- data/test/ripper_ruby_parser/parser_test.rb +17 -688
- data/test/ripper_ruby_parser/sexp_handlers/assignment_test.rb +459 -26
- data/test/ripper_ruby_parser/sexp_handlers/blocks_test.rb +152 -82
- data/test/ripper_ruby_parser/sexp_handlers/conditionals_test.rb +91 -0
- data/test/ripper_ruby_parser/sexp_handlers/literals_test.rb +331 -24
- data/test/ripper_ruby_parser/sexp_handlers/loops_test.rb +88 -0
- data/test/ripper_ruby_parser/sexp_handlers/method_calls_test.rb +58 -5
- data/test/ripper_ruby_parser/sexp_handlers/methods_test.rb +392 -0
- data/test/ripper_ruby_parser/sexp_handlers/operators_test.rb +174 -12
- data/test/ripper_ruby_parser/sexp_processor_test.rb +8 -18
- data/test/ripper_ruby_parser/version_test.rb +2 -0
- data/test/samples/comments.rb +13 -0
- data/test/samples/conditionals.rb +23 -0
- data/test/samples/loops.rb +36 -0
- data/test/samples/misc.rb +157 -5
- data/test/samples/number.rb +7 -0
- data/test/samples/strings.rb +39 -0
- data/test/test_helper.rb +22 -1
- metadata +18 -12
- data/lib/ripper_ruby_parser/sexp_handlers/arguments.rb +0 -29
- data/lib/ripper_ruby_parser/sexp_handlers/arrays.rb +0 -21
- data/lib/ripper_ruby_parser/sexp_handlers/hashes.rb +0 -48
@@ -1,8 +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
|
4
6
|
describe '#parse' do
|
5
|
-
describe 'for blocks' do
|
7
|
+
describe 'for do blocks' do
|
6
8
|
it 'works with no statements in the block body' do
|
7
9
|
'foo do; end'.
|
8
10
|
must_be_parsed_as s(:iter,
|
@@ -17,6 +19,33 @@ describe RipperRubyParser::Parser do
|
|
17
19
|
0,
|
18
20
|
s(:redo))
|
19
21
|
end
|
22
|
+
|
23
|
+
it 'works with nested begin..end' do
|
24
|
+
'foo do; begin; bar; end; end;'.
|
25
|
+
must_be_parsed_as s(:iter,
|
26
|
+
s(:call, nil, :foo),
|
27
|
+
0,
|
28
|
+
s(:call, nil, :bar))
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'works with nested begin..end plus other statements' do
|
32
|
+
'foo do; bar; begin; baz; end; end;'.
|
33
|
+
must_be_parsed_as s(:iter,
|
34
|
+
s(:call, nil, :foo),
|
35
|
+
0,
|
36
|
+
s(:block,
|
37
|
+
s(:call, nil, :bar),
|
38
|
+
s(:call, nil, :baz)))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'for brace blocks' do
|
43
|
+
it 'works with no statements in the block body' do
|
44
|
+
'foo { }'.
|
45
|
+
must_be_parsed_as s(:iter,
|
46
|
+
s(:call, nil, :foo),
|
47
|
+
0)
|
48
|
+
end
|
20
49
|
end
|
21
50
|
|
22
51
|
describe 'for block parameters' do
|
@@ -94,112 +123,85 @@ describe RipperRubyParser::Parser do
|
|
94
123
|
s(:args, :bar, :baz))
|
95
124
|
end
|
96
125
|
|
97
|
-
it 'works with a
|
98
|
-
'foo do
|
126
|
+
it 'works with an argument with a default value' do
|
127
|
+
'foo do |bar=baz|; end'.
|
99
128
|
must_be_parsed_as s(:iter,
|
100
129
|
s(:call, nil, :foo),
|
101
|
-
s(:args,
|
130
|
+
s(:args,
|
131
|
+
s(:lasgn, :bar, s(:call, nil, :baz))))
|
102
132
|
end
|
103
133
|
|
104
|
-
it 'works with a
|
105
|
-
'foo do |bar
|
134
|
+
it 'works with a keyword argument with no default value' do
|
135
|
+
'foo do |bar:|; end'.
|
106
136
|
must_be_parsed_as s(:iter,
|
107
137
|
s(:call, nil, :foo),
|
108
|
-
s(:args,
|
109
|
-
|
110
|
-
end
|
111
|
-
|
112
|
-
describe 'for begin' do
|
113
|
-
it 'works for an empty begin..end block' do
|
114
|
-
'begin end'.must_be_parsed_as s(:nil)
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'works for a simple begin..end block' do
|
118
|
-
'begin; foo; end'.must_be_parsed_as s(:call, nil, :foo)
|
138
|
+
s(:args,
|
139
|
+
s(:kwarg, :bar)))
|
119
140
|
end
|
120
141
|
|
121
|
-
it 'works
|
122
|
-
'
|
123
|
-
must_be_parsed_as s(:
|
142
|
+
it 'works with a keyword argument with a default value' do
|
143
|
+
'foo do |bar: baz|; end'.
|
144
|
+
must_be_parsed_as s(:iter,
|
124
145
|
s(:call, nil, :foo),
|
125
|
-
s(:
|
126
|
-
|
127
|
-
|
128
|
-
it 'keeps :begin for the argument of a unary operator' do
|
129
|
-
'- begin; foo; end'.
|
130
|
-
must_be_parsed_as s(:call,
|
131
|
-
s(:begin, s(:call, nil, :foo)),
|
132
|
-
:-@)
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'keeps :begin for the first argument of a binary operator' do
|
136
|
-
'begin; bar; end + foo'.
|
137
|
-
must_be_parsed_as s(:call,
|
138
|
-
s(:begin, s(:call, nil, :bar)),
|
139
|
-
:+,
|
140
|
-
s(:call, nil, :foo))
|
146
|
+
s(:args,
|
147
|
+
s(:kwarg, :bar, s(:call, nil, :baz))))
|
141
148
|
end
|
142
149
|
|
143
|
-
it '
|
144
|
-
'foo
|
145
|
-
must_be_parsed_as s(:
|
150
|
+
it 'works with a single splat argument' do
|
151
|
+
'foo do |*bar|; end'.
|
152
|
+
must_be_parsed_as s(:iter,
|
146
153
|
s(:call, nil, :foo),
|
147
|
-
|
148
|
-
s(:begin, s(:call, nil, :bar)))
|
154
|
+
s(:args, :"*bar"))
|
149
155
|
end
|
150
156
|
|
151
|
-
it '
|
152
|
-
'
|
153
|
-
must_be_parsed_as s(:
|
154
|
-
s(:call, nil, :
|
155
|
-
s(:
|
157
|
+
it 'works with a combination of regular arguments and a splat argument' do
|
158
|
+
'foo do |bar, *baz|; end'.
|
159
|
+
must_be_parsed_as s(:iter,
|
160
|
+
s(:call, nil, :foo),
|
161
|
+
s(:args, :bar, :"*baz"))
|
156
162
|
end
|
157
163
|
|
158
|
-
it '
|
159
|
-
'foo
|
160
|
-
must_be_parsed_as s(:
|
164
|
+
it 'works with a kwrest argument' do
|
165
|
+
'foo do |**bar|; baz bar; end'.
|
166
|
+
must_be_parsed_as s(:iter,
|
161
167
|
s(:call, nil, :foo),
|
162
|
-
s(:
|
168
|
+
s(:args, :"**bar"),
|
169
|
+
s(:call, nil, :baz,
|
170
|
+
s(:lvar, :bar)))
|
163
171
|
end
|
164
172
|
|
165
|
-
it '
|
166
|
-
'
|
167
|
-
must_be_parsed_as s(:
|
168
|
-
s(:call, nil, :
|
169
|
-
|
170
|
-
s(:call, nil, :foo))
|
173
|
+
it 'works with a regular argument after a splat argument' do
|
174
|
+
'foo do |*bar, baz|; end'.
|
175
|
+
must_be_parsed_as s(:iter,
|
176
|
+
s(:call, nil, :foo),
|
177
|
+
s(:args, :"*bar", :baz))
|
171
178
|
end
|
172
179
|
|
173
|
-
it '
|
174
|
-
'foo
|
175
|
-
must_be_parsed_as s(:
|
180
|
+
it 'works with a combination of regular arguments and a kwrest argument' do
|
181
|
+
'foo do |bar, **baz|; qux bar, baz; end'.
|
182
|
+
must_be_parsed_as s(:iter,
|
176
183
|
s(:call, nil, :foo),
|
177
|
-
|
178
|
-
s(:call, nil, :
|
184
|
+
s(:args, :bar, :"**baz"),
|
185
|
+
s(:call, nil, :qux,
|
186
|
+
s(:lvar, :bar),
|
187
|
+
s(:lvar, :baz)))
|
179
188
|
end
|
189
|
+
end
|
180
190
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
s(:begin, s(:call, nil, :foo)),
|
185
|
-
s(:call, nil, :bar),
|
186
|
-
s(:call, nil, :baz))
|
191
|
+
describe 'for begin' do
|
192
|
+
it 'works for an empty begin..end block' do
|
193
|
+
'begin end'.must_be_parsed_as s(:nil)
|
187
194
|
end
|
188
195
|
|
189
|
-
it '
|
190
|
-
'
|
191
|
-
must_be_parsed_as s(:if,
|
192
|
-
s(:call, nil, :foo),
|
193
|
-
s(:begin, s(:call, nil, :bar)),
|
194
|
-
s(:call, nil, :baz))
|
196
|
+
it 'works for a simple begin..end block' do
|
197
|
+
'begin; foo; end'.must_be_parsed_as s(:call, nil, :foo)
|
195
198
|
end
|
196
199
|
|
197
|
-
it '
|
198
|
-
'foo
|
199
|
-
must_be_parsed_as s(:
|
200
|
+
it 'works for begin..end block with more than one statement' do
|
201
|
+
'begin; foo; bar; end'.
|
202
|
+
must_be_parsed_as s(:block,
|
200
203
|
s(:call, nil, :foo),
|
201
|
-
s(:call, nil, :bar)
|
202
|
-
s(:begin, s(:call, nil, :baz)))
|
204
|
+
s(:call, nil, :bar))
|
203
205
|
end
|
204
206
|
|
205
207
|
it 'keeps :begin for the truepart of a postfix if' do
|
@@ -336,12 +338,31 @@ describe RipperRubyParser::Parser do
|
|
336
338
|
s(:call, nil, :qux)))
|
337
339
|
end
|
338
340
|
|
339
|
-
it 'works
|
340
|
-
'foo rescue bar'.
|
341
|
+
it 'works rescuing a splatted list of exception types' do
|
342
|
+
'begin; foo; rescue *bar; baz; end'.
|
341
343
|
must_be_parsed_as s(:rescue,
|
342
344
|
s(:call, nil, :foo),
|
343
345
|
s(:resbody,
|
344
|
-
s(:
|
346
|
+
s(:splat, s(:call, nil, :bar)),
|
347
|
+
s(:call, nil, :baz)))
|
348
|
+
end
|
349
|
+
|
350
|
+
it 'works rescuing a complex list of exception types' do
|
351
|
+
'begin; foo; rescue *bar, Baz; qux; end'.
|
352
|
+
must_be_parsed_as s(:rescue,
|
353
|
+
s(:call, nil, :foo),
|
354
|
+
s(:resbody,
|
355
|
+
s(:array,
|
356
|
+
s(:splat, s(:call, nil, :bar)),
|
357
|
+
s(:const, :Baz)),
|
358
|
+
s(:call, nil, :qux)))
|
359
|
+
end
|
360
|
+
|
361
|
+
it 'works with a nested begin..end block' do
|
362
|
+
'begin; foo; rescue; begin; bar; end; end'.
|
363
|
+
must_be_parsed_as s(:rescue,
|
364
|
+
s(:call, nil, :foo),
|
365
|
+
s(:resbody, s(:array),
|
345
366
|
s(:call, nil, :bar)))
|
346
367
|
end
|
347
368
|
|
@@ -357,7 +378,7 @@ describe RipperRubyParser::Parser do
|
|
357
378
|
s(:call, nil, :baz))))
|
358
379
|
end
|
359
380
|
|
360
|
-
it 'works in a method body inside begin..end' do
|
381
|
+
it 'works in a method body inside begin..end with rescue' do
|
361
382
|
'def foo; bar; begin; baz; rescue; qux; end; quuz; end'.
|
362
383
|
must_be_parsed_as s(:defn,
|
363
384
|
:foo,
|
@@ -368,6 +389,47 @@ describe RipperRubyParser::Parser do
|
|
368
389
|
s(:resbody, s(:array), s(:call, nil, :qux))),
|
369
390
|
s(:call, nil, :quuz))
|
370
391
|
end
|
392
|
+
|
393
|
+
it 'works in a method body inside begin..end without rescue' do
|
394
|
+
'def foo; bar; begin; baz; qux; end; quuz; end'.
|
395
|
+
must_be_parsed_as s(:defn,
|
396
|
+
:foo,
|
397
|
+
s(:args),
|
398
|
+
s(:call, nil, :bar),
|
399
|
+
s(:block,
|
400
|
+
s(:call, nil, :baz),
|
401
|
+
s(:call, nil, :qux)),
|
402
|
+
s(:call, nil, :quuz))
|
403
|
+
end
|
404
|
+
|
405
|
+
it 'works in a method body fully inside begin..end' do
|
406
|
+
'def foo; begin; bar; baz; end; end'.
|
407
|
+
must_be_parsed_as s(:defn,
|
408
|
+
:foo,
|
409
|
+
s(:args),
|
410
|
+
s(:call, nil, :bar),
|
411
|
+
s(:call, nil, :baz))
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
describe 'for the postfix rescue modifier' do
|
416
|
+
it 'works in the basic case' do
|
417
|
+
'foo rescue bar'.
|
418
|
+
must_be_parsed_as s(:rescue,
|
419
|
+
s(:call, nil, :foo),
|
420
|
+
s(:resbody,
|
421
|
+
s(:array),
|
422
|
+
s(:call, nil, :bar)))
|
423
|
+
end
|
424
|
+
|
425
|
+
it 'works when the fallback value is a keyword' do
|
426
|
+
'foo rescue next'.
|
427
|
+
must_be_parsed_as s(:rescue,
|
428
|
+
s(:call, nil, :foo),
|
429
|
+
s(:resbody,
|
430
|
+
s(:array),
|
431
|
+
s(:next)))
|
432
|
+
end
|
371
433
|
end
|
372
434
|
|
373
435
|
describe 'for the ensure statement' do
|
@@ -554,6 +616,14 @@ describe RipperRubyParser::Parser do
|
|
554
616
|
s(:call, nil, :bar))
|
555
617
|
end
|
556
618
|
|
619
|
+
it 'works in the simple case without parentheses' do
|
620
|
+
'-> foo { bar }'.
|
621
|
+
must_be_parsed_as s(:iter,
|
622
|
+
s(:call, nil, :lambda),
|
623
|
+
s(:args, :foo),
|
624
|
+
s(:call, nil, :bar))
|
625
|
+
end
|
626
|
+
|
557
627
|
it 'works when there are zero arguments' do
|
558
628
|
'->() { bar }'.
|
559
629
|
must_be_parsed_as s(:iter,
|
@@ -1,3 +1,5 @@
|
|
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
|
@@ -29,6 +31,14 @@ describe RipperRubyParser::Parser do
|
|
29
31
|
nil)
|
30
32
|
end
|
31
33
|
|
34
|
+
it 'works with a begin..end block' do
|
35
|
+
'if foo; begin; bar; end; end'.
|
36
|
+
must_be_parsed_as s(:if,
|
37
|
+
s(:call, nil, :foo),
|
38
|
+
s(:call, nil, :bar),
|
39
|
+
nil)
|
40
|
+
end
|
41
|
+
|
32
42
|
it 'works with an else clause' do
|
33
43
|
'if foo; bar; else; baz; end'.
|
34
44
|
must_be_parsed_as s(:if,
|
@@ -61,6 +71,14 @@ describe RipperRubyParser::Parser do
|
|
61
71
|
nil)
|
62
72
|
end
|
63
73
|
|
74
|
+
it 'handles bare integer literal in condition' do
|
75
|
+
'if 1; bar; end'.
|
76
|
+
must_be_parsed_as s(:if,
|
77
|
+
s(:lit, 1),
|
78
|
+
s(:call, nil, :bar),
|
79
|
+
nil)
|
80
|
+
end
|
81
|
+
|
64
82
|
it 'handles bare regex literal in condition' do
|
65
83
|
'if /foo/; bar; end'.
|
66
84
|
must_be_parsed_as s(:if,
|
@@ -108,6 +126,37 @@ describe RipperRubyParser::Parser do
|
|
108
126
|
s(:call, nil, :qux),
|
109
127
|
s(:call, nil, :baz))
|
110
128
|
end
|
129
|
+
|
130
|
+
it 'cleans up begin..end block in condition' do
|
131
|
+
'if begin foo end; bar; end'.
|
132
|
+
must_be_parsed_as s(:if,
|
133
|
+
s(:call, nil, :foo),
|
134
|
+
s(:call, nil, :bar), nil)
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'handles special conditions inside begin..end block' do
|
138
|
+
'if begin foo..bar end; baz; end'.
|
139
|
+
must_be_parsed_as s(:if,
|
140
|
+
s(:flip2, s(:call, nil, :foo), s(:call, nil, :bar)),
|
141
|
+
s(:call, nil, :baz),
|
142
|
+
nil)
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'works with assignment in the condition' do
|
146
|
+
'if foo = bar; baz; end'.
|
147
|
+
must_be_parsed_as s(:if,
|
148
|
+
s(:lasgn, :foo,
|
149
|
+
s(:call, nil, :bar)),
|
150
|
+
s(:call, nil, :baz), nil)
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'works with bracketed assignment in the condition' do
|
154
|
+
'if (foo = bar); baz; end'.
|
155
|
+
must_be_parsed_as s(:if,
|
156
|
+
s(:lasgn, :foo,
|
157
|
+
s(:call, nil, :bar)),
|
158
|
+
s(:call, nil, :baz), nil)
|
159
|
+
end
|
111
160
|
end
|
112
161
|
|
113
162
|
describe 'for postfix if' do
|
@@ -150,6 +199,13 @@ describe RipperRubyParser::Parser do
|
|
150
199
|
nil,
|
151
200
|
s(:call, nil, :baz))
|
152
201
|
end
|
202
|
+
|
203
|
+
it 'cleans up begin..end block in condition' do
|
204
|
+
'foo if begin bar end'.
|
205
|
+
must_be_parsed_as s(:if,
|
206
|
+
s(:call, nil, :bar),
|
207
|
+
s(:call, nil, :foo), nil)
|
208
|
+
end
|
153
209
|
end
|
154
210
|
|
155
211
|
describe 'for regular unless' do
|
@@ -285,6 +341,17 @@ describe RipperRubyParser::Parser do
|
|
285
341
|
nil))
|
286
342
|
end
|
287
343
|
|
344
|
+
it 'works with an else' do
|
345
|
+
'if foo; bar; elsif baz; qux; else; quuz; end'.
|
346
|
+
must_be_parsed_as s(:if,
|
347
|
+
s(:call, nil, :foo),
|
348
|
+
s(:call, nil, :bar),
|
349
|
+
s(:if,
|
350
|
+
s(:call, nil, :baz),
|
351
|
+
s(:call, nil, :qux),
|
352
|
+
s(:call, nil, :quuz)))
|
353
|
+
end
|
354
|
+
|
288
355
|
it 'works with an empty else' do
|
289
356
|
'if foo; bar; elsif baz; qux; else; end'.
|
290
357
|
must_be_parsed_as s(:if,
|
@@ -330,6 +397,17 @@ describe RipperRubyParser::Parser do
|
|
330
397
|
s(:call, nil, :quuz),
|
331
398
|
nil))
|
332
399
|
end
|
400
|
+
|
401
|
+
it 'cleans up begin..end block in condition' do
|
402
|
+
'if foo; bar; elsif begin baz end; qux; end'.
|
403
|
+
must_be_parsed_as s(:if,
|
404
|
+
s(:call, nil, :foo),
|
405
|
+
s(:call, nil, :bar),
|
406
|
+
s(:if,
|
407
|
+
s(:call, nil, :baz),
|
408
|
+
s(:call, nil, :qux),
|
409
|
+
nil))
|
410
|
+
end
|
333
411
|
end
|
334
412
|
|
335
413
|
describe 'for case block' do
|
@@ -377,6 +455,19 @@ describe RipperRubyParser::Parser do
|
|
377
455
|
s(:call, nil, :qux))
|
378
456
|
end
|
379
457
|
|
458
|
+
it 'works with multiple statements in the else block' do
|
459
|
+
'case foo; when bar; baz; else; qux; quuz end'.
|
460
|
+
must_be_parsed_as s(:case,
|
461
|
+
s(:call, nil, :foo),
|
462
|
+
s(:when,
|
463
|
+
s(:array,
|
464
|
+
s(:call, nil, :bar)),
|
465
|
+
s(:call, nil, :baz)),
|
466
|
+
s(:block,
|
467
|
+
s(:call, nil, :qux),
|
468
|
+
s(:call, nil, :quuz)))
|
469
|
+
end
|
470
|
+
|
380
471
|
it 'works with an empty when block' do
|
381
472
|
'case foo; when bar; end'.
|
382
473
|
must_be_parsed_as s(:case,
|