ripper_ruby_parser 1.1.1 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/Rakefile +2 -2
- data/lib/ripper_ruby_parser/commenting_ripper_parser.rb +55 -4
- data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +20 -13
- data/lib/ripper_ruby_parser/sexp_handlers/conditionals.rb +27 -12
- data/lib/ripper_ruby_parser/sexp_handlers/hashes.rb +25 -12
- data/lib/ripper_ruby_parser/sexp_handlers/helper_methods.rb +4 -2
- data/lib/ripper_ruby_parser/sexp_handlers/literals.rb +19 -15
- data/lib/ripper_ruby_parser/sexp_handlers/loops.rb +25 -11
- data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +12 -4
- data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +8 -4
- data/lib/ripper_ruby_parser/sexp_handlers/operators.rb +1 -5
- data/lib/ripper_ruby_parser/version.rb +1 -1
- data/lib/ripper_ruby_parser.rb +2 -2
- data/test/end_to_end/comments_test.rb +4 -4
- data/test/end_to_end/comparison_test.rb +15 -15
- data/test/end_to_end/error_conditions_test.rb +16 -16
- data/test/end_to_end/lib_comparison_test.rb +3 -3
- data/test/end_to_end/line_numbering_test.rb +4 -4
- data/test/end_to_end/samples_comparison_test.rb +4 -4
- data/test/end_to_end/test_comparison_test.rb +3 -3
- data/test/pt_testcase/pt_test.rb +4 -4
- data/test/test_helper.rb +1 -1
- data/test/unit/commenting_ripper_parser_test.rb +33 -33
- data/test/unit/parser_assignment_test.rb +30 -30
- data/test/unit/parser_blocks_test.rb +83 -65
- data/test/unit/parser_conditionals_test.rb +96 -64
- data/test/unit/parser_literals_test.rb +308 -212
- data/test/unit/parser_loops_test.rb +85 -15
- data/test/unit/parser_method_calls_test.rb +100 -41
- data/test/unit/parser_operators_test.rb +60 -28
- data/test/unit/parser_test.rb +435 -410
- data/test/unit/sexp_processor_test.rb +82 -82
- data/test/unit/version_test.rb +1 -1
- metadata +2 -2
data/test/unit/parser_test.rb
CHANGED
@@ -2,248 +2,216 @@ require File.expand_path('../test_helper.rb', File.dirname(__FILE__))
|
|
2
2
|
|
3
3
|
describe RipperRubyParser::Parser do
|
4
4
|
let(:parser) { RipperRubyParser::Parser.new }
|
5
|
-
describe
|
6
|
-
it
|
7
|
-
result = parser.parse
|
5
|
+
describe '#parse' do
|
6
|
+
it 'returns an s-expression' do
|
7
|
+
result = parser.parse 'foo'
|
8
8
|
result.must_be_instance_of Sexp
|
9
9
|
end
|
10
10
|
|
11
|
-
it
|
11
|
+
it 'post-processes its result with the passed sexp processor' do
|
12
12
|
sexp_p = MiniTest::Mock.new
|
13
13
|
sexp_p.expect :process, s(:result), [Sexp]
|
14
14
|
sexp_p.expect :filename=, nil, ['(string)']
|
15
15
|
sexp_p.expect :extra_compatible=, nil, [false]
|
16
16
|
|
17
17
|
parser = RipperRubyParser::Parser.new sexp_p
|
18
|
-
result = parser.parse
|
18
|
+
result = parser.parse 'any code'
|
19
19
|
|
20
20
|
result.must_equal s(:result)
|
21
21
|
sexp_p.verify
|
22
22
|
end
|
23
23
|
|
24
|
-
describe
|
25
|
-
it
|
26
|
-
|
24
|
+
describe 'for an empty program' do
|
25
|
+
it 'returns nil' do
|
26
|
+
''.must_be_parsed_as nil
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
describe
|
31
|
-
it
|
32
|
-
|
30
|
+
describe 'for a class declaration' do
|
31
|
+
it 'works with a namespaced class name' do
|
32
|
+
'class Foo::Bar; end'.
|
33
33
|
must_be_parsed_as s(:class,
|
34
34
|
s(:colon2, s(:const, :Foo), :Bar),
|
35
35
|
nil)
|
36
36
|
end
|
37
37
|
|
38
|
-
it
|
39
|
-
|
38
|
+
it 'works for singleton classes' do
|
39
|
+
'class << self; end'.must_be_parsed_as s(:sclass, s(:self))
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
describe
|
44
|
-
it
|
45
|
-
|
43
|
+
describe 'for a module declaration' do
|
44
|
+
it 'works with a namespaced module name' do
|
45
|
+
'module Foo::Bar; end'.
|
46
46
|
must_be_parsed_as s(:module,
|
47
47
|
s(:colon2, s(:const, :Foo), :Bar))
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
describe
|
52
|
-
it
|
53
|
-
|
51
|
+
describe 'for empty brackets' do
|
52
|
+
it 'works with lone ()' do
|
53
|
+
'()'.must_be_parsed_as s(:nil)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
describe
|
58
|
-
it
|
59
|
-
|
57
|
+
describe 'for the return statement' do
|
58
|
+
it 'works with no arguments' do
|
59
|
+
'return'.
|
60
60
|
must_be_parsed_as s(:return)
|
61
61
|
end
|
62
62
|
|
63
|
-
it
|
64
|
-
|
63
|
+
it 'works with one argument' do
|
64
|
+
'return foo'.
|
65
65
|
must_be_parsed_as s(:return,
|
66
66
|
s(:call, nil, :foo))
|
67
67
|
end
|
68
68
|
|
69
|
-
it
|
70
|
-
|
69
|
+
it 'works with a splat argument' do
|
70
|
+
'return *foo'.
|
71
71
|
must_be_parsed_as s(:return,
|
72
72
|
s(:svalue,
|
73
73
|
s(:splat,
|
74
74
|
s(:call, nil, :foo))))
|
75
75
|
end
|
76
76
|
|
77
|
-
it
|
78
|
-
|
77
|
+
it 'works with multiple arguments' do
|
78
|
+
'return foo, bar'.
|
79
79
|
must_be_parsed_as s(:return,
|
80
80
|
s(:array,
|
81
81
|
s(:call, nil, :foo),
|
82
82
|
s(:call, nil, :bar)))
|
83
83
|
end
|
84
84
|
|
85
|
-
it
|
86
|
-
|
85
|
+
it 'works with a regular argument and a splat argument' do
|
86
|
+
'return foo, *bar'.
|
87
87
|
must_be_parsed_as s(:return,
|
88
88
|
s(:array,
|
89
89
|
s(:call, nil, :foo),
|
90
90
|
s(:splat,
|
91
91
|
s(:call, nil, :bar))))
|
92
92
|
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe "for the until statement" do
|
96
|
-
it "works in the prefix block case with do" do
|
97
|
-
"until foo do; bar; end".
|
98
|
-
must_be_parsed_as s(:until,
|
99
|
-
s(:call, nil, :foo),
|
100
|
-
s(:call, nil, :bar), true)
|
101
|
-
end
|
102
|
-
|
103
|
-
it "works in the prefix block case without do" do
|
104
|
-
"until foo; bar; end".
|
105
|
-
must_be_parsed_as s(:until,
|
106
|
-
s(:call, nil, :foo),
|
107
|
-
s(:call, nil, :bar), true)
|
108
|
-
end
|
109
|
-
|
110
|
-
it "works in the single-line postfix case" do
|
111
|
-
"foo until bar".
|
112
|
-
must_be_parsed_as s(:until,
|
113
|
-
s(:call, nil, :bar),
|
114
|
-
s(:call, nil, :foo), true)
|
115
|
-
end
|
116
|
-
|
117
|
-
it "works in the block postfix case" do
|
118
|
-
"begin; foo; end until bar".
|
119
|
-
must_be_parsed_as s(:until,
|
120
|
-
s(:call, nil, :bar),
|
121
|
-
s(:call, nil, :foo), false)
|
122
|
-
end
|
123
|
-
end
|
124
93
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
s(:call, nil, :bar), true)
|
94
|
+
it 'works with a function call with parentheses' do
|
95
|
+
'return foo(bar)'.
|
96
|
+
must_be_parsed_as s(:return,
|
97
|
+
s(:call, nil, :foo,
|
98
|
+
s(:call, nil, :bar)))
|
131
99
|
end
|
132
100
|
|
133
|
-
it
|
134
|
-
|
135
|
-
must_be_parsed_as s(:
|
136
|
-
s(:call, nil, :foo
|
137
|
-
|
101
|
+
it 'works with a function call without parentheses' do
|
102
|
+
'return foo bar'.
|
103
|
+
must_be_parsed_as s(:return,
|
104
|
+
s(:call, nil, :foo,
|
105
|
+
s(:call, nil, :bar)))
|
138
106
|
end
|
139
107
|
end
|
140
108
|
|
141
|
-
describe
|
142
|
-
it
|
143
|
-
|
109
|
+
describe 'for the for statement' do
|
110
|
+
it 'works with do' do
|
111
|
+
'for foo in bar do; baz; end'.
|
144
112
|
must_be_parsed_as s(:for,
|
145
113
|
s(:call, nil, :bar),
|
146
114
|
s(:lasgn, :foo),
|
147
115
|
s(:call, nil, :baz))
|
148
116
|
end
|
149
117
|
|
150
|
-
it
|
151
|
-
|
118
|
+
it 'works without do' do
|
119
|
+
'for foo in bar; baz; end'.
|
152
120
|
must_be_parsed_as s(:for,
|
153
121
|
s(:call, nil, :bar),
|
154
122
|
s(:lasgn, :foo),
|
155
123
|
s(:call, nil, :baz))
|
156
124
|
end
|
157
125
|
|
158
|
-
it
|
159
|
-
|
126
|
+
it 'works with an empty body' do
|
127
|
+
'for foo in bar; end'.
|
160
128
|
must_be_parsed_as s(:for,
|
161
129
|
s(:call, nil, :bar),
|
162
130
|
s(:lasgn, :foo))
|
163
131
|
end
|
164
132
|
end
|
165
133
|
|
166
|
-
describe
|
167
|
-
it
|
168
|
-
|
134
|
+
describe 'for a begin..end block' do
|
135
|
+
it 'works with no statements' do
|
136
|
+
'begin; end'.
|
169
137
|
must_be_parsed_as s(:nil)
|
170
138
|
end
|
171
139
|
|
172
|
-
it
|
173
|
-
|
140
|
+
it 'works with one statement' do
|
141
|
+
'begin; foo; end'.
|
174
142
|
must_be_parsed_as s(:call, nil, :foo)
|
175
143
|
end
|
176
144
|
|
177
|
-
it
|
178
|
-
|
145
|
+
it 'works with multiple statements' do
|
146
|
+
'begin; foo; bar; end'.
|
179
147
|
must_be_parsed_as s(:block,
|
180
148
|
s(:call, nil, :foo),
|
181
149
|
s(:call, nil, :bar))
|
182
150
|
end
|
183
151
|
end
|
184
152
|
|
185
|
-
describe
|
186
|
-
it
|
187
|
-
|
153
|
+
describe 'for the undef statement' do
|
154
|
+
it 'works with a single bareword identifier' do
|
155
|
+
'undef foo'.
|
188
156
|
must_be_parsed_as s(:undef, s(:lit, :foo))
|
189
157
|
end
|
190
158
|
|
191
|
-
it
|
192
|
-
|
159
|
+
it 'works with a single symbol' do
|
160
|
+
'undef :foo'.
|
193
161
|
must_be_parsed_as s(:undef, s(:lit, :foo))
|
194
162
|
end
|
195
163
|
|
196
|
-
it
|
197
|
-
|
164
|
+
it 'works with multiple bareword identifiers' do
|
165
|
+
'undef foo, bar'.
|
198
166
|
must_be_parsed_as s(:block,
|
199
167
|
s(:undef, s(:lit, :foo)),
|
200
168
|
s(:undef, s(:lit, :bar)))
|
201
169
|
end
|
202
170
|
|
203
|
-
it
|
204
|
-
|
171
|
+
it 'works with multiple bareword symbols' do
|
172
|
+
'undef :foo, :bar'.
|
205
173
|
must_be_parsed_as s(:block,
|
206
174
|
s(:undef, s(:lit, :foo)),
|
207
175
|
s(:undef, s(:lit, :bar)))
|
208
176
|
end
|
209
177
|
end
|
210
178
|
|
211
|
-
describe
|
212
|
-
it
|
213
|
-
|
179
|
+
describe 'for the alias statement' do
|
180
|
+
it 'works with regular barewords' do
|
181
|
+
'alias foo bar'.
|
214
182
|
must_be_parsed_as s(:alias,
|
215
183
|
s(:lit, :foo), s(:lit, :bar))
|
216
184
|
end
|
217
185
|
|
218
|
-
it
|
219
|
-
|
186
|
+
it 'works with symbols' do
|
187
|
+
'alias :foo :bar'.
|
220
188
|
must_be_parsed_as s(:alias,
|
221
189
|
s(:lit, :foo), s(:lit, :bar))
|
222
190
|
end
|
223
191
|
|
224
|
-
it
|
225
|
-
|
192
|
+
it 'works with operator barewords' do
|
193
|
+
'alias + -'.
|
226
194
|
must_be_parsed_as s(:alias,
|
227
195
|
s(:lit, :+), s(:lit, :-))
|
228
196
|
end
|
229
197
|
|
230
|
-
it
|
231
|
-
|
198
|
+
it 'works with global variables' do
|
199
|
+
'alias $foo $bar'.
|
232
200
|
must_be_parsed_as s(:valias, :$foo, :$bar)
|
233
201
|
end
|
234
202
|
end
|
235
203
|
|
236
|
-
describe
|
237
|
-
it
|
238
|
-
|
204
|
+
describe 'for arguments' do
|
205
|
+
it 'works for a simple case with splat' do
|
206
|
+
'foo *bar'.
|
239
207
|
must_be_parsed_as s(:call,
|
240
208
|
nil,
|
241
209
|
:foo,
|
242
210
|
s(:splat, s(:call, nil, :bar)))
|
243
211
|
end
|
244
212
|
|
245
|
-
it
|
246
|
-
|
213
|
+
it 'works for a multi-argument case with splat' do
|
214
|
+
'foo bar, *baz'.
|
247
215
|
must_be_parsed_as s(:call,
|
248
216
|
nil,
|
249
217
|
:foo,
|
@@ -251,15 +219,15 @@ describe RipperRubyParser::Parser do
|
|
251
219
|
s(:splat, s(:call, nil, :baz)))
|
252
220
|
end
|
253
221
|
|
254
|
-
it
|
255
|
-
|
222
|
+
it 'works for a simple case passing a block' do
|
223
|
+
'foo &bar'.
|
256
224
|
must_be_parsed_as s(:call, nil, :foo,
|
257
225
|
s(:block_pass,
|
258
226
|
s(:call, nil, :bar)))
|
259
227
|
end
|
260
228
|
|
261
|
-
it
|
262
|
-
|
229
|
+
it 'works for a bare hash' do
|
230
|
+
'foo bar => baz'.
|
263
231
|
must_be_parsed_as s(:call, nil, :foo,
|
264
232
|
s(:hash,
|
265
233
|
s(:call, nil, :bar),
|
@@ -267,29 +235,29 @@ describe RipperRubyParser::Parser do
|
|
267
235
|
end
|
268
236
|
end
|
269
237
|
|
270
|
-
describe
|
271
|
-
it
|
272
|
-
|
238
|
+
describe 'for collection indexing' do
|
239
|
+
it 'works in the simple case' do
|
240
|
+
'foo[bar]'.
|
273
241
|
must_be_parsed_as s(:call,
|
274
242
|
s(:call, nil, :foo),
|
275
243
|
:[],
|
276
244
|
s(:call, nil, :bar))
|
277
245
|
end
|
278
246
|
|
279
|
-
it
|
280
|
-
|
247
|
+
it 'works without any indexes' do
|
248
|
+
'foo[]'.must_be_parsed_as s(:call, s(:call, nil, :foo),
|
281
249
|
:[])
|
282
250
|
end
|
283
251
|
|
284
|
-
it
|
285
|
-
|
252
|
+
it 'drops self from self[]' do
|
253
|
+
'self[foo]'.must_be_parsed_as s(:call, nil, :[],
|
286
254
|
s(:call, nil, :foo))
|
287
255
|
end
|
288
256
|
end
|
289
257
|
|
290
|
-
describe
|
291
|
-
it
|
292
|
-
|
258
|
+
describe 'for method definitions' do
|
259
|
+
it 'works with def with receiver' do
|
260
|
+
'def foo.bar; end'.
|
293
261
|
must_be_parsed_as s(:defs,
|
294
262
|
s(:call, nil, :foo),
|
295
263
|
:bar,
|
@@ -297,8 +265,8 @@ describe RipperRubyParser::Parser do
|
|
297
265
|
s(:nil))
|
298
266
|
end
|
299
267
|
|
300
|
-
it
|
301
|
-
|
268
|
+
it 'works with def with receiver and multiple statements' do
|
269
|
+
'def foo.bar; baz; qux; end'.
|
302
270
|
must_be_parsed_as s(:defs,
|
303
271
|
s(:call, nil, :foo),
|
304
272
|
:bar,
|
@@ -307,16 +275,16 @@ describe RipperRubyParser::Parser do
|
|
307
275
|
s(:call, nil, :qux))
|
308
276
|
end
|
309
277
|
|
310
|
-
it
|
311
|
-
|
278
|
+
it 'works with a method argument with a default value' do
|
279
|
+
'def foo bar=nil; end'.
|
312
280
|
must_be_parsed_as s(:defn,
|
313
281
|
:foo,
|
314
282
|
s(:args, s(:lasgn, :bar, s(:nil))),
|
315
283
|
s(:nil))
|
316
284
|
end
|
317
285
|
|
318
|
-
it
|
319
|
-
|
286
|
+
it 'works with several method arguments with default values' do
|
287
|
+
'def foo bar=1, baz=2; end'.
|
320
288
|
must_be_parsed_as s(:defn,
|
321
289
|
:foo,
|
322
290
|
s(:args,
|
@@ -325,47 +293,47 @@ describe RipperRubyParser::Parser do
|
|
325
293
|
s(:nil))
|
326
294
|
end
|
327
295
|
|
328
|
-
it
|
329
|
-
|
296
|
+
it 'works with brackets around the parameter list' do
|
297
|
+
'def foo(bar); end'.
|
330
298
|
must_be_parsed_as s(:defn, :foo, s(:args, :bar), s(:nil))
|
331
299
|
end
|
332
300
|
|
333
|
-
it
|
334
|
-
|
301
|
+
it 'works with a simple splat' do
|
302
|
+
'def foo *bar; end'.
|
335
303
|
must_be_parsed_as s(:defn, :foo, s(:args, :"*bar"), s(:nil))
|
336
304
|
end
|
337
305
|
|
338
|
-
it
|
339
|
-
|
306
|
+
it 'works with a regular argument plus splat' do
|
307
|
+
'def foo bar, *baz; end'.
|
340
308
|
must_be_parsed_as s(:defn, :foo, s(:args, :bar, :"*baz"), s(:nil))
|
341
309
|
end
|
342
310
|
|
343
|
-
it
|
344
|
-
|
311
|
+
it 'works with a nameless splat' do
|
312
|
+
'def foo *; end'.
|
345
313
|
must_be_parsed_as s(:defn,
|
346
314
|
:foo,
|
347
315
|
s(:args, :"*"),
|
348
316
|
s(:nil))
|
349
317
|
end
|
350
318
|
|
351
|
-
it
|
352
|
-
|
319
|
+
it 'works for a simple case with explicit block parameter' do
|
320
|
+
'def foo &bar; end'.
|
353
321
|
must_be_parsed_as s(:defn,
|
354
322
|
:foo,
|
355
323
|
s(:args, :"&bar"),
|
356
324
|
s(:nil))
|
357
325
|
end
|
358
326
|
|
359
|
-
it
|
360
|
-
|
327
|
+
it 'works with a regular argument plus explicit block parameter' do
|
328
|
+
'def foo bar, &baz; end'.
|
361
329
|
must_be_parsed_as s(:defn,
|
362
330
|
:foo,
|
363
331
|
s(:args, :bar, :"&baz"),
|
364
332
|
s(:nil))
|
365
333
|
end
|
366
334
|
|
367
|
-
it
|
368
|
-
|
335
|
+
it 'works with a default value plus explicit block parameter' do
|
336
|
+
'def foo bar=1, &baz; end'.
|
369
337
|
must_be_parsed_as s(:defn,
|
370
338
|
:foo,
|
371
339
|
s(:args,
|
@@ -374,8 +342,8 @@ describe RipperRubyParser::Parser do
|
|
374
342
|
s(:nil))
|
375
343
|
end
|
376
344
|
|
377
|
-
it
|
378
|
-
|
345
|
+
it 'works with a default value plus mandatory argument' do
|
346
|
+
'def foo bar=1, baz; end'.
|
379
347
|
must_be_parsed_as s(:defn,
|
380
348
|
:foo,
|
381
349
|
s(:args,
|
@@ -384,16 +352,16 @@ describe RipperRubyParser::Parser do
|
|
384
352
|
s(:nil))
|
385
353
|
end
|
386
354
|
|
387
|
-
it
|
388
|
-
|
355
|
+
it 'works with a splat plus explicit block parameter' do
|
356
|
+
'def foo *bar, &baz; end'.
|
389
357
|
must_be_parsed_as s(:defn,
|
390
358
|
:foo,
|
391
359
|
s(:args, :"*bar", :"&baz"),
|
392
360
|
s(:nil))
|
393
361
|
end
|
394
362
|
|
395
|
-
it
|
396
|
-
|
363
|
+
it 'works with a default value plus splat' do
|
364
|
+
'def foo bar=1, *baz; end'.
|
397
365
|
must_be_parsed_as s(:defn,
|
398
366
|
:foo,
|
399
367
|
s(:args,
|
@@ -402,8 +370,8 @@ describe RipperRubyParser::Parser do
|
|
402
370
|
s(:nil))
|
403
371
|
end
|
404
372
|
|
405
|
-
it
|
406
|
-
|
373
|
+
it 'works with a default value, splat, plus final mandatory arguments' do
|
374
|
+
'def foo bar=1, *baz, qux, quuz; end'.
|
407
375
|
must_be_parsed_as s(:defn,
|
408
376
|
:foo,
|
409
377
|
s(:args,
|
@@ -412,39 +380,66 @@ describe RipperRubyParser::Parser do
|
|
412
380
|
s(:nil))
|
413
381
|
end
|
414
382
|
|
415
|
-
it
|
416
|
-
|
383
|
+
it 'works with a named argument with a default value' do
|
384
|
+
'def foo bar: 1; end'.
|
385
|
+
must_be_parsed_as s(:defn,
|
386
|
+
:foo,
|
387
|
+
s(:args,
|
388
|
+
s(:kwarg, :bar, s(:lit, 1))),
|
389
|
+
s(:nil))
|
390
|
+
end
|
391
|
+
|
392
|
+
it 'works with a named argument with no default value' do
|
393
|
+
skip 'Default values are required in Ruby 2.0' if RUBY_VERSION < '2.1.0'
|
394
|
+
'def foo bar:; end'.
|
395
|
+
must_be_parsed_as s(:defn,
|
396
|
+
:foo,
|
397
|
+
s(:args,
|
398
|
+
s(:kwarg, :bar)),
|
399
|
+
s(:nil))
|
400
|
+
end
|
401
|
+
|
402
|
+
it 'works with a double splat' do
|
403
|
+
'def foo **bar; end'.
|
404
|
+
must_be_parsed_as s(:defn,
|
405
|
+
:foo,
|
406
|
+
s(:args, :'**bar'),
|
407
|
+
s(:nil))
|
408
|
+
end
|
409
|
+
|
410
|
+
it 'works when the method name is an operator' do
|
411
|
+
'def +; end'.
|
417
412
|
must_be_parsed_as s(:defn, :+, s(:args),
|
418
413
|
s(:nil))
|
419
414
|
end
|
420
415
|
end
|
421
416
|
|
422
|
-
describe
|
423
|
-
it
|
424
|
-
|
417
|
+
describe 'for blocks' do
|
418
|
+
it 'works with no statements in the block body' do
|
419
|
+
'foo do; end'.
|
425
420
|
must_be_parsed_as s(:iter,
|
426
421
|
s(:call, nil, :foo),
|
427
422
|
0)
|
428
423
|
end
|
429
424
|
|
430
|
-
it
|
431
|
-
|
425
|
+
it 'works with next with no arguments' do
|
426
|
+
'foo do; next; end'.
|
432
427
|
must_be_parsed_as s(:iter,
|
433
428
|
s(:call, nil, :foo),
|
434
429
|
0,
|
435
430
|
s(:next))
|
436
431
|
end
|
437
432
|
|
438
|
-
it
|
439
|
-
|
433
|
+
it 'works with next with one argument' do
|
434
|
+
'foo do; next bar; end'.
|
440
435
|
must_be_parsed_as s(:iter,
|
441
436
|
s(:call, nil, :foo),
|
442
437
|
0,
|
443
438
|
s(:next, s(:call, nil, :bar)))
|
444
439
|
end
|
445
440
|
|
446
|
-
it
|
447
|
-
|
441
|
+
it 'works with next with several arguments' do
|
442
|
+
'foo do; next bar, baz; end'.
|
448
443
|
must_be_parsed_as s(:iter,
|
449
444
|
s(:call, nil, :foo),
|
450
445
|
0,
|
@@ -454,24 +449,44 @@ describe RipperRubyParser::Parser do
|
|
454
449
|
s(:call, nil, :baz))))
|
455
450
|
end
|
456
451
|
|
457
|
-
it
|
458
|
-
|
452
|
+
it 'works with next with a function call with parentheses' do
|
453
|
+
'foo do; next foo(bar); end'.
|
454
|
+
must_be_parsed_as s(:iter,
|
455
|
+
s(:call, nil, :foo),
|
456
|
+
0,
|
457
|
+
s(:next,
|
458
|
+
s(:call, nil, :foo,
|
459
|
+
s(:call, nil, :bar))))
|
460
|
+
end
|
461
|
+
|
462
|
+
it 'works with next with a function call without parentheses' do
|
463
|
+
'foo do; next foo bar; end'.
|
464
|
+
must_be_parsed_as s(:iter,
|
465
|
+
s(:call, nil, :foo),
|
466
|
+
0,
|
467
|
+
s(:next,
|
468
|
+
s(:call, nil, :foo,
|
469
|
+
s(:call, nil, :bar))))
|
470
|
+
end
|
471
|
+
|
472
|
+
it 'works with break with no arguments' do
|
473
|
+
'foo do; break; end'.
|
459
474
|
must_be_parsed_as s(:iter,
|
460
475
|
s(:call, nil, :foo),
|
461
476
|
0,
|
462
477
|
s(:break))
|
463
478
|
end
|
464
479
|
|
465
|
-
it
|
466
|
-
|
480
|
+
it 'works with break with one argument' do
|
481
|
+
'foo do; break bar; end'.
|
467
482
|
must_be_parsed_as s(:iter,
|
468
483
|
s(:call, nil, :foo),
|
469
484
|
0,
|
470
485
|
s(:break, s(:call, nil, :bar)))
|
471
486
|
end
|
472
487
|
|
473
|
-
it
|
474
|
-
|
488
|
+
it 'works with break with several arguments' do
|
489
|
+
'foo do; break bar, baz; end'.
|
475
490
|
must_be_parsed_as s(:iter,
|
476
491
|
s(:call, nil, :foo),
|
477
492
|
0,
|
@@ -481,199 +496,233 @@ describe RipperRubyParser::Parser do
|
|
481
496
|
s(:call, nil, :baz))))
|
482
497
|
end
|
483
498
|
|
484
|
-
it
|
485
|
-
|
499
|
+
it 'works with break with a function call with parentheses' do
|
500
|
+
'foo do; break foo(bar); end'.
|
501
|
+
must_be_parsed_as s(:iter,
|
502
|
+
s(:call, nil, :foo),
|
503
|
+
0,
|
504
|
+
s(:break,
|
505
|
+
s(:call, nil, :foo,
|
506
|
+
s(:call, nil, :bar))))
|
507
|
+
end
|
508
|
+
|
509
|
+
it 'works with break with a function call without parentheses' do
|
510
|
+
'foo do; break foo bar; end'.
|
511
|
+
must_be_parsed_as s(:iter,
|
512
|
+
s(:call, nil, :foo),
|
513
|
+
0,
|
514
|
+
s(:break,
|
515
|
+
s(:call, nil, :foo,
|
516
|
+
s(:call, nil, :bar))))
|
517
|
+
end
|
518
|
+
|
519
|
+
it 'works with redo' do
|
520
|
+
'foo do; redo; end'.
|
486
521
|
must_be_parsed_as s(:iter,
|
487
522
|
s(:call, nil, :foo),
|
488
523
|
0,
|
489
524
|
s(:redo))
|
490
525
|
end
|
491
526
|
|
492
|
-
it
|
493
|
-
|
527
|
+
it 'works with zero arguments' do
|
528
|
+
'foo do ||; end'.
|
494
529
|
must_be_parsed_as s(:iter,
|
495
530
|
s(:call, nil, :foo),
|
496
531
|
s(:args))
|
497
532
|
end
|
498
533
|
|
499
|
-
it
|
500
|
-
|
534
|
+
it 'works with one argument' do
|
535
|
+
'foo do |bar|; end'.
|
501
536
|
must_be_parsed_as s(:iter,
|
502
537
|
s(:call, nil, :foo),
|
503
538
|
s(:args, :bar))
|
504
539
|
end
|
505
540
|
|
506
|
-
it
|
507
|
-
|
541
|
+
it 'works with multiple arguments' do
|
542
|
+
'foo do |bar, baz|; end'.
|
508
543
|
must_be_parsed_as s(:iter,
|
509
544
|
s(:call, nil, :foo),
|
510
545
|
s(:args, :bar, :baz))
|
511
546
|
end
|
512
547
|
|
513
|
-
it
|
514
|
-
|
548
|
+
it 'works with a single splat argument' do
|
549
|
+
'foo do |*bar|; end'.
|
515
550
|
must_be_parsed_as s(:iter,
|
516
551
|
s(:call, nil, :foo),
|
517
552
|
s(:args, :"*bar"))
|
518
553
|
end
|
519
554
|
|
520
|
-
it
|
521
|
-
|
555
|
+
it 'works with a combination of regular arguments and a splat argument' do
|
556
|
+
'foo do |bar, *baz|; end'.
|
522
557
|
must_be_parsed_as s(:iter,
|
523
558
|
s(:call, nil, :foo),
|
524
559
|
s(:args, :bar, :"*baz"))
|
525
560
|
end
|
526
561
|
end
|
527
562
|
|
528
|
-
describe
|
529
|
-
it
|
530
|
-
|
563
|
+
describe 'for yield' do
|
564
|
+
it 'works with no arguments and no brackets' do
|
565
|
+
'yield'.
|
531
566
|
must_be_parsed_as s(:yield)
|
532
567
|
end
|
533
568
|
|
534
|
-
it
|
535
|
-
|
569
|
+
it 'works with brackets but no arguments' do
|
570
|
+
'yield()'.
|
536
571
|
must_be_parsed_as s(:yield)
|
537
572
|
end
|
538
573
|
|
539
|
-
it
|
540
|
-
|
574
|
+
it 'works with one argument and no brackets' do
|
575
|
+
'yield foo'.
|
541
576
|
must_be_parsed_as s(:yield, s(:call, nil, :foo))
|
542
577
|
end
|
543
578
|
|
544
|
-
it
|
545
|
-
|
579
|
+
it 'works with one argument and brackets' do
|
580
|
+
'yield(foo)'.
|
546
581
|
must_be_parsed_as s(:yield, s(:call, nil, :foo))
|
547
582
|
end
|
548
583
|
|
549
|
-
it
|
550
|
-
|
584
|
+
it 'works with multiple arguments and no brackets' do
|
585
|
+
'yield foo, bar'.
|
551
586
|
must_be_parsed_as s(:yield,
|
552
587
|
s(:call, nil, :foo),
|
553
588
|
s(:call, nil, :bar))
|
554
589
|
end
|
555
590
|
|
556
|
-
it
|
557
|
-
|
591
|
+
it 'works with multiple arguments and brackets' do
|
592
|
+
'yield(foo, bar)'.
|
558
593
|
must_be_parsed_as s(:yield,
|
559
594
|
s(:call, nil, :foo),
|
560
595
|
s(:call, nil, :bar))
|
561
596
|
end
|
562
597
|
|
563
|
-
it
|
564
|
-
|
598
|
+
it 'works with splat' do
|
599
|
+
'yield foo, *bar'.
|
565
600
|
must_be_parsed_as s(:yield,
|
566
601
|
s(:call, nil, :foo),
|
567
602
|
s(:splat, s(:call, nil, :bar)))
|
568
603
|
end
|
604
|
+
|
605
|
+
it 'works with a function call with parentheses' do
|
606
|
+
'yield foo(bar)'.
|
607
|
+
must_be_parsed_as s(:yield,
|
608
|
+
s(:call, nil, :foo,
|
609
|
+
s(:call, nil, :bar)))
|
610
|
+
end
|
611
|
+
|
612
|
+
it 'works with a function call without parentheses' do
|
613
|
+
'yield foo bar'.
|
614
|
+
must_be_parsed_as s(:yield,
|
615
|
+
s(:call, nil, :foo,
|
616
|
+
s(:call, nil, :bar)))
|
617
|
+
end
|
569
618
|
end
|
570
619
|
|
571
|
-
describe
|
572
|
-
describe
|
620
|
+
describe 'for the __FILE__ keyword' do
|
621
|
+
describe 'when not passing a file name' do
|
573
622
|
it "creates a string sexp with value '(string)'" do
|
574
|
-
|
575
|
-
must_be_parsed_as s(:str,
|
623
|
+
'__FILE__'.
|
624
|
+
must_be_parsed_as s(:str, '(string)')
|
576
625
|
end
|
577
626
|
end
|
578
627
|
|
579
|
-
describe
|
580
|
-
it
|
581
|
-
result = parser.parse
|
582
|
-
result.must_equal s(:str,
|
628
|
+
describe 'when passing a file name' do
|
629
|
+
it 'creates a string sexp with the file name' do
|
630
|
+
result = parser.parse '__FILE__', 'foo'
|
631
|
+
result.must_equal s(:str, 'foo')
|
583
632
|
end
|
584
633
|
end
|
585
634
|
end
|
586
635
|
|
587
|
-
describe
|
588
|
-
it
|
589
|
-
|
636
|
+
describe 'for the __LINE__ keyword' do
|
637
|
+
it 'creates a literal sexp with value of the line number' do
|
638
|
+
'__LINE__'.
|
590
639
|
must_be_parsed_as s(:lit, 1)
|
591
640
|
"\n__LINE__".
|
592
641
|
must_be_parsed_as s(:lit, 2)
|
593
642
|
end
|
594
643
|
end
|
595
644
|
|
596
|
-
describe
|
597
|
-
it
|
598
|
-
|
645
|
+
describe 'for the END keyword' do
|
646
|
+
it 'converts to a :postexe iterator' do
|
647
|
+
'END { foo }'.
|
599
648
|
must_be_parsed_as s(:iter, s(:postexe), 0, s(:call, nil, :foo))
|
600
649
|
end
|
601
650
|
end
|
602
651
|
|
603
|
-
describe
|
604
|
-
it
|
605
|
-
|
652
|
+
describe 'for the BEGIN keyword' do
|
653
|
+
it 'converts to a :preexe iterator' do
|
654
|
+
'BEGIN { foo }'.
|
606
655
|
must_be_parsed_as s(:iter, s(:preexe), s(:args), s(:call, nil, :foo))
|
607
656
|
end
|
608
657
|
end
|
609
658
|
|
610
|
-
describe
|
611
|
-
it
|
612
|
-
|
659
|
+
describe 'for constant lookups' do
|
660
|
+
it 'works when explicitely starting from the root namespace' do
|
661
|
+
'::Foo'.
|
613
662
|
must_be_parsed_as s(:colon3, :Foo)
|
614
663
|
end
|
615
664
|
|
616
|
-
it
|
617
|
-
|
665
|
+
it 'works with a three-level constant lookup' do
|
666
|
+
'Foo::Bar::Baz'.
|
618
667
|
must_be_parsed_as s(:colon2,
|
619
668
|
s(:colon2, s(:const, :Foo), :Bar),
|
620
669
|
:Baz)
|
621
670
|
end
|
622
671
|
|
623
|
-
it
|
624
|
-
|
672
|
+
it 'works looking up a constant in a non-constant' do
|
673
|
+
'foo::Bar'.must_be_parsed_as s(:colon2,
|
625
674
|
s(:call, nil, :foo),
|
626
675
|
:Bar)
|
627
676
|
end
|
628
677
|
end
|
629
678
|
|
630
|
-
describe
|
631
|
-
it
|
632
|
-
|
679
|
+
describe 'for variable references' do
|
680
|
+
it 'works for self' do
|
681
|
+
'self'.
|
633
682
|
must_be_parsed_as s(:self)
|
634
683
|
end
|
635
684
|
|
636
|
-
it
|
637
|
-
|
685
|
+
it 'works for instance variables' do
|
686
|
+
'@foo'.
|
638
687
|
must_be_parsed_as s(:ivar, :@foo)
|
639
688
|
end
|
640
689
|
|
641
|
-
it
|
642
|
-
|
690
|
+
it 'works for global variables' do
|
691
|
+
'$foo'.
|
643
692
|
must_be_parsed_as s(:gvar, :$foo)
|
644
693
|
end
|
645
694
|
|
646
|
-
it
|
647
|
-
|
695
|
+
it 'works for regexp match references' do
|
696
|
+
'$1'.
|
648
697
|
must_be_parsed_as s(:nth_ref, 1)
|
649
698
|
end
|
650
699
|
|
651
700
|
specify { "$'".must_be_parsed_as s(:back_ref, :"'") }
|
652
|
-
specify {
|
701
|
+
specify { '$&'.must_be_parsed_as s(:back_ref, :"&") }
|
653
702
|
|
654
|
-
it
|
655
|
-
|
703
|
+
it 'works for class variables' do
|
704
|
+
'@@foo'.
|
656
705
|
must_be_parsed_as s(:cvar, :@@foo)
|
657
706
|
end
|
658
707
|
end
|
659
708
|
|
660
|
-
describe
|
661
|
-
it
|
662
|
-
|
709
|
+
describe 'for single assignment' do
|
710
|
+
it 'works when assigning to an instance variable' do
|
711
|
+
'@foo = bar'.
|
663
712
|
must_be_parsed_as s(:iasgn,
|
664
713
|
:@foo,
|
665
714
|
s(:call, nil, :bar))
|
666
715
|
end
|
667
716
|
|
668
|
-
it
|
669
|
-
|
717
|
+
it 'works when assigning to a constant' do
|
718
|
+
'FOO = bar'.
|
670
719
|
must_be_parsed_as s(:cdecl,
|
671
720
|
:FOO,
|
672
721
|
s(:call, nil, :bar))
|
673
722
|
end
|
674
723
|
|
675
|
-
it
|
676
|
-
|
724
|
+
it 'works when assigning to a collection element' do
|
725
|
+
'foo[bar] = baz'.
|
677
726
|
must_be_parsed_as s(:attrasgn,
|
678
727
|
s(:call, nil, :foo),
|
679
728
|
:[]=,
|
@@ -681,47 +730,47 @@ describe RipperRubyParser::Parser do
|
|
681
730
|
s(:call, nil, :baz))
|
682
731
|
end
|
683
732
|
|
684
|
-
it
|
685
|
-
|
733
|
+
it 'works when assigning to an attribute' do
|
734
|
+
'foo.bar = baz'.
|
686
735
|
must_be_parsed_as s(:attrasgn,
|
687
736
|
s(:call, nil, :foo),
|
688
737
|
:bar=,
|
689
738
|
s(:call, nil, :baz))
|
690
739
|
end
|
691
740
|
|
692
|
-
it
|
693
|
-
|
741
|
+
it 'works when assigning to a class variable' do
|
742
|
+
'@@foo = bar'.
|
694
743
|
must_be_parsed_as s(:cvdecl,
|
695
744
|
:@@foo,
|
696
745
|
s(:call, nil, :bar))
|
697
746
|
end
|
698
747
|
|
699
|
-
it
|
700
|
-
|
748
|
+
it 'works when assigning to a class variable inside a method' do
|
749
|
+
'def foo; @@bar = baz; end'.
|
701
750
|
must_be_parsed_as s(:defn,
|
702
751
|
:foo, s(:args),
|
703
752
|
s(:cvasgn, :@@bar, s(:call, nil, :baz)))
|
704
753
|
end
|
705
754
|
|
706
|
-
it
|
707
|
-
|
755
|
+
it 'works when assigning to a class variable inside a method with a receiver' do
|
756
|
+
'def self.foo; @@bar = baz; end'.
|
708
757
|
must_be_parsed_as s(:defs,
|
709
758
|
s(:self),
|
710
759
|
:foo, s(:args),
|
711
760
|
s(:cvasgn, :@@bar, s(:call, nil, :baz)))
|
712
761
|
end
|
713
762
|
|
714
|
-
it
|
715
|
-
|
763
|
+
it 'works when assigning to a global variable' do
|
764
|
+
'$foo = bar'.
|
716
765
|
must_be_parsed_as s(:gasgn,
|
717
766
|
:$foo,
|
718
767
|
s(:call, nil, :bar))
|
719
768
|
end
|
720
769
|
end
|
721
770
|
|
722
|
-
describe
|
723
|
-
it
|
724
|
-
|
771
|
+
describe 'for operator assignment' do
|
772
|
+
it 'works with +=' do
|
773
|
+
'foo += bar'.
|
725
774
|
must_be_parsed_as s(:lasgn,
|
726
775
|
:foo,
|
727
776
|
s(:call,
|
@@ -730,8 +779,8 @@ describe RipperRubyParser::Parser do
|
|
730
779
|
s(:call, nil, :bar)))
|
731
780
|
end
|
732
781
|
|
733
|
-
it
|
734
|
-
|
782
|
+
it 'works with -=' do
|
783
|
+
'foo -= bar'.
|
735
784
|
must_be_parsed_as s(:lasgn,
|
736
785
|
:foo,
|
737
786
|
s(:call,
|
@@ -740,16 +789,16 @@ describe RipperRubyParser::Parser do
|
|
740
789
|
s(:call, nil, :bar)))
|
741
790
|
end
|
742
791
|
|
743
|
-
it
|
744
|
-
|
792
|
+
it 'works with ||=' do
|
793
|
+
'foo ||= bar'.
|
745
794
|
must_be_parsed_as s(:op_asgn_or,
|
746
795
|
s(:lvar, :foo),
|
747
796
|
s(:lasgn, :foo,
|
748
797
|
s(:call, nil, :bar)))
|
749
798
|
end
|
750
799
|
|
751
|
-
it
|
752
|
-
|
800
|
+
it 'works when assigning to an instance variable' do
|
801
|
+
'@foo += bar'.
|
753
802
|
must_be_parsed_as s(:iasgn,
|
754
803
|
:@foo,
|
755
804
|
s(:call,
|
@@ -758,8 +807,8 @@ describe RipperRubyParser::Parser do
|
|
758
807
|
s(:call, nil, :bar)))
|
759
808
|
end
|
760
809
|
|
761
|
-
it
|
762
|
-
|
810
|
+
it 'works when assigning to a collection element' do
|
811
|
+
'foo[bar] += baz'.
|
763
812
|
must_be_parsed_as s(:op_asgn1,
|
764
813
|
s(:call, nil, :foo),
|
765
814
|
s(:arglist, s(:call, nil, :bar)),
|
@@ -767,8 +816,8 @@ describe RipperRubyParser::Parser do
|
|
767
816
|
s(:call, nil, :baz))
|
768
817
|
end
|
769
818
|
|
770
|
-
it
|
771
|
-
|
819
|
+
it 'works with ||= when assigning to a collection element' do
|
820
|
+
'foo[bar] ||= baz'.
|
772
821
|
must_be_parsed_as s(:op_asgn1,
|
773
822
|
s(:call, nil, :foo),
|
774
823
|
s(:arglist, s(:call, nil, :bar)),
|
@@ -776,8 +825,8 @@ describe RipperRubyParser::Parser do
|
|
776
825
|
s(:call, nil, :baz))
|
777
826
|
end
|
778
827
|
|
779
|
-
it
|
780
|
-
|
828
|
+
it 'works when assigning to an attribute' do
|
829
|
+
'foo.bar += baz'.
|
781
830
|
must_be_parsed_as s(:op_asgn2,
|
782
831
|
s(:call, nil, :foo),
|
783
832
|
:bar=,
|
@@ -785,8 +834,8 @@ describe RipperRubyParser::Parser do
|
|
785
834
|
s(:call, nil, :baz))
|
786
835
|
end
|
787
836
|
|
788
|
-
it
|
789
|
-
|
837
|
+
it 'works with ||= when assigning to an attribute' do
|
838
|
+
'foo.bar ||= baz'.
|
790
839
|
must_be_parsed_as s(:op_asgn2,
|
791
840
|
s(:call, nil, :foo),
|
792
841
|
:bar=,
|
@@ -795,9 +844,9 @@ describe RipperRubyParser::Parser do
|
|
795
844
|
end
|
796
845
|
end
|
797
846
|
|
798
|
-
describe
|
799
|
-
it
|
800
|
-
|
847
|
+
describe 'for multiple assignment' do
|
848
|
+
it 'works the same number of items on each side' do
|
849
|
+
'foo, bar = baz, qux'.
|
801
850
|
must_be_parsed_as s(:masgn,
|
802
851
|
s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
|
803
852
|
s(:array,
|
@@ -805,16 +854,16 @@ describe RipperRubyParser::Parser do
|
|
805
854
|
s(:call, nil, :qux)))
|
806
855
|
end
|
807
856
|
|
808
|
-
it
|
809
|
-
|
857
|
+
it 'works with a single item on the right-hand side' do
|
858
|
+
'foo, bar = baz'.
|
810
859
|
must_be_parsed_as s(:masgn,
|
811
860
|
s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
|
812
861
|
s(:to_ary,
|
813
862
|
s(:call, nil, :baz)))
|
814
863
|
end
|
815
864
|
|
816
|
-
it
|
817
|
-
|
865
|
+
it 'works with left-hand splat' do
|
866
|
+
'foo, *bar = baz, qux'.
|
818
867
|
must_be_parsed_as s(:masgn,
|
819
868
|
s(:array, s(:lasgn, :foo), s(:splat, s(:lasgn, :bar))),
|
820
869
|
s(:array,
|
@@ -822,15 +871,15 @@ describe RipperRubyParser::Parser do
|
|
822
871
|
s(:call, nil, :qux)))
|
823
872
|
end
|
824
873
|
|
825
|
-
it
|
826
|
-
|
874
|
+
it 'works with brackets around the left-hand side' do
|
875
|
+
'(foo, bar) = baz'.
|
827
876
|
must_be_parsed_as s(:masgn,
|
828
877
|
s(:array, s(:lasgn, :foo), s(:lasgn, :bar)),
|
829
878
|
s(:to_ary, s(:call, nil, :baz)))
|
830
879
|
end
|
831
880
|
|
832
|
-
it
|
833
|
-
|
881
|
+
it 'works with complex destructuring' do
|
882
|
+
'foo, (bar, baz) = qux'.
|
834
883
|
must_be_parsed_as s(:masgn,
|
835
884
|
s(:array,
|
836
885
|
s(:lasgn, :foo),
|
@@ -839,8 +888,8 @@ describe RipperRubyParser::Parser do
|
|
839
888
|
s(:to_ary, s(:call, nil, :qux)))
|
840
889
|
end
|
841
890
|
|
842
|
-
it
|
843
|
-
|
891
|
+
it 'works with complex destructuring of the value' do
|
892
|
+
'foo, (bar, baz) = [qux, [quz, quuz]]'.
|
844
893
|
must_be_parsed_as s(:masgn,
|
845
894
|
s(:array,
|
846
895
|
s(:lasgn, :foo),
|
@@ -851,22 +900,22 @@ describe RipperRubyParser::Parser do
|
|
851
900
|
s(:array, s(:call, nil, :quz), s(:call, nil, :quuz)))))
|
852
901
|
end
|
853
902
|
|
854
|
-
it
|
855
|
-
|
903
|
+
it 'works with instance variables' do
|
904
|
+
'@foo, @bar = baz'.
|
856
905
|
must_be_parsed_as s(:masgn,
|
857
906
|
s(:array, s(:iasgn, :@foo), s(:iasgn, :@bar)),
|
858
907
|
s(:to_ary, s(:call, nil, :baz)))
|
859
908
|
end
|
860
909
|
|
861
|
-
it
|
862
|
-
|
910
|
+
it 'works with class variables' do
|
911
|
+
'@@foo, @@bar = baz'.
|
863
912
|
must_be_parsed_as s(:masgn,
|
864
913
|
s(:array, s(:cvdecl, :@@foo), s(:cvdecl, :@@bar)),
|
865
914
|
s(:to_ary, s(:call, nil, :baz)))
|
866
915
|
end
|
867
916
|
|
868
|
-
it
|
869
|
-
|
917
|
+
it 'works with attributes' do
|
918
|
+
'foo.bar, foo.baz = qux'.
|
870
919
|
must_be_parsed_as s(:masgn,
|
871
920
|
s(:array,
|
872
921
|
s(:attrasgn, s(:call, nil, :foo), :bar=),
|
@@ -874,8 +923,8 @@ describe RipperRubyParser::Parser do
|
|
874
923
|
s(:to_ary, s(:call, nil, :qux)))
|
875
924
|
end
|
876
925
|
|
877
|
-
it
|
878
|
-
|
926
|
+
it 'works with collection elements' do
|
927
|
+
'foo[1], bar[2] = baz'.
|
879
928
|
must_be_parsed_as s(:masgn,
|
880
929
|
s(:array,
|
881
930
|
s(:attrasgn,
|
@@ -885,15 +934,15 @@ describe RipperRubyParser::Parser do
|
|
885
934
|
s(:to_ary, s(:call, nil, :baz)))
|
886
935
|
end
|
887
936
|
|
888
|
-
it
|
889
|
-
|
937
|
+
it 'works with constants' do
|
938
|
+
'Foo, Bar = baz'.
|
890
939
|
must_be_parsed_as s(:masgn,
|
891
940
|
s(:array, s(:cdecl, :Foo), s(:cdecl, :Bar)),
|
892
941
|
s(:to_ary, s(:call, nil, :baz)))
|
893
942
|
end
|
894
943
|
|
895
|
-
it
|
896
|
-
|
944
|
+
it 'works with instance variables and splat' do
|
945
|
+
'@foo, *@bar = baz'.
|
897
946
|
must_be_parsed_as s(:masgn,
|
898
947
|
s(:array,
|
899
948
|
s(:iasgn, :@foo),
|
@@ -903,126 +952,102 @@ describe RipperRubyParser::Parser do
|
|
903
952
|
end
|
904
953
|
end
|
905
954
|
|
906
|
-
describe
|
907
|
-
it
|
908
|
-
|
955
|
+
describe 'for operators' do
|
956
|
+
it 'handles :!=' do
|
957
|
+
'foo != bar'.
|
909
958
|
must_be_parsed_as s(:call,
|
910
959
|
s(:call, nil, :foo),
|
911
960
|
:!=,
|
912
961
|
s(:call, nil, :bar))
|
913
962
|
end
|
914
963
|
|
915
|
-
it
|
916
|
-
|
964
|
+
it 'handles :=~ with two non-literals' do
|
965
|
+
'foo =~ bar'.
|
917
966
|
must_be_parsed_as s(:call,
|
918
967
|
s(:call, nil, :foo),
|
919
968
|
:=~,
|
920
969
|
s(:call, nil, :bar))
|
921
970
|
end
|
922
971
|
|
923
|
-
it
|
924
|
-
|
972
|
+
it 'handles :=~ with literal regexp on the left hand side' do
|
973
|
+
'/foo/ =~ bar'.
|
925
974
|
must_be_parsed_as s(:match2,
|
926
975
|
s(:lit, /foo/),
|
927
976
|
s(:call, nil, :bar))
|
928
977
|
end
|
929
978
|
|
930
|
-
it
|
931
|
-
|
979
|
+
it 'handles :=~ with literal regexp on the right hand side' do
|
980
|
+
'foo =~ /bar/'.
|
932
981
|
must_be_parsed_as s(:match3,
|
933
982
|
s(:lit, /bar/),
|
934
983
|
s(:call, nil, :foo))
|
935
984
|
end
|
936
985
|
|
937
|
-
it
|
938
|
-
|
939
|
-
must_be_parsed_as s(:lit, -1)
|
940
|
-
end
|
941
|
-
|
942
|
-
it "handles unary minus with a non-literal" do
|
943
|
-
"-foo".
|
944
|
-
must_be_parsed_as s(:call,
|
945
|
-
s(:call, nil, :foo),
|
946
|
-
:-@)
|
947
|
-
end
|
948
|
-
|
949
|
-
it "handles unary plus with a number literal" do
|
950
|
-
"+ 1".
|
951
|
-
must_be_parsed_as s(:lit, 1)
|
952
|
-
end
|
953
|
-
|
954
|
-
it "handles unary plus with a non-literal" do
|
955
|
-
"+ foo".
|
956
|
-
must_be_parsed_as s(:call,
|
957
|
-
s(:call, nil, :foo),
|
958
|
-
:+@)
|
959
|
-
end
|
960
|
-
|
961
|
-
it "handles unary !" do
|
962
|
-
"!foo".
|
986
|
+
it 'handles unary !' do
|
987
|
+
'!foo'.
|
963
988
|
must_be_parsed_as s(:call, s(:call, nil, :foo), :!)
|
964
989
|
end
|
965
990
|
|
966
|
-
it
|
967
|
-
|
991
|
+
it 'converts :not to :!' do
|
992
|
+
'not foo'.
|
968
993
|
must_be_parsed_as s(:call, s(:call, nil, :foo), :!)
|
969
994
|
end
|
970
995
|
|
971
|
-
it
|
972
|
-
|
996
|
+
it 'handles unary ! with a number literal' do
|
997
|
+
'!1'.
|
973
998
|
must_be_parsed_as s(:call, s(:lit, 1), :!)
|
974
999
|
end
|
975
1000
|
|
976
|
-
it
|
977
|
-
|
1001
|
+
it 'handles the range operator with positive number literals' do
|
1002
|
+
'1..2'.
|
978
1003
|
must_be_parsed_as s(:lit, 1..2)
|
979
1004
|
end
|
980
1005
|
|
981
|
-
it
|
982
|
-
|
1006
|
+
it 'handles the range operator with negative number literals' do
|
1007
|
+
'-1..-2'.
|
983
1008
|
must_be_parsed_as s(:lit, -1..-2)
|
984
1009
|
end
|
985
1010
|
|
986
|
-
it
|
1011
|
+
it 'handles the range operator with string literals' do
|
987
1012
|
"'a'..'z'".
|
988
1013
|
must_be_parsed_as s(:dot2,
|
989
|
-
s(:str,
|
990
|
-
s(:str,
|
1014
|
+
s(:str, 'a'),
|
1015
|
+
s(:str, 'z'))
|
991
1016
|
end
|
992
1017
|
|
993
|
-
it
|
994
|
-
|
1018
|
+
it 'handles the range operator with non-literals' do
|
1019
|
+
'foo..bar'.
|
995
1020
|
must_be_parsed_as s(:dot2,
|
996
1021
|
s(:call, nil, :foo),
|
997
1022
|
s(:call, nil, :bar))
|
998
1023
|
end
|
999
1024
|
|
1000
|
-
it
|
1001
|
-
|
1025
|
+
it 'handles the exclusive range operator with positive number literals' do
|
1026
|
+
'1...2'.
|
1002
1027
|
must_be_parsed_as s(:lit, 1...2)
|
1003
1028
|
end
|
1004
1029
|
|
1005
|
-
it
|
1006
|
-
|
1030
|
+
it 'handles the exclusive range operator with negative number literals' do
|
1031
|
+
'-1...-2'.
|
1007
1032
|
must_be_parsed_as s(:lit, -1...-2)
|
1008
1033
|
end
|
1009
1034
|
|
1010
|
-
it
|
1035
|
+
it 'handles the exclusive range operator with string literals' do
|
1011
1036
|
"'a'...'z'".
|
1012
1037
|
must_be_parsed_as s(:dot3,
|
1013
|
-
s(:str,
|
1014
|
-
s(:str,
|
1038
|
+
s(:str, 'a'),
|
1039
|
+
s(:str, 'z'))
|
1015
1040
|
end
|
1016
1041
|
|
1017
|
-
it
|
1018
|
-
|
1042
|
+
it 'handles the exclusive range operator with non-literals' do
|
1043
|
+
'foo...bar'.
|
1019
1044
|
must_be_parsed_as s(:dot3,
|
1020
1045
|
s(:call, nil, :foo),
|
1021
1046
|
s(:call, nil, :bar))
|
1022
1047
|
end
|
1023
1048
|
|
1024
|
-
it
|
1025
|
-
|
1049
|
+
it 'handles the ternary operator' do
|
1050
|
+
'foo ? bar : baz'.
|
1026
1051
|
must_be_parsed_as s(:if,
|
1027
1052
|
s(:call, nil, :foo),
|
1028
1053
|
s(:call, nil, :bar),
|
@@ -1030,9 +1055,9 @@ describe RipperRubyParser::Parser do
|
|
1030
1055
|
end
|
1031
1056
|
end
|
1032
1057
|
|
1033
|
-
describe
|
1034
|
-
it
|
1035
|
-
|
1058
|
+
describe 'for expressions' do
|
1059
|
+
it 'handles assignment inside binary operator expressions' do
|
1060
|
+
'foo + (bar = baz)'.
|
1036
1061
|
must_be_parsed_as s(:call,
|
1037
1062
|
s(:call, nil, :foo),
|
1038
1063
|
:+,
|
@@ -1041,8 +1066,8 @@ describe RipperRubyParser::Parser do
|
|
1041
1066
|
s(:call, nil, :baz)))
|
1042
1067
|
end
|
1043
1068
|
|
1044
|
-
it
|
1045
|
-
|
1069
|
+
it 'handles assignment inside unary operator expressions' do
|
1070
|
+
'+(foo = bar)'.
|
1046
1071
|
must_be_parsed_as s(:call,
|
1047
1072
|
s(:lasgn, :foo, s(:call, nil, :bar)),
|
1048
1073
|
:+@)
|
@@ -1051,8 +1076,8 @@ describe RipperRubyParser::Parser do
|
|
1051
1076
|
|
1052
1077
|
# Note: differences in the handling of comments are not caught by Sexp's
|
1053
1078
|
# implementation of equality.
|
1054
|
-
describe
|
1055
|
-
it
|
1079
|
+
describe 'for comments' do
|
1080
|
+
it 'handles method comments' do
|
1056
1081
|
result = parser.parse "# Foo\ndef foo; end"
|
1057
1082
|
result.must_equal s(:defn,
|
1058
1083
|
:foo,
|
@@ -1060,7 +1085,7 @@ describe RipperRubyParser::Parser do
|
|
1060
1085
|
result.comments.must_equal "# Foo\n"
|
1061
1086
|
end
|
1062
1087
|
|
1063
|
-
it
|
1088
|
+
it 'handles comments for methods with explicit receiver' do
|
1064
1089
|
result = parser.parse "# Foo\ndef foo.bar; end"
|
1065
1090
|
result.must_equal s(:defs,
|
1066
1091
|
s(:call, nil, :foo),
|
@@ -1070,7 +1095,7 @@ describe RipperRubyParser::Parser do
|
|
1070
1095
|
result.comments.must_equal "# Foo\n"
|
1071
1096
|
end
|
1072
1097
|
|
1073
|
-
it
|
1098
|
+
it 'matches comments to the correct entity' do
|
1074
1099
|
result = parser.parse "# Foo\nclass Foo\n# Bar\ndef bar\nend\nend"
|
1075
1100
|
result.must_equal s(:class, :Foo, nil,
|
1076
1101
|
s(:defn, :bar,
|
@@ -1081,7 +1106,7 @@ describe RipperRubyParser::Parser do
|
|
1081
1106
|
defn.comments.must_equal "# Bar\n"
|
1082
1107
|
end
|
1083
1108
|
|
1084
|
-
it
|
1109
|
+
it 'combines multi-line comments' do
|
1085
1110
|
result = parser.parse "# Foo\n# Bar\ndef foo; end"
|
1086
1111
|
result.must_equal s(:defn,
|
1087
1112
|
:foo,
|
@@ -1089,7 +1114,7 @@ describe RipperRubyParser::Parser do
|
|
1089
1114
|
result.comments.must_equal "# Foo\n# Bar\n"
|
1090
1115
|
end
|
1091
1116
|
|
1092
|
-
it
|
1117
|
+
it 'drops comments inside method bodies' do
|
1093
1118
|
result = parser.parse <<-END
|
1094
1119
|
# Foo
|
1095
1120
|
class Foo
|
@@ -1114,7 +1139,7 @@ describe RipperRubyParser::Parser do
|
|
1114
1139
|
result[4].comments.must_equal "# bar\n"
|
1115
1140
|
end
|
1116
1141
|
|
1117
|
-
it
|
1142
|
+
it 'handles the use of symbols that are keywords' do
|
1118
1143
|
result = parser.parse "# Foo\ndef bar\n:class\nend"
|
1119
1144
|
result.must_equal s(:defn,
|
1120
1145
|
:bar,
|
@@ -1123,7 +1148,7 @@ describe RipperRubyParser::Parser do
|
|
1123
1148
|
result.comments.must_equal "# Foo\n"
|
1124
1149
|
end
|
1125
1150
|
|
1126
|
-
it
|
1151
|
+
it 'handles use of singleton class inside methods' do
|
1127
1152
|
result = parser.parse "# Foo\ndef bar\nclass << self\nbaz\nend\nend"
|
1128
1153
|
result.must_equal s(:defn,
|
1129
1154
|
:bar,
|
@@ -1136,33 +1161,33 @@ describe RipperRubyParser::Parser do
|
|
1136
1161
|
|
1137
1162
|
# Note: differences in the handling of line numbers are not caught by
|
1138
1163
|
# Sexp's implementation of equality.
|
1139
|
-
describe
|
1140
|
-
it
|
1141
|
-
result = parser.parse
|
1164
|
+
describe 'assigning line numbers' do
|
1165
|
+
it 'works for a plain method call' do
|
1166
|
+
result = parser.parse 'foo'
|
1142
1167
|
result.line.must_equal 1
|
1143
1168
|
end
|
1144
1169
|
|
1145
|
-
it
|
1146
|
-
result = parser.parse
|
1170
|
+
it 'works for a method call with brackets' do
|
1171
|
+
result = parser.parse 'foo()'
|
1147
1172
|
result.line.must_equal 1
|
1148
1173
|
end
|
1149
1174
|
|
1150
|
-
it
|
1151
|
-
result = parser.parse
|
1175
|
+
it 'works for a method call with receiver' do
|
1176
|
+
result = parser.parse 'foo.bar'
|
1152
1177
|
result.line.must_equal 1
|
1153
1178
|
end
|
1154
1179
|
|
1155
|
-
it
|
1156
|
-
result = parser.parse
|
1180
|
+
it 'works for a method call with receiver and arguments' do
|
1181
|
+
result = parser.parse 'foo.bar baz'
|
1157
1182
|
result.line.must_equal 1
|
1158
1183
|
end
|
1159
1184
|
|
1160
|
-
it
|
1161
|
-
result = parser.parse
|
1185
|
+
it 'works for a method call with arguments' do
|
1186
|
+
result = parser.parse 'foo bar'
|
1162
1187
|
result.line.must_equal 1
|
1163
1188
|
end
|
1164
1189
|
|
1165
|
-
it
|
1190
|
+
it 'works for a block with two lines' do
|
1166
1191
|
result = parser.parse "foo\nbar\n"
|
1167
1192
|
result.sexp_type.must_equal :block
|
1168
1193
|
result[1].line.must_equal 1
|
@@ -1170,27 +1195,27 @@ describe RipperRubyParser::Parser do
|
|
1170
1195
|
result.line.must_equal 1
|
1171
1196
|
end
|
1172
1197
|
|
1173
|
-
it
|
1174
|
-
result = parser.parse
|
1198
|
+
it 'works for a constant reference' do
|
1199
|
+
result = parser.parse 'Foo'
|
1175
1200
|
result.line.must_equal 1
|
1176
1201
|
end
|
1177
1202
|
|
1178
|
-
it
|
1179
|
-
result = parser.parse
|
1203
|
+
it 'works for an instance variable' do
|
1204
|
+
result = parser.parse '@foo'
|
1180
1205
|
result.line.must_equal 1
|
1181
1206
|
end
|
1182
1207
|
|
1183
|
-
it
|
1184
|
-
result = parser.parse
|
1208
|
+
it 'works for a global variable' do
|
1209
|
+
result = parser.parse '$foo'
|
1185
1210
|
result.line.must_equal 1
|
1186
1211
|
end
|
1187
1212
|
|
1188
|
-
it
|
1189
|
-
result = parser.parse
|
1213
|
+
it 'works for a class variable' do
|
1214
|
+
result = parser.parse '@@foo'
|
1190
1215
|
result.line.must_equal 1
|
1191
1216
|
end
|
1192
1217
|
|
1193
|
-
it
|
1218
|
+
it 'works for a local variable' do
|
1194
1219
|
result = parser.parse "foo = bar\nfoo\n"
|
1195
1220
|
result.sexp_type.must_equal :block
|
1196
1221
|
result[1].line.must_equal 1
|
@@ -1198,67 +1223,67 @@ describe RipperRubyParser::Parser do
|
|
1198
1223
|
result.line.must_equal 1
|
1199
1224
|
end
|
1200
1225
|
|
1201
|
-
it
|
1202
|
-
result = parser.parse
|
1226
|
+
it 'works for an integer literal' do
|
1227
|
+
result = parser.parse '42'
|
1203
1228
|
result.line.must_equal 1
|
1204
1229
|
end
|
1205
1230
|
|
1206
|
-
it
|
1207
|
-
result = parser.parse
|
1231
|
+
it 'works for a float literal' do
|
1232
|
+
result = parser.parse '3.14'
|
1208
1233
|
result.line.must_equal 1
|
1209
1234
|
end
|
1210
1235
|
|
1211
|
-
it
|
1212
|
-
result = parser.parse
|
1236
|
+
it 'works for a regular expression back reference' do
|
1237
|
+
result = parser.parse '$1'
|
1213
1238
|
result.line.must_equal 1
|
1214
1239
|
end
|
1215
1240
|
|
1216
|
-
it
|
1217
|
-
result = parser.parse
|
1241
|
+
it 'works for self' do
|
1242
|
+
result = parser.parse 'self'
|
1218
1243
|
result.line.must_equal 1
|
1219
1244
|
end
|
1220
1245
|
|
1221
|
-
it
|
1222
|
-
result = parser.parse
|
1246
|
+
it 'works for __FILE__' do
|
1247
|
+
result = parser.parse '__FILE__'
|
1223
1248
|
result.line.must_equal 1
|
1224
1249
|
end
|
1225
1250
|
|
1226
|
-
it
|
1227
|
-
result = parser.parse
|
1251
|
+
it 'works for nil' do
|
1252
|
+
result = parser.parse 'nil'
|
1228
1253
|
result.line.must_equal 1
|
1229
1254
|
end
|
1230
1255
|
|
1231
|
-
it
|
1232
|
-
result = parser.parse
|
1256
|
+
it 'works for a symbol literal' do
|
1257
|
+
result = parser.parse ':foo'
|
1233
1258
|
result.line.must_equal 1
|
1234
1259
|
end
|
1235
1260
|
|
1236
|
-
it
|
1237
|
-
result = parser.parse
|
1261
|
+
it 'works for a class definition' do
|
1262
|
+
result = parser.parse 'class Foo; end'
|
1238
1263
|
result.line.must_equal 1
|
1239
1264
|
end
|
1240
1265
|
|
1241
|
-
it
|
1242
|
-
result = parser.parse
|
1266
|
+
it 'works for a module definition' do
|
1267
|
+
result = parser.parse 'module Foo; end'
|
1243
1268
|
result.line.must_equal 1
|
1244
1269
|
end
|
1245
1270
|
|
1246
|
-
it
|
1247
|
-
result = parser.parse
|
1271
|
+
it 'works for a method definition' do
|
1272
|
+
result = parser.parse 'def foo; end'
|
1248
1273
|
result.line.must_equal 1
|
1249
1274
|
end
|
1250
1275
|
|
1251
|
-
it
|
1252
|
-
result = parser.parse
|
1276
|
+
it 'works for assignment of the empty hash' do
|
1277
|
+
result = parser.parse 'foo = {}'
|
1253
1278
|
result.line.must_equal 1
|
1254
1279
|
end
|
1255
1280
|
|
1256
|
-
it
|
1257
|
-
result = parser.parse
|
1281
|
+
it 'works for multiple assignment of empty hashes' do
|
1282
|
+
result = parser.parse 'foo, bar = {}, {}'
|
1258
1283
|
result.line.must_equal 1
|
1259
1284
|
end
|
1260
1285
|
|
1261
|
-
it
|
1286
|
+
it 'assigns line numbers to nested sexps without their own line numbers' do
|
1262
1287
|
result = parser.parse "foo(bar) do\nnext baz\nend\n"
|
1263
1288
|
result.must_equal s(:iter,
|
1264
1289
|
s(:call, nil, :foo, s(:call, nil, :bar)),
|
@@ -1270,8 +1295,8 @@ describe RipperRubyParser::Parser do
|
|
1270
1295
|
nums.must_equal [1, 2]
|
1271
1296
|
end
|
1272
1297
|
|
1273
|
-
describe
|
1274
|
-
it
|
1298
|
+
describe 'when a line number is passed' do
|
1299
|
+
it 'shifts all line numbers as appropriate' do
|
1275
1300
|
result = parser.parse "foo\nbar\n", '(string)', 3
|
1276
1301
|
result.must_equal s(:block,
|
1277
1302
|
s(:call, nil, :foo),
|