ripper_ruby_parser 1.4.2 → 1.5.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 +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,
|