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