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,958 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "self.method"' do
6
+ ruby = 'self.method'
7
+ ast = {:send=>
8
+ {:@block=>nil,
9
+ :@name=>:method,
10
+ :@line=>1,
11
+ :@privately=>false,
12
+ :@receiver=>{:self=>{:@line=>1}},
13
+ :@check_for_local=>false}}
14
+
15
+ ruby.should parse_as(ast)
16
+ end
17
+
18
+ it 'should correctly parse "1.m(2)"' do
19
+ ruby = '1.m(2)'
20
+ ast = {:sendwitharguments=>
21
+ {:@block=>nil,
22
+ :@name=>:m,
23
+ :@line=>1,
24
+ :@privately=>false,
25
+ :@receiver=>{:fixnumliteral=>{:@line=>1, :@value=>1}},
26
+ :@check_for_local=>false,
27
+ :@arguments=>
28
+ {:actualarguments=>
29
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>2}}],
30
+ :@splat=>nil,
31
+ :@line=>1}}}}
32
+
33
+ ruby.should parse_as(ast)
34
+ end
35
+
36
+ it 'should correctly parse "h(1, 2, *a)"' do
37
+ ruby = 'h(1, 2, *a)'
38
+ ast = {:sendwitharguments=>
39
+ {:@block=>nil,
40
+ :@name=>:h,
41
+ :@line=>1,
42
+ :@privately=>true,
43
+ :@receiver=>{:self=>{:@line=>1}},
44
+ :@check_for_local=>false,
45
+ :@arguments=>
46
+ {:actualarguments=>
47
+ {:@array=>
48
+ [{:fixnumliteral=>{:@line=>1, :@value=>1}},
49
+ {:fixnumliteral=>{:@line=>1, :@value=>2}}],
50
+ :@splat=>
51
+ {:splatvalue=>
52
+ {:@line=>1,
53
+ :@value=>
54
+ {:send=>
55
+ {:@block=>nil,
56
+ :@name=>:a,
57
+ :@line=>1,
58
+ :@privately=>true,
59
+ :@receiver=>{:self=>{:@line=>1}},
60
+ :@check_for_local=>false}}}},
61
+ :@line=>1}}}}
62
+
63
+ ruby.should parse_as(ast)
64
+ end
65
+
66
+ it 'should correctly parse "begin ..."' do
67
+ ruby = <<-ruby
68
+ begin
69
+ (1 + 1)
70
+ end
71
+ ruby
72
+ ast = {:begin=>
73
+ {:@rescue=>
74
+ {:sendwitharguments=>
75
+ {:@block=>nil,
76
+ :@name=>:+,
77
+ :@line=>2,
78
+ :@privately=>false,
79
+ :@receiver=>{:fixnumliteral=>{:@line=>2, :@value=>1}},
80
+ :@check_for_local=>false,
81
+ :@arguments=>
82
+ {:actualarguments=>
83
+ {:@array=>[{:fixnumliteral=>{:@line=>2, :@value=>1}}],
84
+ :@splat=>nil,
85
+ :@line=>2}}}},
86
+ :@line=>1}}
87
+
88
+ ruby.should parse_as(ast)
89
+ end
90
+
91
+ it 'should correctly parse "blah(*a)"' do
92
+ ruby = 'blah(*a)'
93
+ ast = {:sendwitharguments=>
94
+ {:@block=>nil,
95
+ :@name=>:blah,
96
+ :@line=>1,
97
+ :@privately=>true,
98
+ :@receiver=>{:self=>{:@line=>1}},
99
+ :@check_for_local=>false,
100
+ :@arguments=>
101
+ {:actualarguments=>
102
+ {:@array=>[],
103
+ :@splat=>
104
+ {:splatvalue=>
105
+ {:@line=>1,
106
+ :@value=>
107
+ {:send=>
108
+ {:@block=>nil,
109
+ :@name=>:a,
110
+ :@line=>1,
111
+ :@privately=>true,
112
+ :@receiver=>{:self=>{:@line=>1}},
113
+ :@check_for_local=>false}}}},
114
+ :@line=>1}}}}
115
+
116
+ ruby.should parse_as(ast)
117
+ end
118
+
119
+ it 'should correctly parse "a.b(&c)"' do
120
+ ruby = 'a.b(&c)'
121
+ ast = {:send=>
122
+ {:@block=>
123
+ {:blockpass=>
124
+ {:@body=>
125
+ {:send=>
126
+ {:@block=>nil,
127
+ :@name=>:c,
128
+ :@line=>1,
129
+ :@privately=>true,
130
+ :@receiver=>{:self=>{:@line=>1}},
131
+ :@check_for_local=>false}},
132
+ :@line=>1}},
133
+ :@name=>:b,
134
+ :@line=>1,
135
+ :@privately=>false,
136
+ :@receiver=>
137
+ {:send=>
138
+ {:@block=>nil,
139
+ :@name=>:a,
140
+ :@line=>1,
141
+ :@privately=>true,
142
+ :@receiver=>{:self=>{:@line=>1}},
143
+ :@check_for_local=>false}},
144
+ :@check_for_local=>false}}
145
+
146
+ ruby.should parse_as(ast)
147
+ end
148
+
149
+ it 'should correctly parse "a.b(4, &c)"' do
150
+ ruby = 'a.b(4, &c)'
151
+ ast = {:sendwitharguments=>
152
+ {:@block=>
153
+ {:blockpass=>
154
+ {:@body=>
155
+ {:send=>
156
+ {:@block=>nil,
157
+ :@name=>:c,
158
+ :@line=>1,
159
+ :@privately=>true,
160
+ :@receiver=>{:self=>{:@line=>1}},
161
+ :@check_for_local=>false}},
162
+ :@line=>1}},
163
+ :@name=>:b,
164
+ :@line=>1,
165
+ :@privately=>false,
166
+ :@receiver=>
167
+ {:send=>
168
+ {:@block=>nil,
169
+ :@name=>:a,
170
+ :@line=>1,
171
+ :@privately=>true,
172
+ :@receiver=>{:self=>{:@line=>1}},
173
+ :@check_for_local=>false}},
174
+ :@check_for_local=>false,
175
+ :@arguments=>
176
+ {:actualarguments=>
177
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>4}}],
178
+ :@splat=>nil,
179
+ :@line=>1}}}}
180
+
181
+ ruby.should parse_as(ast)
182
+ end
183
+
184
+ it 'should correctly parse "a.b(1, 2, 3, &c)"' do
185
+ ruby = 'a.b(1, 2, 3, &c)'
186
+ ast = {:sendwitharguments=>
187
+ {:@block=>
188
+ {:blockpass=>
189
+ {:@body=>
190
+ {:send=>
191
+ {:@block=>nil,
192
+ :@name=>:c,
193
+ :@line=>1,
194
+ :@privately=>true,
195
+ :@receiver=>{:self=>{:@line=>1}},
196
+ :@check_for_local=>false}},
197
+ :@line=>1}},
198
+ :@name=>:b,
199
+ :@line=>1,
200
+ :@privately=>false,
201
+ :@receiver=>
202
+ {:send=>
203
+ {:@block=>nil,
204
+ :@name=>:a,
205
+ :@line=>1,
206
+ :@privately=>true,
207
+ :@receiver=>{:self=>{:@line=>1}},
208
+ :@check_for_local=>false}},
209
+ :@check_for_local=>false,
210
+ :@arguments=>
211
+ {:actualarguments=>
212
+ {:@array=>
213
+ [{:fixnumliteral=>{:@line=>1, :@value=>1}},
214
+ {:fixnumliteral=>{:@line=>1, :@value=>2}},
215
+ {:fixnumliteral=>{:@line=>1, :@value=>3}}],
216
+ :@splat=>nil,
217
+ :@line=>1}}}}
218
+
219
+ ruby.should parse_as(ast)
220
+ end
221
+
222
+ it 'should correctly parse "a(&b)"' do
223
+ ruby = 'a(&b)'
224
+ ast = {:send=>
225
+ {:@block=>
226
+ {:blockpass=>
227
+ {:@body=>
228
+ {:send=>
229
+ {:@block=>nil,
230
+ :@name=>:b,
231
+ :@line=>1,
232
+ :@privately=>true,
233
+ :@receiver=>{:self=>{:@line=>1}},
234
+ :@check_for_local=>false}},
235
+ :@line=>1}},
236
+ :@name=>:a,
237
+ :@line=>1,
238
+ :@privately=>true,
239
+ :@receiver=>{:self=>{:@line=>1}},
240
+ :@check_for_local=>false}}
241
+
242
+ ruby.should parse_as(ast)
243
+ end
244
+
245
+ it 'should correctly parse "a(4, &b)"' do
246
+ ruby = 'a(4, &b)'
247
+ ast = {:sendwitharguments=>
248
+ {:@block=>
249
+ {:blockpass=>
250
+ {:@body=>
251
+ {:send=>
252
+ {:@block=>nil,
253
+ :@name=>:b,
254
+ :@line=>1,
255
+ :@privately=>true,
256
+ :@receiver=>{:self=>{:@line=>1}},
257
+ :@check_for_local=>false}},
258
+ :@line=>1}},
259
+ :@name=>:a,
260
+ :@line=>1,
261
+ :@privately=>true,
262
+ :@receiver=>{:self=>{:@line=>1}},
263
+ :@check_for_local=>false,
264
+ :@arguments=>
265
+ {:actualarguments=>
266
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>4}}],
267
+ :@splat=>nil,
268
+ :@line=>1}}}}
269
+
270
+ ruby.should parse_as(ast)
271
+ end
272
+
273
+ it 'should correctly parse "a(1, 2, 3, &b)"' do
274
+ ruby = 'a(1, 2, 3, &b)'
275
+ ast = {:sendwitharguments=>
276
+ {:@block=>
277
+ {:blockpass=>
278
+ {:@body=>
279
+ {:send=>
280
+ {:@block=>nil,
281
+ :@name=>:b,
282
+ :@line=>1,
283
+ :@privately=>true,
284
+ :@receiver=>{:self=>{:@line=>1}},
285
+ :@check_for_local=>false}},
286
+ :@line=>1}},
287
+ :@name=>:a,
288
+ :@line=>1,
289
+ :@privately=>true,
290
+ :@receiver=>{:self=>{:@line=>1}},
291
+ :@check_for_local=>false,
292
+ :@arguments=>
293
+ {:actualarguments=>
294
+ {:@array=>
295
+ [{:fixnumliteral=>{:@line=>1, :@value=>1}},
296
+ {:fixnumliteral=>{:@line=>1, :@value=>2}},
297
+ {:fixnumliteral=>{:@line=>1, :@value=>3}}],
298
+ :@splat=>nil,
299
+ :@line=>1}}}}
300
+
301
+ ruby.should parse_as(ast)
302
+ end
303
+
304
+ it 'should correctly parse "define_attr_method(:x, :sequence_name, &Proc.new { |*args| nil })"' do
305
+ ruby = 'define_attr_method(:x, :sequence_name, &Proc.new { |*args| nil })'
306
+ ast = {:sendwitharguments=>
307
+ {:@block=>
308
+ {:blockpass=>
309
+ {:@body=>
310
+ {:send=>
311
+ {:@block=>
312
+ {:iter=>
313
+ {:@body=>{},
314
+ :@line=>1,
315
+ :@arguments=>
316
+ {:iterarguments=>
317
+ {:@block=>nil,
318
+ :@arity=>-1,
319
+ :@prelude=>:splat,
320
+ :@optional=>1,
321
+ :@splat=>
322
+ {:localvariableassignment=>
323
+ {:@variable=>nil,
324
+ :@name=>:args,
325
+ :@line=>1,
326
+ :@value=>nil}},
327
+ :@line=>1,
328
+ :@splat_index=>-1,
329
+ :@required_args=>0,
330
+ :@arguments=>
331
+ {:masgn=>
332
+ {:@block=>nil,
333
+ :@iter_arguments=>true,
334
+ :@fixed=>false,
335
+ :@splat=>
336
+ {:localvariableassignment=>
337
+ {:@variable=>nil,
338
+ :@name=>:args,
339
+ :@line=>1,
340
+ :@value=>nil}},
341
+ :@line=>1,
342
+ :@left=>nil,
343
+ :@right=>nil}}}}}},
344
+ :@name=>:new,
345
+ :@line=>1,
346
+ :@privately=>false,
347
+ :@receiver=>{:constfind=>{:@name=>:Proc, :@line=>1}},
348
+ :@check_for_local=>false}},
349
+ :@line=>1}},
350
+ :@name=>:define_attr_method,
351
+ :@line=>1,
352
+ :@privately=>true,
353
+ :@receiver=>{:self=>{:@line=>1}},
354
+ :@check_for_local=>false,
355
+ :@arguments=>
356
+ {:actualarguments=>
357
+ {:@array=>
358
+ [{:symbolliteral=>{:@line=>1, :@value=>:x}},
359
+ {:symbolliteral=>{:@line=>1, :@value=>:sequence_name}}],
360
+ :@splat=>nil,
361
+ :@line=>1}}}}
362
+
363
+ ruby.should parse_as(ast)
364
+ end
365
+
366
+ it 'should correctly parse "r.read_body(dest, &block)"' do
367
+ ruby = 'r.read_body(dest, &block)'
368
+ ast = {:sendwitharguments=>
369
+ {:@block=>
370
+ {:blockpass=>
371
+ {:@body=>
372
+ {:send=>
373
+ {:@block=>nil,
374
+ :@name=>:block,
375
+ :@line=>1,
376
+ :@privately=>true,
377
+ :@receiver=>{:self=>{:@line=>1}},
378
+ :@check_for_local=>false}},
379
+ :@line=>1}},
380
+ :@name=>:read_body,
381
+ :@line=>1,
382
+ :@privately=>false,
383
+ :@receiver=>
384
+ {:send=>
385
+ {:@block=>nil,
386
+ :@name=>:r,
387
+ :@line=>1,
388
+ :@privately=>true,
389
+ :@receiver=>{:self=>{:@line=>1}},
390
+ :@check_for_local=>false}},
391
+ :@check_for_local=>false,
392
+ :@arguments=>
393
+ {:actualarguments=>
394
+ {:@array=>
395
+ [{:send=>
396
+ {:@block=>nil,
397
+ :@name=>:dest,
398
+ :@line=>1,
399
+ :@privately=>true,
400
+ :@receiver=>{:self=>{:@line=>1}},
401
+ :@check_for_local=>false}}],
402
+ :@splat=>nil,
403
+ :@line=>1}}}}
404
+
405
+ ruby.should parse_as(ast)
406
+ end
407
+
408
+ it 'should correctly parse "o.m(:a => 1, :b => 2)"' do
409
+ ruby = 'o.m(:a => 1, :b => 2)'
410
+ ast = {:sendwitharguments=>
411
+ {:@block=>nil,
412
+ :@name=>:m,
413
+ :@line=>1,
414
+ :@privately=>false,
415
+ :@receiver=>
416
+ {:send=>
417
+ {:@block=>nil,
418
+ :@name=>:o,
419
+ :@line=>1,
420
+ :@privately=>true,
421
+ :@receiver=>{:self=>{:@line=>1}},
422
+ :@check_for_local=>false}},
423
+ :@check_for_local=>false,
424
+ :@arguments=>
425
+ {:actualarguments=>
426
+ {:@array=>
427
+ [{:hashliteral=>
428
+ {:@array=>
429
+ [{:symbolliteral=>{:@line=>1, :@value=>:a}},
430
+ {:fixnumliteral=>{:@line=>1, :@value=>1}},
431
+ {:symbolliteral=>{:@line=>1, :@value=>:b}},
432
+ {:fixnumliteral=>{:@line=>1, :@value=>2}}],
433
+ :@line=>1}}],
434
+ :@splat=>nil,
435
+ :@line=>1}}}}
436
+
437
+ ruby.should parse_as(ast)
438
+ end
439
+
440
+ it 'should correctly parse "o.m(42, :a => 1, :b => 2)"' do
441
+ ruby = 'o.m(42, :a => 1, :b => 2)'
442
+ ast = {:sendwitharguments=>
443
+ {:@block=>nil,
444
+ :@name=>:m,
445
+ :@line=>1,
446
+ :@privately=>false,
447
+ :@receiver=>
448
+ {:send=>
449
+ {:@block=>nil,
450
+ :@name=>:o,
451
+ :@line=>1,
452
+ :@privately=>true,
453
+ :@receiver=>{:self=>{:@line=>1}},
454
+ :@check_for_local=>false}},
455
+ :@check_for_local=>false,
456
+ :@arguments=>
457
+ {:actualarguments=>
458
+ {:@array=>
459
+ [{:fixnumliteral=>{:@line=>1, :@value=>42}},
460
+ {:hashliteral=>
461
+ {:@array=>
462
+ [{:symbolliteral=>{:@line=>1, :@value=>:a}},
463
+ {:fixnumliteral=>{:@line=>1, :@value=>1}},
464
+ {:symbolliteral=>{:@line=>1, :@value=>:b}},
465
+ {:fixnumliteral=>{:@line=>1, :@value=>2}}],
466
+ :@line=>1}}],
467
+ :@splat=>nil,
468
+ :@line=>1}}}}
469
+
470
+ ruby.should parse_as(ast)
471
+ end
472
+
473
+ it 'should correctly parse "o.m(42, :a => 1, :b => 2, *c)"' do
474
+ ruby = 'o.m(42, :a => 1, :b => 2, *c)'
475
+ ast = {:sendwitharguments=>
476
+ {:@block=>nil,
477
+ :@name=>:m,
478
+ :@line=>1,
479
+ :@privately=>false,
480
+ :@receiver=>
481
+ {:send=>
482
+ {:@block=>nil,
483
+ :@name=>:o,
484
+ :@line=>1,
485
+ :@privately=>true,
486
+ :@receiver=>{:self=>{:@line=>1}},
487
+ :@check_for_local=>false}},
488
+ :@check_for_local=>false,
489
+ :@arguments=>
490
+ {:actualarguments=>
491
+ {:@array=>
492
+ [{:fixnumliteral=>{:@line=>1, :@value=>42}},
493
+ {:hashliteral=>
494
+ {:@array=>
495
+ [{:symbolliteral=>{:@line=>1, :@value=>:a}},
496
+ {:fixnumliteral=>{:@line=>1, :@value=>1}},
497
+ {:symbolliteral=>{:@line=>1, :@value=>:b}},
498
+ {:fixnumliteral=>{:@line=>1, :@value=>2}}],
499
+ :@line=>1}}],
500
+ :@splat=>
501
+ {:splatvalue=>
502
+ {:@line=>1,
503
+ :@value=>
504
+ {:send=>
505
+ {:@block=>nil,
506
+ :@name=>:c,
507
+ :@line=>1,
508
+ :@privately=>true,
509
+ :@receiver=>{:self=>{:@line=>1}},
510
+ :@check_for_local=>false}}}},
511
+ :@line=>1}}}}
512
+
513
+ ruby.should parse_as(ast)
514
+ end
515
+
516
+ it 'should correctly parse "a (1,2,3)"' do
517
+ ruby = 'a (1,2,3)'
518
+ ast = {:sendwitharguments=>
519
+ {:@block=>nil,
520
+ :@name=>:a,
521
+ :@line=>1,
522
+ :@privately=>true,
523
+ :@receiver=>{:self=>{:@line=>1}},
524
+ :@check_for_local=>false,
525
+ :@arguments=>
526
+ {:actualarguments=>
527
+ {:@array=>
528
+ [{:fixnumliteral=>{:@line=>1, :@value=>1}},
529
+ {:fixnumliteral=>{:@line=>1, :@value=>2}},
530
+ {:fixnumliteral=>{:@line=>1, :@value=>3}}],
531
+ :@splat=>nil,
532
+ :@line=>1}}}}
533
+
534
+ ruby.should parse_as(ast)
535
+ end
536
+
537
+ it 'should correctly parse "o.puts(42)"' do
538
+ ruby = 'o.puts(42)'
539
+ ast = {:sendwitharguments=>
540
+ {:@block=>nil,
541
+ :@name=>:puts,
542
+ :@line=>1,
543
+ :@privately=>false,
544
+ :@receiver=>
545
+ {:send=>
546
+ {:@block=>nil,
547
+ :@name=>:o,
548
+ :@line=>1,
549
+ :@privately=>true,
550
+ :@receiver=>{:self=>{:@line=>1}},
551
+ :@check_for_local=>false}},
552
+ :@check_for_local=>false,
553
+ :@arguments=>
554
+ {:actualarguments=>
555
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>42}}],
556
+ :@splat=>nil,
557
+ :@line=>1}}}}
558
+
559
+ ruby.should parse_as(ast)
560
+ end
561
+
562
+ it 'should correctly parse "1.b(c)"' do
563
+ ruby = '1.b(c)'
564
+ ast = {:sendwitharguments=>
565
+ {:@block=>nil,
566
+ :@name=>:b,
567
+ :@line=>1,
568
+ :@privately=>false,
569
+ :@receiver=>{:fixnumliteral=>{:@line=>1, :@value=>1}},
570
+ :@check_for_local=>false,
571
+ :@arguments=>
572
+ {:actualarguments=>
573
+ {:@array=>
574
+ [{:send=>
575
+ {:@block=>nil,
576
+ :@name=>:c,
577
+ :@line=>1,
578
+ :@privately=>true,
579
+ :@receiver=>{:self=>{:@line=>1}},
580
+ :@check_for_local=>false}}],
581
+ :@splat=>nil,
582
+ :@line=>1}}}}
583
+
584
+ ruby.should parse_as(ast)
585
+ end
586
+
587
+ it 'should correctly parse "(v = (1 + 1)).zero?"' do
588
+ ruby = '(v = (1 + 1)).zero?'
589
+ ast = {:send=>
590
+ {:@block=>nil,
591
+ :@name=>:zero?,
592
+ :@line=>1,
593
+ :@privately=>false,
594
+ :@receiver=>
595
+ {:localvariableassignment=>
596
+ {:@variable=>nil,
597
+ :@name=>:v,
598
+ :@line=>1,
599
+ :@value=>
600
+ {:sendwitharguments=>
601
+ {:@block=>nil,
602
+ :@name=>:+,
603
+ :@line=>1,
604
+ :@privately=>false,
605
+ :@receiver=>{:fixnumliteral=>{:@line=>1, :@value=>1}},
606
+ :@check_for_local=>false,
607
+ :@arguments=>
608
+ {:actualarguments=>
609
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
610
+ :@splat=>nil,
611
+ :@line=>1}}}}}},
612
+ :@check_for_local=>false}}
613
+
614
+ ruby.should parse_as(ast)
615
+ end
616
+
617
+ it 'should correctly parse "-2**31"' do
618
+ ruby = '-2**31'
619
+ ast = {:send=>
620
+ {:@block=>nil,
621
+ :@name=>:-@,
622
+ :@line=>1,
623
+ :@privately=>false,
624
+ :@receiver=>
625
+ {:sendwitharguments=>
626
+ {:@block=>nil,
627
+ :@name=>:**,
628
+ :@line=>1,
629
+ :@privately=>false,
630
+ :@receiver=>{:fixnumliteral=>{:@line=>1, :@value=>2}},
631
+ :@check_for_local=>false,
632
+ :@arguments=>
633
+ {:actualarguments=>
634
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>31}}],
635
+ :@splat=>nil,
636
+ :@line=>1}}}},
637
+ :@check_for_local=>false}}
638
+
639
+ ruby.should parse_as(ast)
640
+ end
641
+
642
+ it 'should correctly parse "a[]"' do
643
+ ruby = 'a[]'
644
+ ast = {:send=>
645
+ {:@block=>nil,
646
+ :@name=>:[],
647
+ :@line=>1,
648
+ :@privately=>false,
649
+ :@receiver=>
650
+ {:send=>
651
+ {:@block=>nil,
652
+ :@name=>:a,
653
+ :@line=>1,
654
+ :@privately=>true,
655
+ :@receiver=>{:self=>{:@line=>1}},
656
+ :@check_for_local=>false}},
657
+ :@check_for_local=>false}}
658
+
659
+ ruby.should parse_as(ast)
660
+ end
661
+
662
+ it 'should correctly parse "m(:a => 1, :b => 2)"' do
663
+ ruby = 'm(:a => 1, :b => 2)'
664
+ ast = {:sendwitharguments=>
665
+ {:@block=>nil,
666
+ :@name=>:m,
667
+ :@line=>1,
668
+ :@privately=>true,
669
+ :@receiver=>{:self=>{:@line=>1}},
670
+ :@check_for_local=>false,
671
+ :@arguments=>
672
+ {:actualarguments=>
673
+ {:@array=>
674
+ [{:hashliteral=>
675
+ {:@array=>
676
+ [{:symbolliteral=>{:@line=>1, :@value=>:a}},
677
+ {:fixnumliteral=>{:@line=>1, :@value=>1}},
678
+ {:symbolliteral=>{:@line=>1, :@value=>:b}},
679
+ {:fixnumliteral=>{:@line=>1, :@value=>2}}],
680
+ :@line=>1}}],
681
+ :@splat=>nil,
682
+ :@line=>1}}}}
683
+
684
+ ruby.should parse_as(ast)
685
+ end
686
+
687
+ it 'should correctly parse "m(42, :a => 1, :b => 2)"' do
688
+ ruby = 'm(42, :a => 1, :b => 2)'
689
+ ast = {:sendwitharguments=>
690
+ {:@block=>nil,
691
+ :@name=>:m,
692
+ :@line=>1,
693
+ :@privately=>true,
694
+ :@receiver=>{:self=>{:@line=>1}},
695
+ :@check_for_local=>false,
696
+ :@arguments=>
697
+ {:actualarguments=>
698
+ {:@array=>
699
+ [{:fixnumliteral=>{:@line=>1, :@value=>42}},
700
+ {:hashliteral=>
701
+ {:@array=>
702
+ [{:symbolliteral=>{:@line=>1, :@value=>:a}},
703
+ {:fixnumliteral=>{:@line=>1, :@value=>1}},
704
+ {:symbolliteral=>{:@line=>1, :@value=>:b}},
705
+ {:fixnumliteral=>{:@line=>1, :@value=>2}}],
706
+ :@line=>1}}],
707
+ :@splat=>nil,
708
+ :@line=>1}}}}
709
+
710
+ ruby.should parse_as(ast)
711
+ end
712
+
713
+ it 'should correctly parse "m(42, :a => 1, :b => 2, *c)"' do
714
+ ruby = 'm(42, :a => 1, :b => 2, *c)'
715
+ ast = {:sendwitharguments=>
716
+ {:@block=>nil,
717
+ :@name=>:m,
718
+ :@line=>1,
719
+ :@privately=>true,
720
+ :@receiver=>{:self=>{:@line=>1}},
721
+ :@check_for_local=>false,
722
+ :@arguments=>
723
+ {:actualarguments=>
724
+ {:@array=>
725
+ [{:fixnumliteral=>{:@line=>1, :@value=>42}},
726
+ {:hashliteral=>
727
+ {:@array=>
728
+ [{:symbolliteral=>{:@line=>1, :@value=>:a}},
729
+ {:fixnumliteral=>{:@line=>1, :@value=>1}},
730
+ {:symbolliteral=>{:@line=>1, :@value=>:b}},
731
+ {:fixnumliteral=>{:@line=>1, :@value=>2}}],
732
+ :@line=>1}}],
733
+ :@splat=>
734
+ {:splatvalue=>
735
+ {:@line=>1,
736
+ :@value=>
737
+ {:send=>
738
+ {:@block=>nil,
739
+ :@name=>:c,
740
+ :@line=>1,
741
+ :@privately=>true,
742
+ :@receiver=>{:self=>{:@line=>1}},
743
+ :@check_for_local=>false}}}},
744
+ :@line=>1}}}}
745
+
746
+ ruby.should parse_as(ast)
747
+ end
748
+
749
+ it 'should correctly parse "m(42)"' do
750
+ ruby = 'm(42)'
751
+ ast = {:sendwitharguments=>
752
+ {:@block=>nil,
753
+ :@name=>:m,
754
+ :@line=>1,
755
+ :@privately=>true,
756
+ :@receiver=>{:self=>{:@line=>1}},
757
+ :@check_for_local=>false,
758
+ :@arguments=>
759
+ {:actualarguments=>
760
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>42}}],
761
+ :@splat=>nil,
762
+ :@line=>1}}}}
763
+
764
+ ruby.should parse_as(ast)
765
+ end
766
+
767
+ it 'should correctly parse "a(:b) { :c }"' do
768
+ ruby = 'a(:b) { :c }'
769
+ ast = {:sendwitharguments=>
770
+ {:@block=>
771
+ {:iter=>
772
+ {:@body=>{:symbolliteral=>{:@line=>1, :@value=>:c}},
773
+ :@line=>1,
774
+ :@arguments=>
775
+ {:iterarguments=>
776
+ {:@block=>nil,
777
+ :@arity=>-1,
778
+ :@prelude=>nil,
779
+ :@optional=>0,
780
+ :@splat=>nil,
781
+ :@line=>1,
782
+ :@splat_index=>-2,
783
+ :@required_args=>0}}}},
784
+ :@name=>:a,
785
+ :@line=>1,
786
+ :@privately=>true,
787
+ :@receiver=>{:self=>{:@line=>1}},
788
+ :@check_for_local=>false,
789
+ :@arguments=>
790
+ {:actualarguments=>
791
+ {:@array=>[{:symbolliteral=>{:@line=>1, :@value=>:b}}],
792
+ :@splat=>nil,
793
+ :@line=>1}}}}
794
+
795
+ ruby.should parse_as(ast)
796
+ end
797
+
798
+ it 'should correctly parse "a [42]"' do
799
+ ruby = 'a [42]'
800
+ ast = {:sendwitharguments=>
801
+ {:@block=>nil,
802
+ :@name=>:a,
803
+ :@line=>1,
804
+ :@privately=>true,
805
+ :@receiver=>{:self=>{:@line=>1}},
806
+ :@check_for_local=>false,
807
+ :@arguments=>
808
+ {:actualarguments=>
809
+ {:@array=>
810
+ [{:arrayliteral=>
811
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>42}}], :@line=>1}}],
812
+ :@splat=>nil,
813
+ :@line=>1}}}}
814
+
815
+ ruby.should parse_as(ast)
816
+ end
817
+
818
+ it 'should correctly parse "42 if block_given?"' do
819
+ ruby = '42 if block_given?'
820
+ ast = {:if=>
821
+ {:@body=>{:fixnumliteral=>{:@line=>1, :@value=>42}},
822
+ :@condition=>
823
+ {:send=>
824
+ {:@block=>nil,
825
+ :@name=>:block_given?,
826
+ :@line=>1,
827
+ :@privately=>true,
828
+ :@receiver=>{:self=>{:@line=>1}},
829
+ :@check_for_local=>false}},
830
+ :@else=>{},
831
+ :@line=>1}}
832
+
833
+ ruby.should parse_as(ast)
834
+ end
835
+
836
+ it 'should correctly parse "method"' do
837
+ ruby = 'method'
838
+ ast = {:send=>
839
+ {:@block=>nil,
840
+ :@name=>:method,
841
+ :@line=>1,
842
+ :@privately=>true,
843
+ :@receiver=>{:self=>{:@line=>1}},
844
+ :@check_for_local=>false}}
845
+
846
+ ruby.should parse_as(ast)
847
+ end
848
+
849
+ it 'should correctly parse "begin ... rescue ..."' do
850
+ ruby = <<-ruby
851
+ a << begin
852
+ b
853
+ rescue
854
+ c
855
+ end
856
+ ruby
857
+ ast = {:sendwitharguments=>
858
+ {:@block=>nil,
859
+ :@name=>:<<,
860
+ :@line=>5,
861
+ :@privately=>false,
862
+ :@receiver=>
863
+ {:send=>
864
+ {:@block=>nil,
865
+ :@name=>:a,
866
+ :@line=>1,
867
+ :@privately=>true,
868
+ :@receiver=>{:self=>{:@line=>1}},
869
+ :@check_for_local=>false}},
870
+ :@check_for_local=>false,
871
+ :@arguments=>
872
+ {:actualarguments=>
873
+ {:@array=>
874
+ [{:rescue=>
875
+ {:@body=>
876
+ {:send=>
877
+ {:@block=>nil,
878
+ :@name=>:b,
879
+ :@line=>2,
880
+ :@privately=>true,
881
+ :@receiver=>{:self=>{:@line=>2}},
882
+ :@check_for_local=>false}},
883
+ :@rescue=>
884
+ {:rescuecondition=>
885
+ {:@conditions=>
886
+ {:arrayliteral=>
887
+ {:@body=>
888
+ [{:constfind=>{:@name=>:StandardError, :@line=>4}}],
889
+ :@line=>4}},
890
+ :@body=>
891
+ {:send=>
892
+ {:@block=>nil,
893
+ :@name=>:c,
894
+ :@line=>4,
895
+ :@privately=>true,
896
+ :@receiver=>{:self=>{:@line=>4}},
897
+ :@check_for_local=>false}},
898
+ :@splat=>nil,
899
+ :@next=>nil,
900
+ :@line=>4,
901
+ :@assignment=>nil}},
902
+ :@else=>nil,
903
+ :@line=>2}}],
904
+ :@splat=>nil,
905
+ :@line=>5}}}}
906
+
907
+ ruby.should parse_as(ast)
908
+ end
909
+
910
+ it 'should correctly parse "meth([*[1]])"' do
911
+ ruby = 'meth([*[1]])'
912
+ ast = {:sendwitharguments=>
913
+ {:@block=>nil,
914
+ :@name=>:meth,
915
+ :@line=>1,
916
+ :@privately=>true,
917
+ :@receiver=>{:self=>{:@line=>1}},
918
+ :@check_for_local=>false,
919
+ :@arguments=>
920
+ {:actualarguments=>
921
+ {:@array=>
922
+ [{:splatvalue=>
923
+ {:@line=>1,
924
+ :@value=>
925
+ {:arrayliteral=>
926
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
927
+ :@line=>1}}}}],
928
+ :@splat=>nil,
929
+ :@line=>1}}}}
930
+
931
+ ruby.should parse_as(ast)
932
+ end
933
+
934
+ it 'should correctly parse "meth(*[1])"' do
935
+ ruby = 'meth(*[1])'
936
+ ast = {:sendwitharguments=>
937
+ {:@block=>nil,
938
+ :@name=>:meth,
939
+ :@line=>1,
940
+ :@privately=>true,
941
+ :@receiver=>{:self=>{:@line=>1}},
942
+ :@check_for_local=>false,
943
+ :@arguments=>
944
+ {:actualarguments=>
945
+ {:@array=>[],
946
+ :@splat=>
947
+ {:splatvalue=>
948
+ {:@line=>1,
949
+ :@value=>
950
+ {:arrayliteral=>
951
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
952
+ :@line=>1}}}},
953
+ :@line=>1}}}}
954
+
955
+ ruby.should parse_as(ast)
956
+ end
957
+
958
+ end