melbourne 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. data/HISTORY +3 -0
  2. data/LICENSE +27 -0
  3. data/README.rdoc +38 -0
  4. data/Rakefile +38 -0
  5. data/VERSION.yml +4 -0
  6. data/ext/melbourne/bstring-license.txt +29 -0
  7. data/ext/melbourne/bstrlib.c +2918 -0
  8. data/ext/melbourne/bstrlib.h +302 -0
  9. data/ext/melbourne/extconf.rb +76 -0
  10. data/ext/melbourne/grammar.cpp +11885 -0
  11. data/ext/melbourne/grammar.hpp +14 -0
  12. data/ext/melbourne/grammar.y +6013 -0
  13. data/ext/melbourne/internal.hpp +137 -0
  14. data/ext/melbourne/lex.c.tab +136 -0
  15. data/ext/melbourne/local_state.hpp +41 -0
  16. data/ext/melbourne/melbourne.cpp +37 -0
  17. data/ext/melbourne/node.hpp +262 -0
  18. data/ext/melbourne/node_types.cpp +245 -0
  19. data/ext/melbourne/node_types.hpp +135 -0
  20. data/ext/melbourne/node_types.rb +190 -0
  21. data/ext/melbourne/quark.cpp +52 -0
  22. data/ext/melbourne/quark.hpp +14 -0
  23. data/ext/melbourne/symbols.cpp +219 -0
  24. data/ext/melbourne/symbols.hpp +116 -0
  25. data/ext/melbourne/var_table.cpp +113 -0
  26. data/ext/melbourne/var_table.hpp +33 -0
  27. data/ext/melbourne/visitor.cpp +1052 -0
  28. data/ext/melbourne/visitor.hpp +20 -0
  29. data/lib/melbourne/ast/constants.rb +128 -0
  30. data/lib/melbourne/ast/control_flow.rb +382 -0
  31. data/lib/melbourne/ast/data.rb +19 -0
  32. data/lib/melbourne/ast/definitions.rb +561 -0
  33. data/lib/melbourne/ast/exceptions.rb +182 -0
  34. data/lib/melbourne/ast/file.rb +15 -0
  35. data/lib/melbourne/ast/grapher.rb +75 -0
  36. data/lib/melbourne/ast/literals.rb +268 -0
  37. data/lib/melbourne/ast/node.rb +21 -0
  38. data/lib/melbourne/ast/operators.rb +117 -0
  39. data/lib/melbourne/ast/self.rb +17 -0
  40. data/lib/melbourne/ast/sends.rb +451 -0
  41. data/lib/melbourne/ast/values.rb +74 -0
  42. data/lib/melbourne/ast/variables.rb +251 -0
  43. data/lib/melbourne/ast.rb +22 -0
  44. data/lib/melbourne/parser.rb +38 -0
  45. data/lib/melbourne/processor.rb +460 -0
  46. data/lib/melbourne.rb +46 -0
  47. data/spec/helpers/ast/node.rb +15 -0
  48. data/spec/helpers/ast/reduced_graph.rb +64 -0
  49. data/spec/lib/parser/alias_spec.rb +97 -0
  50. data/spec/lib/parser/and_spec.rb +63 -0
  51. data/spec/lib/parser/array_spec.rb +157 -0
  52. data/spec/lib/parser/attrasgn_spec.rb +401 -0
  53. data/spec/lib/parser/back_ref_spec.rb +20 -0
  54. data/spec/lib/parser/call_spec.rb +958 -0
  55. data/spec/lib/parser/case_spec.rb +577 -0
  56. data/spec/lib/parser/cdecl_spec.rb +108 -0
  57. data/spec/lib/parser/class_spec.rb +221 -0
  58. data/spec/lib/parser/colon2_spec.rb +13 -0
  59. data/spec/lib/parser/colon3_spec.rb +12 -0
  60. data/spec/lib/parser/const_spec.rb +12 -0
  61. data/spec/lib/parser/cvar_spec.rb +55 -0
  62. data/spec/lib/parser/cvasgn_spec.rb +71 -0
  63. data/spec/lib/parser/cvdecl_spec.rb +31 -0
  64. data/spec/lib/parser/defined_spec.rb +353 -0
  65. data/spec/lib/parser/defn_spec.rb +1409 -0
  66. data/spec/lib/parser/defs_spec.rb +247 -0
  67. data/spec/lib/parser/dot2_spec.rb +29 -0
  68. data/spec/lib/parser/dot3_spec.rb +29 -0
  69. data/spec/lib/parser/dregx_spec.rb +127 -0
  70. data/spec/lib/parser/dstr_spec.rb +453 -0
  71. data/spec/lib/parser/dsym_spec.rb +31 -0
  72. data/spec/lib/parser/dxstr_spec.rb +31 -0
  73. data/spec/lib/parser/ensure_spec.rb +279 -0
  74. data/spec/lib/parser/false_spec.rb +12 -0
  75. data/spec/lib/parser/flip2_spec.rb +138 -0
  76. data/spec/lib/parser/flip3_spec.rb +100 -0
  77. data/spec/lib/parser/for_spec.rb +279 -0
  78. data/spec/lib/parser/gasgn_spec.rb +34 -0
  79. data/spec/lib/parser/gvar_spec.rb +33 -0
  80. data/spec/lib/parser/hash_spec.rb +77 -0
  81. data/spec/lib/parser/iasgn_spec.rb +54 -0
  82. data/spec/lib/parser/if_spec.rb +439 -0
  83. data/spec/lib/parser/iter_spec.rb +2582 -0
  84. data/spec/lib/parser/lasgn_spec.rb +1066 -0
  85. data/spec/lib/parser/lit_spec.rb +75 -0
  86. data/spec/lib/parser/masgn_spec.rb +1970 -0
  87. data/spec/lib/parser/match2_spec.rb +47 -0
  88. data/spec/lib/parser/match3_spec.rb +54 -0
  89. data/spec/lib/parser/match_spec.rb +19 -0
  90. data/spec/lib/parser/module_spec.rb +102 -0
  91. data/spec/lib/parser/nil_spec.rb +13 -0
  92. data/spec/lib/parser/not_spec.rb +39 -0
  93. data/spec/lib/parser/nth_ref_spec.rb +12 -0
  94. data/spec/lib/parser/op_asgn_spec.rb +619 -0
  95. data/spec/lib/parser/or_spec.rb +155 -0
  96. data/spec/lib/parser/postexe_spec.rb +31 -0
  97. data/spec/lib/parser/regex_spec.rb +52 -0
  98. data/spec/lib/parser/rescue_spec.rb +1028 -0
  99. data/spec/lib/parser/return_spec.rb +151 -0
  100. data/spec/lib/parser/sclass_spec.rb +172 -0
  101. data/spec/lib/parser/str_spec.rb +162 -0
  102. data/spec/lib/parser/super_spec.rb +276 -0
  103. data/spec/lib/parser/true_spec.rb +12 -0
  104. data/spec/lib/parser/undef_spec.rb +222 -0
  105. data/spec/lib/parser/until_spec.rb +286 -0
  106. data/spec/lib/parser/valias_spec.rb +12 -0
  107. data/spec/lib/parser/while_spec.rb +458 -0
  108. data/spec/lib/parser/xstr_spec.rb +12 -0
  109. data/spec/lib/parser/yield_spec.rb +202 -0
  110. data/spec/lib/parser/zsuper_spec.rb +101 -0
  111. data/spec/matchers/parse_as.rb +27 -0
  112. data/spec/spec_helper.rb +10 -0
  113. metadata +168 -0
@@ -0,0 +1,458 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "while a ..."' do
6
+ ruby = <<-ruby
7
+ while a
8
+ b + 1
9
+ end
10
+ ruby
11
+ ast = {:while=>
12
+ {:@body=>
13
+ {:sendwitharguments=>
14
+ {:@block=>nil,
15
+ :@name=>:+,
16
+ :@line=>2,
17
+ :@privately=>false,
18
+ :@receiver=>
19
+ {:send=>
20
+ {:@block=>nil,
21
+ :@name=>:b,
22
+ :@line=>2,
23
+ :@privately=>true,
24
+ :@receiver=>{:self=>{:@line=>2}},
25
+ :@check_for_local=>false}},
26
+ :@check_for_local=>false,
27
+ :@arguments=>
28
+ {:actualarguments=>
29
+ {:@array=>[{:fixnumliteral=>{:@line=>2, :@value=>1}}],
30
+ :@splat=>nil,
31
+ :@line=>2}}}},
32
+ :@condition=>
33
+ {:send=>
34
+ {:@block=>nil,
35
+ :@name=>:a,
36
+ :@line=>1,
37
+ :@privately=>true,
38
+ :@receiver=>{:self=>{:@line=>1}},
39
+ :@check_for_local=>false}},
40
+ :@line=>1,
41
+ :@check_first=>true}}
42
+
43
+ ruby.should parse_as(ast)
44
+ end
45
+
46
+ it 'should correctly parse "a = x; while a.b ..."' do
47
+ ruby = <<-ruby
48
+ a = x
49
+ while a.b
50
+ 1
51
+ end
52
+ ruby
53
+ ast = {:block=>
54
+ {:@array=>
55
+ [{:localvariableassignment=>
56
+ {:@variable=>nil,
57
+ :@name=>:a,
58
+ :@line=>1,
59
+ :@value=>
60
+ {:send=>
61
+ {:@block=>nil,
62
+ :@name=>:x,
63
+ :@line=>1,
64
+ :@privately=>true,
65
+ :@receiver=>{:self=>{:@line=>1}},
66
+ :@check_for_local=>false}}}},
67
+ {:while=>
68
+ {:@body=>{:fixnumliteral=>{:@line=>3, :@value=>1}},
69
+ :@condition=>
70
+ {:send=>
71
+ {:@block=>nil,
72
+ :@name=>:b,
73
+ :@line=>2,
74
+ :@privately=>false,
75
+ :@receiver=>
76
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>2}},
77
+ :@check_for_local=>false}},
78
+ :@line=>2,
79
+ :@check_first=>true}}],
80
+ :@line=>1}}
81
+
82
+ ruby.should parse_as(ast)
83
+ end
84
+
85
+ it 'should correctly parse "b + 1 while a"' do
86
+ ruby = 'b + 1 while a'
87
+ ast = {:while=>
88
+ {:@body=>
89
+ {:sendwitharguments=>
90
+ {:@block=>nil,
91
+ :@name=>:+,
92
+ :@line=>1,
93
+ :@privately=>false,
94
+ :@receiver=>
95
+ {:send=>
96
+ {:@block=>nil,
97
+ :@name=>:b,
98
+ :@line=>1,
99
+ :@privately=>true,
100
+ :@receiver=>{:self=>{:@line=>1}},
101
+ :@check_for_local=>false}},
102
+ :@check_for_local=>false,
103
+ :@arguments=>
104
+ {:actualarguments=>
105
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
106
+ :@splat=>nil,
107
+ :@line=>1}}}},
108
+ :@condition=>
109
+ {:send=>
110
+ {:@block=>nil,
111
+ :@name=>:a,
112
+ :@line=>1,
113
+ :@privately=>true,
114
+ :@receiver=>{:self=>{:@line=>1}},
115
+ :@check_for_local=>false}},
116
+ :@line=>1,
117
+ :@check_first=>true}}
118
+
119
+ ruby.should parse_as(ast)
120
+ end
121
+
122
+ it 'should correctly parse "until not a ..."' do
123
+ ruby = <<-ruby
124
+ until not a
125
+ b + 1
126
+ end
127
+ ruby
128
+ ast = {:while=>
129
+ {:@body=>
130
+ {:sendwitharguments=>
131
+ {:@block=>nil,
132
+ :@name=>:+,
133
+ :@line=>2,
134
+ :@privately=>false,
135
+ :@receiver=>
136
+ {:send=>
137
+ {:@block=>nil,
138
+ :@name=>:b,
139
+ :@line=>2,
140
+ :@privately=>true,
141
+ :@receiver=>{:self=>{:@line=>2}},
142
+ :@check_for_local=>false}},
143
+ :@check_for_local=>false,
144
+ :@arguments=>
145
+ {:actualarguments=>
146
+ {:@array=>[{:fixnumliteral=>{:@line=>2, :@value=>1}}],
147
+ :@splat=>nil,
148
+ :@line=>2}}}},
149
+ :@condition=>
150
+ {:send=>
151
+ {:@block=>nil,
152
+ :@name=>:a,
153
+ :@line=>1,
154
+ :@privately=>true,
155
+ :@receiver=>{:self=>{:@line=>1}},
156
+ :@check_for_local=>false}},
157
+ :@line=>1,
158
+ :@check_first=>true}}
159
+
160
+ ruby.should parse_as(ast)
161
+ end
162
+
163
+ it 'should correctly parse "b + 1 until not a"' do
164
+ ruby = 'b + 1 until not a'
165
+ ast = {:while=>
166
+ {:@body=>
167
+ {:sendwitharguments=>
168
+ {:@block=>nil,
169
+ :@name=>:+,
170
+ :@line=>1,
171
+ :@privately=>false,
172
+ :@receiver=>
173
+ {:send=>
174
+ {:@block=>nil,
175
+ :@name=>:b,
176
+ :@line=>1,
177
+ :@privately=>true,
178
+ :@receiver=>{:self=>{:@line=>1}},
179
+ :@check_for_local=>false}},
180
+ :@check_for_local=>false,
181
+ :@arguments=>
182
+ {:actualarguments=>
183
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
184
+ :@splat=>nil,
185
+ :@line=>1}}}},
186
+ :@condition=>
187
+ {:send=>
188
+ {:@block=>nil,
189
+ :@name=>:a,
190
+ :@line=>1,
191
+ :@privately=>true,
192
+ :@receiver=>{:self=>{:@line=>1}},
193
+ :@check_for_local=>false}},
194
+ :@line=>1,
195
+ :@check_first=>true}}
196
+
197
+ ruby.should parse_as(ast)
198
+ end
199
+
200
+ it 'should correctly parse "begin ... end while a"' do
201
+ ruby = <<-ruby
202
+ begin
203
+ b + 1
204
+ end while a
205
+ ruby
206
+ ast = {:while=>
207
+ {:@body=>
208
+ {:sendwitharguments=>
209
+ {:@block=>nil,
210
+ :@name=>:+,
211
+ :@line=>2,
212
+ :@privately=>false,
213
+ :@receiver=>
214
+ {:send=>
215
+ {:@block=>nil,
216
+ :@name=>:b,
217
+ :@line=>2,
218
+ :@privately=>true,
219
+ :@receiver=>{:self=>{:@line=>2}},
220
+ :@check_for_local=>false}},
221
+ :@check_for_local=>false,
222
+ :@arguments=>
223
+ {:actualarguments=>
224
+ {:@array=>[{:fixnumliteral=>{:@line=>2, :@value=>1}}],
225
+ :@splat=>nil,
226
+ :@line=>2}}}},
227
+ :@condition=>
228
+ {:send=>
229
+ {:@block=>nil,
230
+ :@name=>:a,
231
+ :@line=>3,
232
+ :@privately=>true,
233
+ :@receiver=>{:self=>{:@line=>3}},
234
+ :@check_for_local=>false}},
235
+ :@line=>3,
236
+ :@check_first=>false}}
237
+
238
+ ruby.should parse_as(ast)
239
+ end
240
+
241
+ it 'should correctly parse "begin ... end until not a"' do
242
+ ruby = <<-ruby
243
+ begin
244
+ b + 1
245
+ end until not a
246
+ ruby
247
+ ast = {:while=>
248
+ {:@body=>
249
+ {:sendwitharguments=>
250
+ {:@block=>nil,
251
+ :@name=>:+,
252
+ :@line=>2,
253
+ :@privately=>false,
254
+ :@receiver=>
255
+ {:send=>
256
+ {:@block=>nil,
257
+ :@name=>:b,
258
+ :@line=>2,
259
+ :@privately=>true,
260
+ :@receiver=>{:self=>{:@line=>2}},
261
+ :@check_for_local=>false}},
262
+ :@check_for_local=>false,
263
+ :@arguments=>
264
+ {:actualarguments=>
265
+ {:@array=>[{:fixnumliteral=>{:@line=>2, :@value=>1}}],
266
+ :@splat=>nil,
267
+ :@line=>2}}}},
268
+ :@condition=>
269
+ {:send=>
270
+ {:@block=>nil,
271
+ :@name=>:a,
272
+ :@line=>3,
273
+ :@privately=>true,
274
+ :@receiver=>{:self=>{:@line=>3}},
275
+ :@check_for_local=>false}},
276
+ :@line=>3,
277
+ :@check_first=>false}}
278
+
279
+ ruby.should parse_as(ast)
280
+ end
281
+
282
+ it 'should correctly parse "while () ..."' do
283
+ ruby = <<-ruby
284
+ while ()
285
+ a
286
+ end
287
+ ruby
288
+ ast = {:while=>
289
+ {:@body=>
290
+ {:send=>
291
+ {:@block=>nil,
292
+ :@name=>:a,
293
+ :@line=>2,
294
+ :@privately=>true,
295
+ :@receiver=>{:self=>{:@line=>2}},
296
+ :@check_for_local=>false}},
297
+ :@condition=>{},
298
+ :@line=>1,
299
+ :@check_first=>true}}
300
+
301
+ ruby.should parse_as(ast)
302
+ end
303
+
304
+ it 'should correctly parse "until not () ..."' do
305
+ ruby = <<-ruby
306
+ until not ()
307
+ a
308
+ end
309
+ ruby
310
+ ast = {:while=>
311
+ {:@body=>
312
+ {:send=>
313
+ {:@block=>nil,
314
+ :@name=>:a,
315
+ :@line=>2,
316
+ :@privately=>true,
317
+ :@receiver=>{:self=>{:@line=>2}},
318
+ :@check_for_local=>false}},
319
+ :@condition=>{},
320
+ :@line=>1,
321
+ :@check_first=>true}}
322
+
323
+ ruby.should parse_as(ast)
324
+ end
325
+
326
+ it 'should correctly parse "a until not ()"' do
327
+ ruby = 'a until not ()'
328
+ ast = {:while=>
329
+ {:@body=>
330
+ {:send=>
331
+ {:@block=>nil,
332
+ :@name=>:a,
333
+ :@line=>1,
334
+ :@privately=>true,
335
+ :@receiver=>{:self=>{:@line=>1}},
336
+ :@check_for_local=>false}},
337
+ :@condition=>{},
338
+ :@line=>1,
339
+ :@check_first=>true}}
340
+
341
+ ruby.should parse_as(ast)
342
+ end
343
+
344
+ it 'should correctly parse "while 1 ... break ..."' do
345
+ ruby = <<-ruby
346
+ while 1
347
+ 2
348
+ break :brk
349
+ end
350
+ ruby
351
+ ast = {:while=>
352
+ {:@body=>
353
+ {:block=>
354
+ {:@array=>
355
+ [{:fixnumliteral=>{:@line=>2, :@value=>2}},
356
+ {:break=>
357
+ {:@line=>3,
358
+ :@value=>{:symbolliteral=>{:@line=>3, :@value=>:brk}}}}],
359
+ :@line=>2}},
360
+ :@condition=>{:fixnumliteral=>{:@line=>1, :@value=>1}},
361
+ :@line=>1,
362
+ :@check_first=>true}}
363
+
364
+ ruby.should parse_as(ast)
365
+ end
366
+
367
+ it 'should correctly parse "while 1 ... begin ... break ... rescue ..."' do
368
+ ruby = <<-ruby
369
+ while 1
370
+ begin
371
+ 2
372
+ break :brk
373
+ rescue
374
+ 3
375
+ end
376
+ end
377
+ ruby
378
+ ast = {:while=>
379
+ {:@body=>
380
+ {:begin=>
381
+ {:@rescue=>
382
+ {:rescue=>
383
+ {:@body=>
384
+ {:block=>
385
+ {:@array=>
386
+ [{:fixnumliteral=>{:@line=>3, :@value=>2}},
387
+ {:break=>
388
+ {:@line=>4,
389
+ :@value=>{:symbolliteral=>{:@line=>4, :@value=>:brk}}}}],
390
+ :@line=>3}},
391
+ :@rescue=>
392
+ {:rescuecondition=>
393
+ {:@conditions=>
394
+ {:arrayliteral=>
395
+ {:@body=>[{:constfind=>{:@name=>:StandardError, :@line=>6}}],
396
+ :@line=>6}},
397
+ :@body=>{:fixnumliteral=>{:@line=>6, :@value=>3}},
398
+ :@splat=>nil,
399
+ :@next=>nil,
400
+ :@line=>6,
401
+ :@assignment=>nil}},
402
+ :@else=>nil,
403
+ :@line=>3}},
404
+ :@line=>2}},
405
+ :@condition=>{:fixnumliteral=>{:@line=>1, :@value=>1}},
406
+ :@line=>1,
407
+ :@check_first=>true}}
408
+
409
+ ruby.should parse_as(ast)
410
+ end
411
+
412
+ it 'should correctly parse "while 1 ... begin ... rescue ... break"' do
413
+ ruby = <<-ruby
414
+ while 1
415
+ begin
416
+ 2
417
+ rescue
418
+ 3
419
+ break :brk
420
+ end
421
+ end
422
+ ruby
423
+ ast = {:while=>
424
+ {:@body=>
425
+ {:begin=>
426
+ {:@rescue=>
427
+ {:rescue=>
428
+ {:@body=>{:fixnumliteral=>{:@line=>3, :@value=>2}},
429
+ :@rescue=>
430
+ {:rescuecondition=>
431
+ {:@conditions=>
432
+ {:arrayliteral=>
433
+ {:@body=>[{:constfind=>{:@name=>:StandardError, :@line=>5}}],
434
+ :@line=>5}},
435
+ :@body=>
436
+ {:block=>
437
+ {:@array=>
438
+ [{:fixnumliteral=>{:@line=>5, :@value=>3}},
439
+ {:break=>
440
+ {:@line=>6,
441
+ :@value=>
442
+ {:symbolliteral=>{:@line=>6, :@value=>:brk}}}}],
443
+ :@line=>5}},
444
+ :@splat=>nil,
445
+ :@next=>nil,
446
+ :@line=>5,
447
+ :@assignment=>nil}},
448
+ :@else=>nil,
449
+ :@line=>3}},
450
+ :@line=>2}},
451
+ :@condition=>{:fixnumliteral=>{:@line=>1, :@value=>1}},
452
+ :@line=>1,
453
+ :@check_first=>true}}
454
+
455
+ ruby.should parse_as(ast)
456
+ end
457
+
458
+ end
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "`touch 5`"' do
6
+ ruby = '`touch 5`'
7
+ ast = {:executestring=>{:@string=>:"touch 5", :@line=>1}}
8
+
9
+ ruby.should parse_as(ast)
10
+ end
11
+
12
+ end
@@ -0,0 +1,202 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "yield(42, 24)"' do
6
+ ruby = 'yield(42, 24)'
7
+ ast = {:yield=>
8
+ {:@argument_count=>2,
9
+ :@yield_splat=>false,
10
+ :@line=>1,
11
+ :@arguments=>
12
+ {:actualarguments=>
13
+ {:@array=>
14
+ [{:fixnumliteral=>{:@line=>1, :@value=>42}},
15
+ {:fixnumliteral=>{:@line=>1, :@value=>24}}],
16
+ :@splat=>nil,
17
+ :@line=>1}}}}
18
+
19
+ ruby.should parse_as(ast)
20
+ end
21
+
22
+ it 'should correctly parse "yield([42, 24])"' do
23
+ ruby = 'yield([42, 24])'
24
+ ast = {:yield=>
25
+ {:@argument_count=>1,
26
+ :@yield_splat=>false,
27
+ :@line=>1,
28
+ :@arguments=>
29
+ {:actualarguments=>
30
+ {:@array=>
31
+ [{:arrayliteral=>
32
+ {:@body=>
33
+ [{:fixnumliteral=>{:@line=>1, :@value=>42}},
34
+ {:fixnumliteral=>{:@line=>1, :@value=>24}}],
35
+ :@line=>1}}],
36
+ :@splat=>nil,
37
+ :@line=>1}}}}
38
+
39
+ ruby.should parse_as(ast)
40
+ end
41
+
42
+ it 'should correctly parse "yield([42])"' do
43
+ ruby = 'yield([42])'
44
+ ast = {:yield=>
45
+ {:@argument_count=>1,
46
+ :@yield_splat=>false,
47
+ :@line=>1,
48
+ :@arguments=>
49
+ {:actualarguments=>
50
+ {:@array=>
51
+ [{:arrayliteral=>
52
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>42}}], :@line=>1}}],
53
+ :@splat=>nil,
54
+ :@line=>1}}}}
55
+
56
+ ruby.should parse_as(ast)
57
+ end
58
+
59
+ it 'should correctly parse "yield([])"' do
60
+ ruby = 'yield([])'
61
+ ast = {:yield=>
62
+ {:@argument_count=>1,
63
+ :@yield_splat=>false,
64
+ :@line=>1,
65
+ :@arguments=>
66
+ {:actualarguments=>
67
+ {:@array=>[{:emptyarray=>{:@line=>1}}], :@splat=>nil, :@line=>1}}}}
68
+
69
+ ruby.should parse_as(ast)
70
+ end
71
+
72
+ it 'should correctly parse "yield(42)"' do
73
+ ruby = 'yield(42)'
74
+ ast = {:yield=>
75
+ {:@argument_count=>1,
76
+ :@yield_splat=>false,
77
+ :@line=>1,
78
+ :@arguments=>
79
+ {:actualarguments=>
80
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>42}}],
81
+ :@splat=>nil,
82
+ :@line=>1}}}}
83
+
84
+ ruby.should parse_as(ast)
85
+ end
86
+
87
+ it 'should correctly parse "yield"' do
88
+ ruby = 'yield'
89
+ ast = {:yield=>
90
+ {:@argument_count=>0,
91
+ :@yield_splat=>false,
92
+ :@line=>1,
93
+ :@arguments=>{:actualarguments=>{:@array=>[], :@splat=>nil, :@line=>1}}}}
94
+
95
+ ruby.should parse_as(ast)
96
+ end
97
+
98
+ it 'should correctly parse "yield([*[]])"' do
99
+ ruby = 'yield([*[]])'
100
+ ast = {:yield=>
101
+ {:@argument_count=>1,
102
+ :@yield_splat=>false,
103
+ :@line=>1,
104
+ :@arguments=>
105
+ {:actualarguments=>
106
+ {:@array=>[],
107
+ :@splat=>
108
+ {:splatvalue=>{:@line=>1, :@value=>{:emptyarray=>{:@line=>1}}}},
109
+ :@line=>1}}}}
110
+
111
+ ruby.should parse_as(ast)
112
+ end
113
+
114
+ it 'should correctly parse "yield([*[1]])"' do
115
+ ruby = 'yield([*[1]])'
116
+ ast = {:yield=>
117
+ {:@argument_count=>1,
118
+ :@yield_splat=>false,
119
+ :@line=>1,
120
+ :@arguments=>
121
+ {:actualarguments=>
122
+ {:@array=>[],
123
+ :@splat=>
124
+ {:splatvalue=>
125
+ {:@line=>1,
126
+ :@value=>
127
+ {:arrayliteral=>
128
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
129
+ :@line=>1}}}},
130
+ :@line=>1}}}}
131
+
132
+ ruby.should parse_as(ast)
133
+ end
134
+
135
+ it 'should correctly parse "yield([*[1, 2]])"' do
136
+ ruby = 'yield([*[1, 2]])'
137
+ ast = {:yield=>
138
+ {:@argument_count=>1,
139
+ :@yield_splat=>false,
140
+ :@line=>1,
141
+ :@arguments=>
142
+ {:actualarguments=>
143
+ {:@array=>[],
144
+ :@splat=>
145
+ {:splatvalue=>
146
+ {:@line=>1,
147
+ :@value=>
148
+ {:arrayliteral=>
149
+ {:@body=>
150
+ [{:fixnumliteral=>{:@line=>1, :@value=>1}},
151
+ {:fixnumliteral=>{:@line=>1, :@value=>2}}],
152
+ :@line=>1}}}},
153
+ :@line=>1}}}}
154
+
155
+ ruby.should parse_as(ast)
156
+ end
157
+
158
+ it 'should correctly parse "yield(*[1])"' do
159
+ ruby = 'yield(*[1])'
160
+ ast = {:yield=>
161
+ {:@argument_count=>0,
162
+ :@yield_splat=>true,
163
+ :@line=>1,
164
+ :@arguments=>
165
+ {:actualarguments=>
166
+ {:@array=>[],
167
+ :@splat=>
168
+ {:splatvalue=>
169
+ {:@line=>1,
170
+ :@value=>
171
+ {:arrayliteral=>
172
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
173
+ :@line=>1}}}},
174
+ :@line=>1}}}}
175
+
176
+ ruby.should parse_as(ast)
177
+ end
178
+
179
+ it 'should correctly parse "yield(*[1, 2])"' do
180
+ ruby = 'yield(*[1, 2])'
181
+ ast = {:yield=>
182
+ {:@argument_count=>0,
183
+ :@yield_splat=>true,
184
+ :@line=>1,
185
+ :@arguments=>
186
+ {:actualarguments=>
187
+ {:@array=>[],
188
+ :@splat=>
189
+ {:splatvalue=>
190
+ {:@line=>1,
191
+ :@value=>
192
+ {:arrayliteral=>
193
+ {:@body=>
194
+ [{:fixnumliteral=>{:@line=>1, :@value=>1}},
195
+ {:fixnumliteral=>{:@line=>1, :@value=>2}}],
196
+ :@line=>1}}}},
197
+ :@line=>1}}}}
198
+
199
+ ruby.should parse_as(ast)
200
+ end
201
+
202
+ end