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,619 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "a &&= 8"' do
6
+ ruby = 'a &&= 8'
7
+ ast = {:opassignand=>
8
+ {:@line=>1,
9
+ :@left=>{:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>1}},
10
+ :@right=>
11
+ {:localvariableassignment=>
12
+ {:@variable=>nil,
13
+ :@name=>:a,
14
+ :@line=>1,
15
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>8}}}}}}
16
+
17
+ ruby.should parse_as(ast)
18
+ end
19
+
20
+ it 'should correctly parse "hsh[:blah] ||= 8"' do
21
+ ruby = 'hsh[:blah] ||= 8'
22
+ ast = {:opassign1=>
23
+ {:@op=>:or,
24
+ :@index=>[{:symbolliteral=>{:@line=>1, :@value=>:blah}}],
25
+ :@line=>1,
26
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>8}},
27
+ :@receiver=>
28
+ {:send=>
29
+ {:@block=>nil,
30
+ :@name=>:hsh,
31
+ :@line=>1,
32
+ :@privately=>true,
33
+ :@receiver=>{:self=>{:@line=>1}},
34
+ :@check_for_local=>false}}}}
35
+
36
+ ruby.should parse_as(ast)
37
+ end
38
+
39
+ it 'should correctly parse "x = 1; hsh[x] ||= 8"' do
40
+ ruby = <<-ruby
41
+ x = 1
42
+ hsh[x] ||= 8
43
+ ruby
44
+ ast = {:block=>
45
+ {:@array=>
46
+ [{:localvariableassignment=>
47
+ {:@variable=>nil,
48
+ :@name=>:x,
49
+ :@line=>1,
50
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
51
+ {:opassign1=>
52
+ {:@op=>:or,
53
+ :@index=>
54
+ [{:localvariableaccess=>{:@variable=>nil, :@name=>:x, :@line=>2}}],
55
+ :@line=>2,
56
+ :@value=>{:fixnumliteral=>{:@line=>2, :@value=>8}},
57
+ :@receiver=>
58
+ {:send=>
59
+ {:@block=>nil,
60
+ :@name=>:hsh,
61
+ :@line=>2,
62
+ :@privately=>true,
63
+ :@receiver=>{:self=>{:@line=>2}},
64
+ :@check_for_local=>false}}}}],
65
+ :@line=>1}}
66
+
67
+ ruby.should parse_as(ast)
68
+ end
69
+
70
+ it 'should correctly parse "hsh[:blah] &&= 8"' do
71
+ ruby = 'hsh[:blah] &&= 8'
72
+ ast = {:opassign1=>
73
+ {:@op=>:and,
74
+ :@index=>[{:symbolliteral=>{:@line=>1, :@value=>:blah}}],
75
+ :@line=>1,
76
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>8}},
77
+ :@receiver=>
78
+ {:send=>
79
+ {:@block=>nil,
80
+ :@name=>:hsh,
81
+ :@line=>1,
82
+ :@privately=>true,
83
+ :@receiver=>{:self=>{:@line=>1}},
84
+ :@check_for_local=>false}}}}
85
+
86
+ ruby.should parse_as(ast)
87
+ end
88
+
89
+ it 'should correctly parse "hsh[:blah] ^= 8"' do
90
+ ruby = 'hsh[:blah] ^= 8'
91
+ ast = {:opassign1=>
92
+ {:@op=>:^,
93
+ :@index=>[{:symbolliteral=>{:@line=>1, :@value=>:blah}}],
94
+ :@line=>1,
95
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>8}},
96
+ :@receiver=>
97
+ {:send=>
98
+ {:@block=>nil,
99
+ :@name=>:hsh,
100
+ :@line=>1,
101
+ :@privately=>true,
102
+ :@receiver=>{:self=>{:@line=>1}},
103
+ :@check_for_local=>false}}}}
104
+
105
+ ruby.should parse_as(ast)
106
+ end
107
+
108
+ it 'should correctly parse "ary[0,1] += [4]"' do
109
+ ruby = 'ary[0,1] += [4]'
110
+ ast = {:opassign1=>
111
+ {:@op=>:+,
112
+ :@index=>
113
+ [{:fixnumliteral=>{:@line=>1, :@value=>0}},
114
+ {:fixnumliteral=>{:@line=>1, :@value=>1}}],
115
+ :@line=>1,
116
+ :@value=>
117
+ {:arrayliteral=>
118
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>4}}], :@line=>1}},
119
+ :@receiver=>
120
+ {:send=>
121
+ {:@block=>nil,
122
+ :@name=>:ary,
123
+ :@line=>1,
124
+ :@privately=>true,
125
+ :@receiver=>{:self=>{:@line=>1}},
126
+ :@check_for_local=>false}}}}
127
+
128
+ ruby.should parse_as(ast)
129
+ end
130
+
131
+ it 'should correctly parse "x.val ||= 6"' do
132
+ ruby = 'x.val ||= 6'
133
+ ast = {:opassign2=>
134
+ {:@op=>:or,
135
+ :@assign=>:val=,
136
+ :@name=>:val,
137
+ :@line=>1,
138
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>6}},
139
+ :@receiver=>
140
+ {:send=>
141
+ {:@block=>nil,
142
+ :@name=>:x,
143
+ :@line=>1,
144
+ :@privately=>true,
145
+ :@receiver=>{:self=>{:@line=>1}},
146
+ :@check_for_local=>false}}}}
147
+
148
+ ruby.should parse_as(ast)
149
+ end
150
+
151
+ it 'should correctly parse "x.val &&= 7"' do
152
+ ruby = 'x.val &&= 7'
153
+ ast = {:opassign2=>
154
+ {:@op=>:and,
155
+ :@assign=>:val=,
156
+ :@name=>:val,
157
+ :@line=>1,
158
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>7}},
159
+ :@receiver=>
160
+ {:send=>
161
+ {:@block=>nil,
162
+ :@name=>:x,
163
+ :@line=>1,
164
+ :@privately=>true,
165
+ :@receiver=>{:self=>{:@line=>1}},
166
+ :@check_for_local=>false}}}}
167
+
168
+ ruby.should parse_as(ast)
169
+ end
170
+
171
+ it 'should correctly parse "@b = []; @b[1] ||= 10; @b[2] &&= 11; @b[3] += 12"' do
172
+ ruby = <<-ruby
173
+ @b = []
174
+ @b[1] ||= 10
175
+ @b[2] &&= 11
176
+ @b[3] += 12
177
+ ruby
178
+ ast = {:block=>
179
+ {:@array=>
180
+ [{:instancevariableassignment=>
181
+ {:@name=>:@b, :@line=>1, :@value=>{:emptyarray=>{:@line=>1}}}},
182
+ {:opassign1=>
183
+ {:@op=>:or,
184
+ :@index=>[{:fixnumliteral=>{:@line=>2, :@value=>1}}],
185
+ :@line=>2,
186
+ :@value=>{:fixnumliteral=>{:@line=>2, :@value=>10}},
187
+ :@receiver=>{:instancevariableaccess=>{:@name=>:@b, :@line=>2}}}},
188
+ {:opassign1=>
189
+ {:@op=>:and,
190
+ :@index=>[{:fixnumliteral=>{:@line=>3, :@value=>2}}],
191
+ :@line=>3,
192
+ :@value=>{:fixnumliteral=>{:@line=>3, :@value=>11}},
193
+ :@receiver=>{:instancevariableaccess=>{:@name=>:@b, :@line=>3}}}},
194
+ {:opassign1=>
195
+ {:@op=>:+,
196
+ :@index=>[{:fixnumliteral=>{:@line=>4, :@value=>3}}],
197
+ :@line=>4,
198
+ :@value=>{:fixnumliteral=>{:@line=>4, :@value=>12}},
199
+ :@receiver=>{:instancevariableaccess=>{:@name=>:@b, :@line=>4}}}}],
200
+ :@line=>1}}
201
+
202
+ ruby.should parse_as(ast)
203
+ end
204
+
205
+ it 'should correctly parse "b = []; b[1] ||= 10; b[2] &&= 11; b[3] += 12"' do
206
+ ruby = <<-ruby
207
+ b = []
208
+ b[1] ||= 10
209
+ b[2] &&= 11
210
+ b[3] += 12
211
+ ruby
212
+ ast = {:block=>
213
+ {:@array=>
214
+ [{:localvariableassignment=>
215
+ {:@variable=>nil,
216
+ :@name=>:b,
217
+ :@line=>1,
218
+ :@value=>{:emptyarray=>{:@line=>1}}}},
219
+ {:opassign1=>
220
+ {:@op=>:or,
221
+ :@index=>[{:fixnumliteral=>{:@line=>2, :@value=>1}}],
222
+ :@line=>2,
223
+ :@value=>{:fixnumliteral=>{:@line=>2, :@value=>10}},
224
+ :@receiver=>
225
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:b, :@line=>2}}}},
226
+ {:opassign1=>
227
+ {:@op=>:and,
228
+ :@index=>[{:fixnumliteral=>{:@line=>3, :@value=>2}}],
229
+ :@line=>3,
230
+ :@value=>{:fixnumliteral=>{:@line=>3, :@value=>11}},
231
+ :@receiver=>
232
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:b, :@line=>3}}}},
233
+ {:opassign1=>
234
+ {:@op=>:+,
235
+ :@index=>[{:fixnumliteral=>{:@line=>4, :@value=>3}}],
236
+ :@line=>4,
237
+ :@value=>{:fixnumliteral=>{:@line=>4, :@value=>12}},
238
+ :@receiver=>
239
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:b, :@line=>4}}}}],
240
+ :@line=>1}}
241
+
242
+ ruby.should parse_as(ast)
243
+ end
244
+
245
+ it 'should correctly parse "x.val ^= 8"' do
246
+ ruby = 'x.val ^= 8'
247
+ ast = {:opassign2=>
248
+ {:@op=>:^,
249
+ :@assign=>:val=,
250
+ :@name=>:val,
251
+ :@line=>1,
252
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>8}},
253
+ :@receiver=>
254
+ {:send=>
255
+ {:@block=>nil,
256
+ :@name=>:x,
257
+ :@line=>1,
258
+ :@privately=>true,
259
+ :@receiver=>{:self=>{:@line=>1}},
260
+ :@check_for_local=>false}}}}
261
+
262
+ ruby.should parse_as(ast)
263
+ end
264
+
265
+ it 'should correctly parse "self.Bag ||= Bag.new"' do
266
+ ruby = 'self.Bag ||= Bag.new'
267
+ ast = {:opassign2=>
268
+ {:@op=>:or,
269
+ :@assign=>:"Bag=",
270
+ :@name=>:Bag,
271
+ :@line=>1,
272
+ :@value=>
273
+ {:send=>
274
+ {:@block=>nil,
275
+ :@name=>:new,
276
+ :@line=>1,
277
+ :@privately=>false,
278
+ :@receiver=>{:constfind=>{:@name=>:Bag, :@line=>1}},
279
+ :@check_for_local=>false}},
280
+ :@receiver=>{:self=>{:@line=>1}}}}
281
+
282
+ ruby.should parse_as(ast)
283
+ end
284
+
285
+ it 'should correctly parse "s = Struct.new(:var); c = s.new(nil); c.var ||= 20; c.var &&= 21; c.var += 22; c.d.e.f ||= 42"' do
286
+ ruby = <<-ruby
287
+ s = Struct.new(:var)
288
+ c = s.new(nil)
289
+ c.var ||= 20
290
+ c.var &&= 21
291
+ c.var += 22
292
+ c.d.e.f ||= 42
293
+ ruby
294
+ ast = {:block=>
295
+ {:@array=>
296
+ [{:localvariableassignment=>
297
+ {:@variable=>nil,
298
+ :@name=>:s,
299
+ :@line=>1,
300
+ :@value=>
301
+ {:sendwitharguments=>
302
+ {:@block=>nil,
303
+ :@name=>:new,
304
+ :@line=>1,
305
+ :@privately=>false,
306
+ :@receiver=>{:constfind=>{:@name=>:Struct, :@line=>1}},
307
+ :@check_for_local=>false,
308
+ :@arguments=>
309
+ {:actualarguments=>
310
+ {:@array=>[{:symbolliteral=>{:@line=>1, :@value=>:var}}],
311
+ :@splat=>nil,
312
+ :@line=>1}}}}}},
313
+ {:localvariableassignment=>
314
+ {:@variable=>nil,
315
+ :@name=>:c,
316
+ :@line=>2,
317
+ :@value=>
318
+ {:sendwitharguments=>
319
+ {:@block=>nil,
320
+ :@name=>:new,
321
+ :@line=>2,
322
+ :@privately=>false,
323
+ :@receiver=>
324
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:s, :@line=>2}},
325
+ :@check_for_local=>false,
326
+ :@arguments=>
327
+ {:actualarguments=>{:@array=>[{}], :@splat=>nil, :@line=>2}}}}}},
328
+ {:opassign2=>
329
+ {:@op=>:or,
330
+ :@assign=>:var=,
331
+ :@name=>:var,
332
+ :@line=>3,
333
+ :@value=>{:fixnumliteral=>{:@line=>3, :@value=>20}},
334
+ :@receiver=>
335
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:c, :@line=>3}}}},
336
+ {:opassign2=>
337
+ {:@op=>:and,
338
+ :@assign=>:var=,
339
+ :@name=>:var,
340
+ :@line=>4,
341
+ :@value=>{:fixnumliteral=>{:@line=>4, :@value=>21}},
342
+ :@receiver=>
343
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:c, :@line=>4}}}},
344
+ {:opassign2=>
345
+ {:@op=>:+,
346
+ :@assign=>:var=,
347
+ :@name=>:var,
348
+ :@line=>5,
349
+ :@value=>{:fixnumliteral=>{:@line=>5, :@value=>22}},
350
+ :@receiver=>
351
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:c, :@line=>5}}}},
352
+ {:opassign2=>
353
+ {:@op=>:or,
354
+ :@assign=>:f=,
355
+ :@name=>:f,
356
+ :@line=>6,
357
+ :@value=>{:fixnumliteral=>{:@line=>6, :@value=>42}},
358
+ :@receiver=>
359
+ {:send=>
360
+ {:@block=>nil,
361
+ :@name=>:e,
362
+ :@line=>6,
363
+ :@privately=>false,
364
+ :@receiver=>
365
+ {:send=>
366
+ {:@block=>nil,
367
+ :@name=>:d,
368
+ :@line=>6,
369
+ :@privately=>false,
370
+ :@receiver=>
371
+ {:localvariableaccess=>
372
+ {:@variable=>nil, :@name=>:c, :@line=>6}},
373
+ :@check_for_local=>false}},
374
+ :@check_for_local=>false}}}}],
375
+ :@line=>1}}
376
+
377
+ ruby.should parse_as(ast)
378
+ end
379
+
380
+ it 'should correctly parse "@fetcher &&= new(Gem.configuration[:http_proxy])"' do
381
+ ruby = '@fetcher &&= new(Gem.configuration[:http_proxy])'
382
+ ast = {:opassignand=>
383
+ {:@line=>1,
384
+ :@left=>{:instancevariableaccess=>{:@name=>:@fetcher, :@line=>1}},
385
+ :@right=>
386
+ {:instancevariableassignment=>
387
+ {:@name=>:@fetcher,
388
+ :@line=>1,
389
+ :@value=>
390
+ {:sendwitharguments=>
391
+ {:@block=>nil,
392
+ :@name=>:new,
393
+ :@line=>1,
394
+ :@privately=>true,
395
+ :@receiver=>{:self=>{:@line=>1}},
396
+ :@check_for_local=>false,
397
+ :@arguments=>
398
+ {:actualarguments=>
399
+ {:@array=>
400
+ [{:sendwitharguments=>
401
+ {:@block=>nil,
402
+ :@name=>:[],
403
+ :@line=>1,
404
+ :@privately=>false,
405
+ :@receiver=>
406
+ {:send=>
407
+ {:@block=>nil,
408
+ :@name=>:configuration,
409
+ :@line=>1,
410
+ :@privately=>false,
411
+ :@receiver=>{:constfind=>{:@name=>:Gem, :@line=>1}},
412
+ :@check_for_local=>false}},
413
+ :@check_for_local=>false,
414
+ :@arguments=>
415
+ {:actualarguments=>
416
+ {:@array=>
417
+ [{:symbolliteral=>{:@line=>1, :@value=>:http_proxy}}],
418
+ :@splat=>nil,
419
+ :@line=>1}}}}],
420
+ :@splat=>nil,
421
+ :@line=>1}}}}}}}}
422
+
423
+ ruby.should parse_as(ast)
424
+ end
425
+
426
+ it 'should correctly parse "a = 0; a &&= 2"' do
427
+ ruby = <<-ruby
428
+ a = 0
429
+ a &&= 2
430
+ ruby
431
+ ast = {:block=>
432
+ {:@array=>
433
+ [{:localvariableassignment=>
434
+ {:@variable=>nil,
435
+ :@name=>:a,
436
+ :@line=>1,
437
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>0}}}},
438
+ {:opassignand=>
439
+ {:@line=>2,
440
+ :@left=>
441
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>2}},
442
+ :@right=>
443
+ {:localvariableassignment=>
444
+ {:@variable=>nil,
445
+ :@name=>:a,
446
+ :@line=>2,
447
+ :@value=>{:fixnumliteral=>{:@line=>2, :@value=>2}}}}}}],
448
+ :@line=>1}}
449
+
450
+ ruby.should parse_as(ast)
451
+ end
452
+
453
+ it 'should correctly parse "@@var ||= 3"' do
454
+ ruby = '@@var ||= 3'
455
+ ast = {:opassignor=>
456
+ {:@line=>1,
457
+ :@left=>{:classvariableaccess=>{:@name=>:@@var, :@line=>1}},
458
+ :@right=>
459
+ {:classvariableassignment=>
460
+ {:@name=>:@@var,
461
+ :@line=>1,
462
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>3}}}}}}
463
+
464
+ ruby.should parse_as(ast)
465
+ end
466
+
467
+ it 'should correctly parse "a ||= 8"' do
468
+ ruby = 'a ||= 8'
469
+ ast = {:opassignor=>
470
+ {:@line=>1,
471
+ :@left=>{:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>1}},
472
+ :@right=>
473
+ {:localvariableassignment=>
474
+ {:@variable=>nil,
475
+ :@name=>:a,
476
+ :@line=>1,
477
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>8}}}}}}
478
+
479
+ ruby.should parse_as(ast)
480
+ end
481
+
482
+ it 'should correctly parse "a ||= begin ..."' do
483
+ ruby = <<-ruby
484
+ a ||= begin
485
+ b
486
+ rescue
487
+ c
488
+ end
489
+ ruby
490
+ ast = {:opassignor=>
491
+ {:@line=>5,
492
+ :@left=>{:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>5}},
493
+ :@right=>
494
+ {:localvariableassignment=>
495
+ {:@variable=>nil,
496
+ :@name=>:a,
497
+ :@line=>1,
498
+ :@value=>
499
+ {:rescue=>
500
+ {:@body=>
501
+ {:send=>
502
+ {:@block=>nil,
503
+ :@name=>:b,
504
+ :@line=>2,
505
+ :@privately=>true,
506
+ :@receiver=>{:self=>{:@line=>2}},
507
+ :@check_for_local=>false}},
508
+ :@rescue=>
509
+ {:rescuecondition=>
510
+ {:@conditions=>
511
+ {:arrayliteral=>
512
+ {:@body=>[{:constfind=>{:@name=>:StandardError, :@line=>4}}],
513
+ :@line=>4}},
514
+ :@body=>
515
+ {:send=>
516
+ {:@block=>nil,
517
+ :@name=>:c,
518
+ :@line=>4,
519
+ :@privately=>true,
520
+ :@receiver=>{:self=>{:@line=>4}},
521
+ :@check_for_local=>false}},
522
+ :@splat=>nil,
523
+ :@next=>nil,
524
+ :@line=>4,
525
+ :@assignment=>nil}},
526
+ :@else=>nil,
527
+ :@line=>2}}}}}}
528
+
529
+ ruby.should parse_as(ast)
530
+ end
531
+
532
+ it 'should correctly parse "@fetcher ||= new(Gem.configuration[:http_proxy])"' do
533
+ ruby = '@fetcher ||= new(Gem.configuration[:http_proxy])'
534
+ ast = {:opassignor=>
535
+ {:@line=>1,
536
+ :@left=>{:instancevariableaccess=>{:@name=>:@fetcher, :@line=>1}},
537
+ :@right=>
538
+ {:instancevariableassignment=>
539
+ {:@name=>:@fetcher,
540
+ :@line=>1,
541
+ :@value=>
542
+ {:sendwitharguments=>
543
+ {:@block=>nil,
544
+ :@name=>:new,
545
+ :@line=>1,
546
+ :@privately=>true,
547
+ :@receiver=>{:self=>{:@line=>1}},
548
+ :@check_for_local=>false,
549
+ :@arguments=>
550
+ {:actualarguments=>
551
+ {:@array=>
552
+ [{:sendwitharguments=>
553
+ {:@block=>nil,
554
+ :@name=>:[],
555
+ :@line=>1,
556
+ :@privately=>false,
557
+ :@receiver=>
558
+ {:send=>
559
+ {:@block=>nil,
560
+ :@name=>:configuration,
561
+ :@line=>1,
562
+ :@privately=>false,
563
+ :@receiver=>{:constfind=>{:@name=>:Gem, :@line=>1}},
564
+ :@check_for_local=>false}},
565
+ :@check_for_local=>false,
566
+ :@arguments=>
567
+ {:actualarguments=>
568
+ {:@array=>
569
+ [{:symbolliteral=>{:@line=>1, :@value=>:http_proxy}}],
570
+ :@splat=>nil,
571
+ :@line=>1}}}}],
572
+ :@splat=>nil,
573
+ :@line=>1}}}}}}}}
574
+
575
+ ruby.should parse_as(ast)
576
+ end
577
+
578
+ it 'should correctly parse "@v ||= { }"' do
579
+ ruby = '@v ||= { }'
580
+ ast = {:opassignor=>
581
+ {:@line=>1,
582
+ :@left=>{:instancevariableaccess=>{:@name=>:@v, :@line=>1}},
583
+ :@right=>
584
+ {:instancevariableassignment=>
585
+ {:@name=>:@v,
586
+ :@line=>1,
587
+ :@value=>{:hashliteral=>{:@array=>[], :@line=>1}}}}}}
588
+
589
+ ruby.should parse_as(ast)
590
+ end
591
+
592
+ it 'should correctly parse "a = 0; a ||= 1"' do
593
+ ruby = <<-ruby
594
+ a = 0
595
+ a ||= 1
596
+ ruby
597
+ ast = {:block=>
598
+ {:@array=>
599
+ [{:localvariableassignment=>
600
+ {:@variable=>nil,
601
+ :@name=>:a,
602
+ :@line=>1,
603
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>0}}}},
604
+ {:opassignor=>
605
+ {:@line=>2,
606
+ :@left=>
607
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>2}},
608
+ :@right=>
609
+ {:localvariableassignment=>
610
+ {:@variable=>nil,
611
+ :@name=>:a,
612
+ :@line=>2,
613
+ :@value=>{:fixnumliteral=>{:@line=>2, :@value=>1}}}}}}],
614
+ :@line=>1}}
615
+
616
+ ruby.should parse_as(ast)
617
+ end
618
+
619
+ end