melbourne 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,1409 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "def ... begin ... end"' do
6
+ ruby = <<-ruby
7
+ def m
8
+ begin
9
+ end
10
+ end
11
+ ruby
12
+ ast = {:define=>
13
+ {:@arguments=>
14
+ {:formalarguments=>
15
+ {:@block_arg=>nil,
16
+ :@names=>[],
17
+ :@defaults=>nil,
18
+ :@optional=>[],
19
+ :@splat=>nil,
20
+ :@line=>1,
21
+ :@required=>[]}},
22
+ :@body=>{:block=>{:@array=>[{}], :@line=>1}},
23
+ :@name=>:m,
24
+ :@line=>1}}
25
+
26
+ ruby.should parse_as(ast)
27
+ end
28
+
29
+ it 'should correctly parse "def ... ensure ..."' do
30
+ ruby = <<-ruby
31
+ def m
32
+ return :a
33
+ ensure
34
+ return :b
35
+ end
36
+ ruby
37
+ ast = {:define=>
38
+ {:@arguments=>
39
+ {:formalarguments=>
40
+ {:@block_arg=>nil,
41
+ :@names=>[],
42
+ :@defaults=>nil,
43
+ :@optional=>[],
44
+ :@splat=>nil,
45
+ :@line=>1,
46
+ :@required=>[]}},
47
+ :@body=>
48
+ {:block=>
49
+ {:@array=>
50
+ [{:ensure=>
51
+ {:@ensure=>
52
+ {:return=>
53
+ {:@splat=>nil,
54
+ :@line=>4,
55
+ :@value=>{:symbolliteral=>{:@line=>4, :@value=>:b}}}},
56
+ :@body=>
57
+ {:return=>
58
+ {:@splat=>nil,
59
+ :@line=>2,
60
+ :@value=>{:symbolliteral=>{:@line=>2, :@value=>:a}}}},
61
+ :@line=>2}}],
62
+ :@line=>1}},
63
+ :@name=>:m,
64
+ :@line=>1}}
65
+
66
+ ruby.should parse_as(ast)
67
+ end
68
+
69
+ it 'should correctly parse "def blah(*args, &block) ..."' do
70
+ ruby = <<-ruby
71
+ def blah(*args, &block)
72
+ other(42, *args, &block)
73
+ end
74
+ ruby
75
+ ast = {:define=>
76
+ {:@body=>
77
+ {:block=>
78
+ {:@array=>
79
+ [{:sendwitharguments=>
80
+ {:@block=>
81
+ {:blockpass=>
82
+ {:@body=>
83
+ {:localvariableaccess=>
84
+ {:@variable=>nil, :@name=>:block, :@line=>2}},
85
+ :@line=>2}},
86
+ :@name=>:other,
87
+ :@line=>2,
88
+ :@privately=>true,
89
+ :@receiver=>{:self=>{:@line=>2}},
90
+ :@check_for_local=>false,
91
+ :@arguments=>
92
+ {:actualarguments=>
93
+ {:@array=>[{:fixnumliteral=>{:@line=>2, :@value=>42}}],
94
+ :@splat=>
95
+ {:splatvalue=>
96
+ {:@line=>2,
97
+ :@value=>
98
+ {:localvariableaccess=>
99
+ {:@variable=>nil, :@name=>:args, :@line=>2}}}},
100
+ :@line=>2}}}}],
101
+ :@line=>1}},
102
+ :@name=>:blah,
103
+ :@line=>1,
104
+ :@arguments=>
105
+ {:formalarguments=>
106
+ {:@block_arg=>{:blockargument=>{:@name=>:block, :@line=>1}},
107
+ :@names=>[:args, :block],
108
+ :@defaults=>nil,
109
+ :@optional=>[],
110
+ :@splat=>:args,
111
+ :@line=>1,
112
+ :@required=>[]}}}}
113
+
114
+ ruby.should parse_as(ast)
115
+ end
116
+
117
+ it 'should correctly parse "def f ... begin ... rescue ... end ... d ..."' do
118
+ ruby = <<-ruby
119
+ def f
120
+ begin
121
+ b
122
+ rescue
123
+ c
124
+ end
125
+ d
126
+ end
127
+ ruby
128
+ ast = {:define=>
129
+ {:@arguments=>
130
+ {:formalarguments=>
131
+ {:@block_arg=>nil,
132
+ :@names=>[],
133
+ :@defaults=>nil,
134
+ :@optional=>[],
135
+ :@splat=>nil,
136
+ :@line=>1,
137
+ :@required=>[]}},
138
+ :@body=>
139
+ {:block=>
140
+ {:@array=>
141
+ [{:begin=>
142
+ {:@rescue=>
143
+ {:rescue=>
144
+ {:@body=>
145
+ {:send=>
146
+ {:@receiver=>{:self=>{:@line=>3}},
147
+ :@check_for_local=>false,
148
+ :@block=>nil,
149
+ :@name=>:b,
150
+ :@line=>3,
151
+ :@privately=>true}},
152
+ :@rescue=>
153
+ {:rescuecondition=>
154
+ {:@assignment=>nil,
155
+ :@conditions=>
156
+ {:arrayliteral=>
157
+ {:@body=>
158
+ [{:constfind=>{:@name=>:StandardError, :@line=>5}}],
159
+ :@line=>5}},
160
+ :@body=>
161
+ {:send=>
162
+ {:@receiver=>{:self=>{:@line=>5}},
163
+ :@check_for_local=>false,
164
+ :@block=>nil,
165
+ :@name=>:c,
166
+ :@line=>5,
167
+ :@privately=>true}},
168
+ :@splat=>nil,
169
+ :@next=>nil,
170
+ :@line=>5}},
171
+ :@else=>nil,
172
+ :@line=>3}},
173
+ :@line=>2}},
174
+ {:send=>
175
+ {:@receiver=>{:self=>{:@line=>7}},
176
+ :@check_for_local=>false,
177
+ :@block=>nil,
178
+ :@name=>:d,
179
+ :@line=>7,
180
+ :@privately=>true}}],
181
+ :@line=>1}},
182
+ :@name=>:f,
183
+ :@line=>1}}
184
+
185
+ ruby.should parse_as(ast)
186
+ end
187
+
188
+ it 'should correctly parse "def f ... a ... begin ... rescue ... end ..."' do
189
+ ruby = <<-ruby
190
+ def f
191
+ a
192
+ begin
193
+ b
194
+ rescue
195
+ c
196
+ end
197
+ end
198
+ ruby
199
+ ast = {:define=>
200
+ {:@arguments=>
201
+ {:formalarguments=>
202
+ {:@block_arg=>nil,
203
+ :@names=>[],
204
+ :@defaults=>nil,
205
+ :@optional=>[],
206
+ :@splat=>nil,
207
+ :@line=>1,
208
+ :@required=>[]}},
209
+ :@body=>
210
+ {:block=>
211
+ {:@array=>
212
+ [{:send=>
213
+ {:@receiver=>{:self=>{:@line=>2}},
214
+ :@check_for_local=>false,
215
+ :@block=>nil,
216
+ :@name=>:a,
217
+ :@line=>2,
218
+ :@privately=>true}},
219
+ {:begin=>
220
+ {:@rescue=>
221
+ {:rescue=>
222
+ {:@body=>
223
+ {:send=>
224
+ {:@receiver=>{:self=>{:@line=>4}},
225
+ :@check_for_local=>false,
226
+ :@block=>nil,
227
+ :@name=>:b,
228
+ :@line=>4,
229
+ :@privately=>true}},
230
+ :@rescue=>
231
+ {:rescuecondition=>
232
+ {:@assignment=>nil,
233
+ :@conditions=>
234
+ {:arrayliteral=>
235
+ {:@body=>
236
+ [{:constfind=>{:@name=>:StandardError, :@line=>6}}],
237
+ :@line=>6}},
238
+ :@body=>
239
+ {:send=>
240
+ {:@receiver=>{:self=>{:@line=>6}},
241
+ :@check_for_local=>false,
242
+ :@block=>nil,
243
+ :@name=>:c,
244
+ :@line=>6,
245
+ :@privately=>true}},
246
+ :@splat=>nil,
247
+ :@next=>nil,
248
+ :@line=>6}},
249
+ :@else=>nil,
250
+ :@line=>4}},
251
+ :@line=>3}}],
252
+ :@line=>1}},
253
+ :@name=>:f,
254
+ :@line=>1}}
255
+
256
+ ruby.should parse_as(ast)
257
+ end
258
+
259
+ it 'should correctly parse "def f ... a begin ... rescue ... end ... d ..."' do
260
+ ruby = <<-ruby
261
+ def f
262
+ a
263
+ begin
264
+ b
265
+ rescue
266
+ c
267
+ end
268
+ d
269
+ end
270
+ ruby
271
+ ast = {:define=>
272
+ {:@arguments=>
273
+ {:formalarguments=>
274
+ {:@block_arg=>nil,
275
+ :@names=>[],
276
+ :@defaults=>nil,
277
+ :@optional=>[],
278
+ :@splat=>nil,
279
+ :@line=>1,
280
+ :@required=>[]}},
281
+ :@body=>
282
+ {:block=>
283
+ {:@array=>
284
+ [{:send=>
285
+ {:@receiver=>{:self=>{:@line=>2}},
286
+ :@check_for_local=>false,
287
+ :@block=>nil,
288
+ :@name=>:a,
289
+ :@line=>2,
290
+ :@privately=>true}},
291
+ {:begin=>
292
+ {:@rescue=>
293
+ {:rescue=>
294
+ {:@body=>
295
+ {:send=>
296
+ {:@receiver=>{:self=>{:@line=>4}},
297
+ :@check_for_local=>false,
298
+ :@block=>nil,
299
+ :@name=>:b,
300
+ :@line=>4,
301
+ :@privately=>true}},
302
+ :@rescue=>
303
+ {:rescuecondition=>
304
+ {:@assignment=>nil,
305
+ :@conditions=>
306
+ {:arrayliteral=>
307
+ {:@body=>
308
+ [{:constfind=>{:@name=>:StandardError, :@line=>6}}],
309
+ :@line=>6}},
310
+ :@body=>
311
+ {:send=>
312
+ {:@receiver=>{:self=>{:@line=>6}},
313
+ :@check_for_local=>false,
314
+ :@block=>nil,
315
+ :@name=>:c,
316
+ :@line=>6,
317
+ :@privately=>true}},
318
+ :@splat=>nil,
319
+ :@next=>nil,
320
+ :@line=>6}},
321
+ :@else=>nil,
322
+ :@line=>4}},
323
+ :@line=>3}},
324
+ {:send=>
325
+ {:@receiver=>{:self=>{:@line=>8}},
326
+ :@check_for_local=>false,
327
+ :@block=>nil,
328
+ :@name=>:d,
329
+ :@line=>8,
330
+ :@privately=>true}}],
331
+ :@line=>1}},
332
+ :@name=>:f,
333
+ :@line=>1}}
334
+
335
+ ruby.should parse_as(ast)
336
+ end
337
+
338
+ it 'should correctly parse "def f(&block); end"' do
339
+ ruby = <<-ruby
340
+ def f(&block)
341
+ end
342
+ ruby
343
+ ast = {:define=>
344
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
345
+ :@name=>:f,
346
+ :@line=>1,
347
+ :@arguments=>
348
+ {:formalarguments=>
349
+ {:@block_arg=>{:blockargument=>{:@name=>:block, :@line=>1}},
350
+ :@names=>[:block],
351
+ :@defaults=>nil,
352
+ :@optional=>[],
353
+ :@splat=>nil,
354
+ :@line=>1,
355
+ :@required=>[]}}}}
356
+
357
+ ruby.should parse_as(ast)
358
+ end
359
+
360
+ it 'should correctly parse "def f(mand, opt = 42, &block); end"' do
361
+ ruby = <<-ruby
362
+ def f(mand, opt = 42, &block)
363
+ end
364
+ ruby
365
+ ast = {:define=>
366
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
367
+ :@name=>:f,
368
+ :@line=>1,
369
+ :@arguments=>
370
+ {:formalarguments=>
371
+ {:@block_arg=>{:blockargument=>{:@name=>:block, :@line=>1}},
372
+ :@names=>[:mand, :opt, :block],
373
+ :@defaults=>
374
+ {:defaultarguments=>
375
+ {:@names=>[:opt],
376
+ :@line=>1,
377
+ :@arguments=>
378
+ [{:localvariableassignment=>
379
+ {:@variable=>nil,
380
+ :@name=>:opt,
381
+ :@line=>1,
382
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}}]}},
383
+ :@optional=>[:opt],
384
+ :@splat=>nil,
385
+ :@line=>1,
386
+ :@required=>[:mand]}}}}
387
+
388
+ ruby.should parse_as(ast)
389
+ end
390
+
391
+ it 'should correctly parse "def f(x, a=x.b); end"' do
392
+ ruby = <<-ruby
393
+ def f(x, a=x.b)
394
+ end
395
+ ruby
396
+ ast = {:define=>
397
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
398
+ :@name=>:f,
399
+ :@line=>1,
400
+ :@arguments=>
401
+ {:formalarguments=>
402
+ {:@block_arg=>nil,
403
+ :@names=>[:x, :a],
404
+ :@defaults=>
405
+ {:defaultarguments=>
406
+ {:@names=>[:a],
407
+ :@line=>1,
408
+ :@arguments=>
409
+ [{:localvariableassignment=>
410
+ {:@variable=>nil,
411
+ :@name=>:a,
412
+ :@line=>1,
413
+ :@value=>
414
+ {:send=>
415
+ {:@block=>nil,
416
+ :@name=>:b,
417
+ :@line=>1,
418
+ :@privately=>false,
419
+ :@receiver=>
420
+ {:localvariableaccess=>
421
+ {:@variable=>nil, :@name=>:x, :@line=>1}},
422
+ :@check_for_local=>false}}}}]}},
423
+ :@optional=>[:a],
424
+ :@splat=>nil,
425
+ :@line=>1,
426
+ :@required=>[:x]}}}}
427
+
428
+ ruby.should parse_as(ast)
429
+ end
430
+
431
+ it 'should correctly parse "def f(mand, &block); end"' do
432
+ ruby = <<-ruby
433
+ def f(mand, &block)
434
+ end
435
+ ruby
436
+ ast = {:define=>
437
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
438
+ :@name=>:f,
439
+ :@line=>1,
440
+ :@arguments=>
441
+ {:formalarguments=>
442
+ {:@block_arg=>{:blockargument=>{:@name=>:block, :@line=>1}},
443
+ :@names=>[:mand, :block],
444
+ :@defaults=>nil,
445
+ :@optional=>[],
446
+ :@splat=>nil,
447
+ :@line=>1,
448
+ :@required=>[:mand]}}}}
449
+
450
+ ruby.should parse_as(ast)
451
+ end
452
+
453
+ it 'should correctly parse "def f(mand, opt = 42); end"' do
454
+ ruby = <<-ruby
455
+ def f(mand, opt = 42)
456
+ end
457
+ ruby
458
+ ast = {:define=>
459
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
460
+ :@name=>:f,
461
+ :@line=>1,
462
+ :@arguments=>
463
+ {:formalarguments=>
464
+ {:@block_arg=>nil,
465
+ :@names=>[:mand, :opt],
466
+ :@defaults=>
467
+ {:defaultarguments=>
468
+ {:@names=>[:opt],
469
+ :@line=>1,
470
+ :@arguments=>
471
+ [{:localvariableassignment=>
472
+ {:@variable=>nil,
473
+ :@name=>:opt,
474
+ :@line=>1,
475
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}}]}},
476
+ :@optional=>[:opt],
477
+ :@splat=>nil,
478
+ :@line=>1,
479
+ :@required=>[:mand]}}}}
480
+
481
+ ruby.should parse_as(ast)
482
+ end
483
+
484
+ it 'should correctly parse "def f(mand, opt = 42, *rest, &block); end"' do
485
+ ruby = <<-ruby
486
+ def f(mand, opt = 42, *rest, &block)
487
+ end
488
+ ruby
489
+ ast = {:define=>
490
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
491
+ :@name=>:f,
492
+ :@line=>1,
493
+ :@arguments=>
494
+ {:formalarguments=>
495
+ {:@block_arg=>{:blockargument=>{:@name=>:block, :@line=>1}},
496
+ :@names=>[:mand, :opt, :rest, :block],
497
+ :@defaults=>
498
+ {:defaultarguments=>
499
+ {:@names=>[:opt],
500
+ :@line=>1,
501
+ :@arguments=>
502
+ [{:localvariableassignment=>
503
+ {:@variable=>nil,
504
+ :@name=>:opt,
505
+ :@line=>1,
506
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}}]}},
507
+ :@optional=>[:opt],
508
+ :@splat=>:rest,
509
+ :@line=>1,
510
+ :@required=>[:mand]}}}}
511
+
512
+ ruby.should parse_as(ast)
513
+ end
514
+
515
+ it 'should correctly parse "def x(a, b = 42, *); end' do
516
+ ruby = <<-ruby
517
+ def x(a, b = 42, *)
518
+ end
519
+ ruby
520
+ ast = {:define=>
521
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
522
+ :@name=>:x,
523
+ :@line=>1,
524
+ :@arguments=>
525
+ {:formalarguments=>
526
+ {:@block_arg=>nil,
527
+ :@names=>[:a, :b, :@unnamed_splat],
528
+ :@defaults=>
529
+ {:defaultarguments=>
530
+ {:@names=>[:b],
531
+ :@line=>1,
532
+ :@arguments=>
533
+ [{:localvariableassignment=>
534
+ {:@variable=>nil,
535
+ :@name=>:b,
536
+ :@line=>1,
537
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}}]}},
538
+ :@optional=>[:b],
539
+ :@splat=>:@unnamed_splat,
540
+ :@line=>1,
541
+ :@required=>[:a]}}}}
542
+
543
+ ruby.should parse_as(ast)
544
+ end
545
+
546
+ it 'should correctly parse "def f(mand, opt = 42, *rest); end"' do
547
+ ruby = <<-ruby
548
+ def f(mand, opt = 42, *rest)
549
+ end
550
+ ruby
551
+ ast = {:define=>
552
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
553
+ :@name=>:f,
554
+ :@line=>1,
555
+ :@arguments=>
556
+ {:formalarguments=>
557
+ {:@block_arg=>nil,
558
+ :@names=>[:mand, :opt, :rest],
559
+ :@defaults=>
560
+ {:defaultarguments=>
561
+ {:@names=>[:opt],
562
+ :@line=>1,
563
+ :@arguments=>
564
+ [{:localvariableassignment=>
565
+ {:@variable=>nil,
566
+ :@name=>:opt,
567
+ :@line=>1,
568
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}}]}},
569
+ :@optional=>[:opt],
570
+ :@splat=>:rest,
571
+ :@line=>1,
572
+ :@required=>[:mand]}}}}
573
+
574
+ ruby.should parse_as(ast)
575
+ end
576
+
577
+ it 'should correctly parse "def empty; end"' do
578
+ ruby = <<-ruby
579
+ def empty
580
+ end
581
+ ruby
582
+ ast = {:define=>
583
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
584
+ :@name=>:empty,
585
+ :@line=>1,
586
+ :@arguments=>
587
+ {:formalarguments=>
588
+ {:@block_arg=>nil,
589
+ :@names=>[],
590
+ :@defaults=>nil,
591
+ :@optional=>[],
592
+ :@splat=>nil,
593
+ :@line=>1,
594
+ :@required=>[]}}}}
595
+
596
+ ruby.should parse_as(ast)
597
+ end
598
+
599
+ it 'should correctly parse "def f(mand); end"' do
600
+ ruby = <<-ruby
601
+ def f(mand)
602
+ end
603
+ ruby
604
+ ast = {:define=>
605
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
606
+ :@name=>:f,
607
+ :@line=>1,
608
+ :@arguments=>
609
+ {:formalarguments=>
610
+ {:@block_arg=>nil,
611
+ :@names=>[:mand],
612
+ :@defaults=>nil,
613
+ :@optional=>[],
614
+ :@splat=>nil,
615
+ :@line=>1,
616
+ :@required=>[:mand]}}}}
617
+
618
+ ruby.should parse_as(ast)
619
+ end
620
+
621
+ it 'should correctly parse "def f(mand, *rest, &block); end"' do
622
+ ruby = <<-ruby
623
+ def f(mand, *rest, &block)
624
+ end
625
+ ruby
626
+ ast = {:define=>
627
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
628
+ :@name=>:f,
629
+ :@line=>1,
630
+ :@arguments=>
631
+ {:formalarguments=>
632
+ {:@block_arg=>{:blockargument=>{:@name=>:block, :@line=>1}},
633
+ :@names=>[:mand, :rest, :block],
634
+ :@defaults=>nil,
635
+ :@optional=>[],
636
+ :@splat=>:rest,
637
+ :@line=>1,
638
+ :@required=>[:mand]}}}}
639
+
640
+ ruby.should parse_as(ast)
641
+ end
642
+
643
+ it 'should correctly parse "def x(a, *args) ..."' do
644
+ ruby = <<-ruby
645
+ def x(a, *args)
646
+ p(a, args)
647
+ end
648
+ ruby
649
+ ast = {:define=>
650
+ {:@body=>
651
+ {:block=>
652
+ {:@array=>
653
+ [{:sendwitharguments=>
654
+ {:@block=>nil,
655
+ :@name=>:p,
656
+ :@line=>2,
657
+ :@privately=>true,
658
+ :@receiver=>{:self=>{:@line=>2}},
659
+ :@check_for_local=>false,
660
+ :@arguments=>
661
+ {:actualarguments=>
662
+ {:@array=>
663
+ [{:localvariableaccess=>
664
+ {:@variable=>nil, :@name=>:a, :@line=>2}},
665
+ {:localvariableaccess=>
666
+ {:@variable=>nil, :@name=>:args, :@line=>2}}],
667
+ :@splat=>nil,
668
+ :@line=>2}}}}],
669
+ :@line=>1}},
670
+ :@name=>:x,
671
+ :@line=>1,
672
+ :@arguments=>
673
+ {:formalarguments=>
674
+ {:@block_arg=>nil,
675
+ :@names=>[:a, :args],
676
+ :@defaults=>nil,
677
+ :@optional=>[],
678
+ :@splat=>:args,
679
+ :@line=>1,
680
+ :@required=>[:a]}}}}
681
+
682
+ ruby.should parse_as(ast)
683
+ end
684
+
685
+ it 'should correctly parse "def f(mand, *rest) ..."' do
686
+ ruby = <<-ruby
687
+ def f(mand, *rest)
688
+ end
689
+ ruby
690
+ ast = {:define=>
691
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
692
+ :@name=>:f,
693
+ :@line=>1,
694
+ :@arguments=>
695
+ {:formalarguments=>
696
+ {:@block_arg=>nil,
697
+ :@names=>[:mand, :rest],
698
+ :@defaults=>nil,
699
+ :@optional=>[],
700
+ :@splat=>:rest,
701
+ :@line=>1,
702
+ :@required=>[:mand]}}}}
703
+
704
+ ruby.should parse_as(ast)
705
+ end
706
+
707
+ it 'should correctly parse "def f(opt = 42, &block); end"' do
708
+ ruby = <<-ruby
709
+ def f(opt = 42, &block)
710
+ end
711
+ ruby
712
+ ast = {:define=>
713
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
714
+ :@name=>:f,
715
+ :@line=>1,
716
+ :@arguments=>
717
+ {:formalarguments=>
718
+ {:@block_arg=>{:blockargument=>{:@name=>:block, :@line=>1}},
719
+ :@names=>[:opt, :block],
720
+ :@defaults=>
721
+ {:defaultarguments=>
722
+ {:@names=>[:opt],
723
+ :@line=>1,
724
+ :@arguments=>
725
+ [{:localvariableassignment=>
726
+ {:@variable=>nil,
727
+ :@name=>:opt,
728
+ :@line=>1,
729
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}}]}},
730
+ :@optional=>[:opt],
731
+ :@splat=>nil,
732
+ :@line=>1,
733
+ :@required=>[]}}}}
734
+
735
+ ruby.should parse_as(ast)
736
+ end
737
+
738
+ it 'should correctly parse "def f(a = 42, b = \'1\', c=lambda {|n| n }); end' do
739
+ ruby = <<-ruby
740
+ def f(a = 42, b = '1', c=lambda {|n| n })
741
+ end
742
+ ruby
743
+ ast = {:define=>
744
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
745
+ :@name=>:f,
746
+ :@line=>1,
747
+ :@arguments=>
748
+ {:formalarguments=>
749
+ {:@block_arg=>nil,
750
+ :@names=>[:a, :b, :c],
751
+ :@defaults=>
752
+ {:defaultarguments=>
753
+ {:@names=>[:a, :b, :c],
754
+ :@line=>1,
755
+ :@arguments=>
756
+ [{:localvariableassignment=>
757
+ {:@variable=>nil,
758
+ :@name=>:a,
759
+ :@line=>1,
760
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}},
761
+ {:localvariableassignment=>
762
+ {:@variable=>nil,
763
+ :@name=>:b,
764
+ :@line=>1,
765
+ :@value=>{:stringliteral=>{:@string=>:"1", :@line=>1}}}},
766
+ {:localvariableassignment=>
767
+ {:@variable=>nil,
768
+ :@name=>:c,
769
+ :@line=>1,
770
+ :@value=>
771
+ {:send=>
772
+ {:@block=>
773
+ {:iter=>
774
+ {:@body=>
775
+ {:localvariableaccess=>
776
+ {:@variable=>nil, :@name=>:n, :@line=>1}},
777
+ :@line=>1,
778
+ :@arguments=>
779
+ {:iterarguments=>
780
+ {:@block=>nil,
781
+ :@arity=>1,
782
+ :@prelude=>:single,
783
+ :@optional=>0,
784
+ :@splat=>nil,
785
+ :@line=>1,
786
+ :@splat_index=>-1,
787
+ :@required_args=>1,
788
+ :@arguments=>
789
+ {:localvariableassignment=>
790
+ {:@variable=>nil,
791
+ :@name=>:n,
792
+ :@line=>1,
793
+ :@value=>nil}}}}}},
794
+ :@name=>:lambda,
795
+ :@line=>1,
796
+ :@privately=>true,
797
+ :@receiver=>{:self=>{:@line=>1}},
798
+ :@check_for_local=>false}}}}]}},
799
+ :@optional=>[:a, :b, :c],
800
+ :@splat=>nil,
801
+ :@line=>1,
802
+ :@required=>[]}}}}
803
+
804
+ ruby.should parse_as(ast)
805
+ end
806
+
807
+ it 'should correctly parse "def f(opt = 42); end"' do
808
+ ruby = <<-ruby
809
+ def f(opt = 42)
810
+ end
811
+ ruby
812
+ ast = {:define=>
813
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
814
+ :@name=>:f,
815
+ :@line=>1,
816
+ :@arguments=>
817
+ {:formalarguments=>
818
+ {:@block_arg=>nil,
819
+ :@names=>[:opt],
820
+ :@defaults=>
821
+ {:defaultarguments=>
822
+ {:@names=>[:opt],
823
+ :@line=>1,
824
+ :@arguments=>
825
+ [{:localvariableassignment=>
826
+ {:@variable=>nil,
827
+ :@name=>:opt,
828
+ :@line=>1,
829
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}}]}},
830
+ :@optional=>[:opt],
831
+ :@splat=>nil,
832
+ :@line=>1,
833
+ :@required=>[]}}}}
834
+
835
+ ruby.should parse_as(ast)
836
+ end
837
+
838
+ it 'should correctly parse "def f(opt = 42, *rest, &block); end"' do
839
+ ruby = <<-ruby
840
+ def f(opt = 42, *rest, &block)
841
+ end
842
+ ruby
843
+ ast = {:define=>
844
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
845
+ :@name=>:f,
846
+ :@line=>1,
847
+ :@arguments=>
848
+ {:formalarguments=>
849
+ {:@block_arg=>{:blockargument=>{:@name=>:block, :@line=>1}},
850
+ :@names=>[:opt, :rest, :block],
851
+ :@defaults=>
852
+ {:defaultarguments=>
853
+ {:@names=>[:opt],
854
+ :@line=>1,
855
+ :@arguments=>
856
+ [{:localvariableassignment=>
857
+ {:@variable=>nil,
858
+ :@name=>:opt,
859
+ :@line=>1,
860
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}}]}},
861
+ :@optional=>[:opt],
862
+ :@splat=>:rest,
863
+ :@line=>1,
864
+ :@required=>[]}}}}
865
+
866
+ ruby.should parse_as(ast)
867
+ end
868
+
869
+ it 'should correctly parse "def x(b = 42, *); end"' do
870
+ ruby = <<-ruby
871
+ def x(b = 42, *)
872
+ end
873
+ ruby
874
+ ast = {:define=>
875
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
876
+ :@name=>:x,
877
+ :@line=>1,
878
+ :@arguments=>
879
+ {:formalarguments=>
880
+ {:@block_arg=>nil,
881
+ :@names=>[:b, :@unnamed_splat],
882
+ :@defaults=>
883
+ {:defaultarguments=>
884
+ {:@names=>[:b],
885
+ :@line=>1,
886
+ :@arguments=>
887
+ [{:localvariableassignment=>
888
+ {:@variable=>nil,
889
+ :@name=>:b,
890
+ :@line=>1,
891
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}}]}},
892
+ :@optional=>[:b],
893
+ :@splat=>:@unnamed_splat,
894
+ :@line=>1,
895
+ :@required=>[]}}}}
896
+
897
+ ruby.should parse_as(ast)
898
+ end
899
+
900
+ it 'should correctly parse "def f(opt = 42, *rest); end"' do
901
+ ruby = <<-ruby
902
+ def f(opt = 42, *rest)
903
+ end
904
+ ruby
905
+ ast = {:define=>
906
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
907
+ :@name=>:f,
908
+ :@line=>1,
909
+ :@arguments=>
910
+ {:formalarguments=>
911
+ {:@block_arg=>nil,
912
+ :@names=>[:opt, :rest],
913
+ :@defaults=>
914
+ {:defaultarguments=>
915
+ {:@names=>[:opt],
916
+ :@line=>1,
917
+ :@arguments=>
918
+ [{:localvariableassignment=>
919
+ {:@variable=>nil,
920
+ :@name=>:opt,
921
+ :@line=>1,
922
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}}]}},
923
+ :@optional=>[:opt],
924
+ :@splat=>:rest,
925
+ :@line=>1,
926
+ :@required=>[]}}}}
927
+
928
+ ruby.should parse_as(ast)
929
+ end
930
+
931
+ it 'should correctly parse "def |(o); end"' do
932
+ ruby = <<-ruby
933
+ def |(o)
934
+ end
935
+ ruby
936
+ ast = {:define=>
937
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
938
+ :@name=>:|,
939
+ :@line=>1,
940
+ :@arguments=>
941
+ {:formalarguments=>
942
+ {:@block_arg=>nil,
943
+ :@names=>[:o],
944
+ :@defaults=>nil,
945
+ :@optional=>[],
946
+ :@splat=>nil,
947
+ :@line=>1,
948
+ :@required=>[:o]}}}}
949
+
950
+ ruby.should parse_as(ast)
951
+ end
952
+
953
+ it 'should correctly parse "def eql?(resource) ... rescue ..."' do
954
+ ruby = <<-ruby
955
+ def eql?(resource)
956
+ (self.uuid == resource.uuid)
957
+ rescue
958
+ false
959
+ end
960
+ ruby
961
+ ast = {:define=>
962
+ {:@body=>
963
+ {:block=>
964
+ {:@array=>
965
+ [{:rescue=>
966
+ {:@body=>
967
+ {:sendwitharguments=>
968
+ {:@block=>nil,
969
+ :@name=>:==,
970
+ :@line=>2,
971
+ :@privately=>false,
972
+ :@receiver=>
973
+ {:send=>
974
+ {:@block=>nil,
975
+ :@name=>:uuid,
976
+ :@line=>2,
977
+ :@privately=>false,
978
+ :@receiver=>{:self=>{:@line=>2}},
979
+ :@check_for_local=>false}},
980
+ :@check_for_local=>false,
981
+ :@arguments=>
982
+ {:actualarguments=>
983
+ {:@array=>
984
+ [{:send=>
985
+ {:@block=>nil,
986
+ :@name=>:uuid,
987
+ :@line=>2,
988
+ :@privately=>false,
989
+ :@receiver=>
990
+ {:localvariableaccess=>
991
+ {:@variable=>nil, :@name=>:resource, :@line=>2}},
992
+ :@check_for_local=>false}}],
993
+ :@splat=>nil,
994
+ :@line=>2}}}},
995
+ :@rescue=>
996
+ {:rescuecondition=>
997
+ {:@conditions=>
998
+ {:arrayliteral=>
999
+ {:@body=>
1000
+ [{:constfind=>{:@name=>:StandardError, :@line=>4}}],
1001
+ :@line=>4}},
1002
+ :@body=>{:false=>{:@line=>4}},
1003
+ :@splat=>nil,
1004
+ :@next=>nil,
1005
+ :@line=>4,
1006
+ :@assignment=>nil}},
1007
+ :@else=>nil,
1008
+ :@line=>2}}],
1009
+ :@line=>1}},
1010
+ :@name=>:eql?,
1011
+ :@line=>1,
1012
+ :@arguments=>
1013
+ {:formalarguments=>
1014
+ {:@block_arg=>nil,
1015
+ :@names=>[:resource],
1016
+ :@defaults=>nil,
1017
+ :@optional=>[],
1018
+ :@splat=>nil,
1019
+ :@line=>1,
1020
+ :@required=>[:resource]}}}}
1021
+
1022
+
1023
+ ruby.should parse_as(ast)
1024
+ end
1025
+
1026
+ it 'should correctly parse "def something?; end"' do
1027
+ ruby = <<-ruby
1028
+ def something?
1029
+ end
1030
+ ruby
1031
+ ast = {:define=>
1032
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
1033
+ :@name=>:something?,
1034
+ :@line=>1,
1035
+ :@arguments=>
1036
+ {:formalarguments=>
1037
+ {:@block_arg=>nil,
1038
+ :@names=>[],
1039
+ :@defaults=>nil,
1040
+ :@optional=>[],
1041
+ :@splat=>nil,
1042
+ :@line=>1,
1043
+ :@required=>[]}}}}
1044
+
1045
+ ruby.should parse_as(ast)
1046
+ end
1047
+
1048
+ it 'should correctly parse "def x(*); end"' do
1049
+ ruby = <<-ruby
1050
+ def x(*)
1051
+ end
1052
+ ruby
1053
+ ast = {:define=>
1054
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
1055
+ :@name=>:x,
1056
+ :@line=>1,
1057
+ :@arguments=>
1058
+ {:formalarguments=>
1059
+ {:@block_arg=>nil,
1060
+ :@names=>[:@unnamed_splat],
1061
+ :@defaults=>nil,
1062
+ :@optional=>[],
1063
+ :@splat=>:@unnamed_splat,
1064
+ :@line=>1,
1065
+ :@required=>[]}}}}
1066
+
1067
+ ruby.should parse_as(ast)
1068
+ end
1069
+
1070
+ it 'should correctly parse "def f(*rest); end"' do
1071
+ ruby = <<-ruby
1072
+ def f(*rest)
1073
+ end
1074
+ ruby
1075
+ ast = {:define=>
1076
+ {:@body=>{:block=>{:@array=>[{}], :@line=>1}},
1077
+ :@name=>:f,
1078
+ :@line=>1,
1079
+ :@arguments=>
1080
+ {:formalarguments=>
1081
+ {:@block_arg=>nil,
1082
+ :@names=>[:rest],
1083
+ :@defaults=>nil,
1084
+ :@optional=>[],
1085
+ :@splat=>:rest,
1086
+ :@line=>1,
1087
+ :@required=>[]}}}}
1088
+
1089
+ ruby.should parse_as(ast)
1090
+ end
1091
+
1092
+ it 'should correctly parse "def x(a, *); end"' do
1093
+ ruby = <<-ruby
1094
+ def x(a, *)
1095
+ p(a)
1096
+ end
1097
+ ruby
1098
+ ast = {:define=>
1099
+ {:@body=>
1100
+ {:block=>
1101
+ {:@array=>
1102
+ [{:sendwitharguments=>
1103
+ {:@block=>nil,
1104
+ :@name=>:p,
1105
+ :@line=>2,
1106
+ :@privately=>true,
1107
+ :@receiver=>{:self=>{:@line=>2}},
1108
+ :@check_for_local=>false,
1109
+ :@arguments=>
1110
+ {:actualarguments=>
1111
+ {:@array=>
1112
+ [{:localvariableaccess=>
1113
+ {:@variable=>nil, :@name=>:a, :@line=>2}}],
1114
+ :@splat=>nil,
1115
+ :@line=>2}}}}],
1116
+ :@line=>1}},
1117
+ :@name=>:x,
1118
+ :@line=>1,
1119
+ :@arguments=>
1120
+ {:formalarguments=>
1121
+ {:@block_arg=>nil,
1122
+ :@names=>[:a, :@unnamed_splat],
1123
+ :@defaults=>nil,
1124
+ :@optional=>[],
1125
+ :@splat=>:@unnamed_splat,
1126
+ :@line=>1,
1127
+ :@required=>[:a]}}}}
1128
+
1129
+ ruby.should parse_as(ast)
1130
+ end
1131
+
1132
+ it 'should correctly parse "def zarray ..."' do
1133
+ ruby = <<-ruby
1134
+ def zarray
1135
+ a = []
1136
+ return a
1137
+ end
1138
+ ruby
1139
+ ast = {:define=>
1140
+ {:@body=>
1141
+ {:block=>
1142
+ {:@array=>
1143
+ [{:localvariableassignment=>
1144
+ {:@variable=>nil,
1145
+ :@name=>:a,
1146
+ :@line=>2,
1147
+ :@value=>{:emptyarray=>{:@line=>2}}}},
1148
+ {:return=>
1149
+ {:@splat=>nil,
1150
+ :@line=>3,
1151
+ :@value=>
1152
+ {:localvariableaccess=>
1153
+ {:@variable=>nil, :@name=>:a, :@line=>3}}}}],
1154
+ :@line=>1}},
1155
+ :@name=>:zarray,
1156
+ :@line=>1,
1157
+ :@arguments=>
1158
+ {:formalarguments=>
1159
+ {:@block_arg=>nil,
1160
+ :@names=>[],
1161
+ :@defaults=>nil,
1162
+ :@optional=>[],
1163
+ :@splat=>nil,
1164
+ :@line=>1,
1165
+ :@required=>[]}}}}
1166
+
1167
+ ruby.should parse_as(ast)
1168
+ end
1169
+
1170
+ it 'should correctly parse "def a ... begin ... rescue RuntimeError => b ..."' do
1171
+ ruby = <<-ruby
1172
+ b = 42
1173
+ def a
1174
+ c do
1175
+ begin
1176
+ do_stuff
1177
+ rescue RuntimeError => b
1178
+ puts(b)
1179
+ end
1180
+ end
1181
+ end
1182
+ ruby
1183
+ ast = {:block=>
1184
+ {:@array=>
1185
+ [{:localvariableassignment=>
1186
+ {:@variable=>nil,
1187
+ :@name=>:b,
1188
+ :@line=>1,
1189
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}},
1190
+ {:define=>
1191
+ {:@body=>
1192
+ {:block=>
1193
+ {:@array=>
1194
+ [{:send=>
1195
+ {:@block=>
1196
+ {:iter=>
1197
+ {:@body=>
1198
+ {:begin=>
1199
+ {:@rescue=>
1200
+ {:rescue=>
1201
+ {:@body=>
1202
+ {:send=>
1203
+ {:@block=>nil,
1204
+ :@name=>:do_stuff,
1205
+ :@line=>5,
1206
+ :@privately=>true,
1207
+ :@receiver=>{:self=>{:@line=>5}},
1208
+ :@check_for_local=>false}},
1209
+ :@rescue=>
1210
+ {:rescuecondition=>
1211
+ {:@conditions=>
1212
+ {:arrayliteral=>
1213
+ {:@body=>
1214
+ [{:constfind=>
1215
+ {:@name=>:RuntimeError, :@line=>6}}],
1216
+ :@line=>6}},
1217
+ :@body=>
1218
+ {:block=>
1219
+ {:@array=>
1220
+ [{:sendwitharguments=>
1221
+ {:@block=>nil,
1222
+ :@name=>:puts,
1223
+ :@line=>7,
1224
+ :@privately=>true,
1225
+ :@receiver=>{:self=>{:@line=>7}},
1226
+ :@check_for_local=>false,
1227
+ :@arguments=>
1228
+ {:actualarguments=>
1229
+ {:@array=>
1230
+ [{:localvariableaccess=>
1231
+ {:@variable=>nil,
1232
+ :@name=>:b,
1233
+ :@line=>7}}],
1234
+ :@splat=>nil,
1235
+ :@line=>7}}}}],
1236
+ :@line=>6}},
1237
+ :@splat=>nil,
1238
+ :@next=>nil,
1239
+ :@line=>6,
1240
+ :@assignment=>
1241
+ {:localvariableassignment=>
1242
+ {:@variable=>nil,
1243
+ :@name=>:b,
1244
+ :@line=>6,
1245
+ :@value=>
1246
+ {:globalvariableaccess=>
1247
+ {:@name=>:$!, :@line=>8}}}}}},
1248
+ :@else=>nil,
1249
+ :@line=>5}},
1250
+ :@line=>4}},
1251
+ :@line=>3,
1252
+ :@arguments=>
1253
+ {:iterarguments=>
1254
+ {:@block=>nil,
1255
+ :@arity=>-1,
1256
+ :@prelude=>nil,
1257
+ :@optional=>0,
1258
+ :@splat=>nil,
1259
+ :@line=>3,
1260
+ :@splat_index=>-2,
1261
+ :@required_args=>0}}}},
1262
+ :@name=>:c,
1263
+ :@line=>3,
1264
+ :@privately=>true,
1265
+ :@receiver=>{:self=>{:@line=>3}},
1266
+ :@check_for_local=>false}}],
1267
+ :@line=>2}},
1268
+ :@name=>:a,
1269
+ :@line=>2,
1270
+ :@arguments=>
1271
+ {:formalarguments=>
1272
+ {:@block_arg=>nil,
1273
+ :@names=>[],
1274
+ :@defaults=>nil,
1275
+ :@optional=>[],
1276
+ :@splat=>nil,
1277
+ :@line=>2,
1278
+ :@required=>[]}}}}],
1279
+ :@line=>1}}
1280
+
1281
+ ruby.should parse_as(ast)
1282
+ end
1283
+
1284
+ it 'should correctly parse "def x(a=0.0,b=0.0); a+b; end"' do
1285
+ ruby = <<-ruby
1286
+ def x(a=0.0,b=0.0)
1287
+ a+b
1288
+ end
1289
+ ruby
1290
+ ast = {:define=>
1291
+ {:@body=>
1292
+ {:block=>
1293
+ {:@array=>
1294
+ [{:sendwitharguments=>
1295
+ {:@block=>nil,
1296
+ :@name=>:+,
1297
+ :@line=>2,
1298
+ :@privately=>false,
1299
+ :@receiver=>
1300
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>2}},
1301
+ :@check_for_local=>false,
1302
+ :@arguments=>
1303
+ {:actualarguments=>
1304
+ {:@array=>
1305
+ [{:localvariableaccess=>
1306
+ {:@variable=>nil, :@name=>:b, :@line=>2}}],
1307
+ :@splat=>nil,
1308
+ :@line=>2}}}}],
1309
+ :@line=>1}},
1310
+ :@name=>:x,
1311
+ :@line=>1,
1312
+ :@arguments=>
1313
+ {:formalarguments=>
1314
+ {:@block_arg=>nil,
1315
+ :@names=>[:a, :b],
1316
+ :@defaults=>
1317
+ {:defaultarguments=>
1318
+ {:@names=>[:a, :b],
1319
+ :@line=>1,
1320
+ :@arguments=>
1321
+ [{:localvariableassignment=>
1322
+ {:@variable=>nil,
1323
+ :@name=>:a,
1324
+ :@line=>1,
1325
+ :@value=>{:float=>{:@line=>1, :@value=>:"0.0"}}}},
1326
+ {:localvariableassignment=>
1327
+ {:@variable=>nil,
1328
+ :@name=>:b,
1329
+ :@line=>1,
1330
+ :@value=>{:float=>{:@line=>1, :@value=>:"0.0"}}}}]}},
1331
+ :@optional=>[:a, :b],
1332
+ :@splat=>nil,
1333
+ :@line=>1,
1334
+ :@required=>[]}}}}
1335
+
1336
+ ruby.should parse_as(ast)
1337
+ end
1338
+
1339
+ it 'should correctly parse "def x(*b); a(*b); end"' do
1340
+ ruby = <<-ruby
1341
+ def x(*b)
1342
+ a(*b)
1343
+ end
1344
+ ruby
1345
+ ast = {:define=>
1346
+ {:@body=>
1347
+ {:block=>
1348
+ {:@array=>
1349
+ [{:sendwitharguments=>
1350
+ {:@block=>nil,
1351
+ :@name=>:a,
1352
+ :@line=>2,
1353
+ :@privately=>true,
1354
+ :@receiver=>{:self=>{:@line=>2}},
1355
+ :@check_for_local=>false,
1356
+ :@arguments=>
1357
+ {:actualarguments=>
1358
+ {:@array=>[],
1359
+ :@splat=>
1360
+ {:splatvalue=>
1361
+ {:@line=>2,
1362
+ :@value=>
1363
+ {:localvariableaccess=>
1364
+ {:@variable=>nil, :@name=>:b, :@line=>2}}}},
1365
+ :@line=>2}}}}],
1366
+ :@line=>1}},
1367
+ :@name=>:x,
1368
+ :@line=>1,
1369
+ :@arguments=>
1370
+ {:formalarguments=>
1371
+ {:@block_arg=>nil,
1372
+ :@names=>[:b],
1373
+ :@defaults=>nil,
1374
+ :@optional=>[],
1375
+ :@splat=>:b,
1376
+ :@line=>1,
1377
+ :@required=>[]}}}}
1378
+
1379
+ ruby.should parse_as(ast)
1380
+ end
1381
+
1382
+ it 'should correctly parse "def meth(b); b; end"' do
1383
+ ruby = <<-ruby
1384
+ def meth(b)
1385
+ b
1386
+ end
1387
+ ruby
1388
+ ast = {:define=>
1389
+ {:@body=>
1390
+ {:block=>
1391
+ {:@array=>
1392
+ [{:localvariableaccess=>{:@variable=>nil, :@name=>:b, :@line=>2}}],
1393
+ :@line=>1}},
1394
+ :@name=>:meth,
1395
+ :@line=>1,
1396
+ :@arguments=>
1397
+ {:formalarguments=>
1398
+ {:@block_arg=>nil,
1399
+ :@names=>[:b],
1400
+ :@defaults=>nil,
1401
+ :@optional=>[],
1402
+ :@splat=>nil,
1403
+ :@line=>1,
1404
+ :@required=>[:b]}}}}
1405
+
1406
+ ruby.should parse_as(ast)
1407
+ end
1408
+
1409
+ end