rubinius-melbourne 2.0.0.19 → 2.0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +14 -0
  4. data/Gemfile +4 -0
  5. data/Rakefile +31 -0
  6. data/ext/rubinius/melbourne/extconf.rb +9 -2
  7. data/lib/rubinius/melbourne.rb +1 -1
  8. data/lib/rubinius/melbourne/version.rb +1 -1
  9. data/rubinius-melbourne.gemspec +5 -3
  10. data/spec/alias_spec.rb +40 -0
  11. data/spec/and_spec.rb +19 -0
  12. data/spec/array_spec.rb +81 -0
  13. data/spec/attrasgn_spec.rb +112 -0
  14. data/spec/back_ref_spec.rb +11 -0
  15. data/spec/call_spec.rb +298 -0
  16. data/spec/case_spec.rb +234 -0
  17. data/spec/cdecl_spec.rb +45 -0
  18. data/spec/class_spec.rb +83 -0
  19. data/spec/colon2_spec.rb +7 -0
  20. data/spec/colon3_spec.rb +7 -0
  21. data/spec/const_spec.rb +7 -0
  22. data/spec/custom/matchers/parse_as.rb +27 -0
  23. data/spec/custom/runner/relates.rb +83 -0
  24. data/spec/cvar_spec.rb +29 -0
  25. data/spec/cvasgn_spec.rb +30 -0
  26. data/spec/cvdecl_spec.rb +12 -0
  27. data/spec/default.mspec +4 -0
  28. data/spec/defined_spec.rb +117 -0
  29. data/spec/defn_spec.rb +554 -0
  30. data/spec/defs_spec.rb +81 -0
  31. data/spec/dot2_spec.rb +7 -0
  32. data/spec/dot3_spec.rb +7 -0
  33. data/spec/dregx_spec.rb +52 -0
  34. data/spec/dstr_spec.rb +169 -0
  35. data/spec/dsym_spec.rb +10 -0
  36. data/spec/dxstr_spec.rb +11 -0
  37. data/spec/ensure_spec.rb +117 -0
  38. data/spec/false_spec.rb +7 -0
  39. data/spec/flip2_spec.rb +43 -0
  40. data/spec/flip3_spec.rb +27 -0
  41. data/spec/for_spec.rb +61 -0
  42. data/spec/gasgn_spec.rb +13 -0
  43. data/spec/gvar_spec.rb +25 -0
  44. data/spec/hash_spec.rb +31 -0
  45. data/spec/iasgn_spec.rb +25 -0
  46. data/spec/if_spec.rb +131 -0
  47. data/spec/iter_spec.rb +613 -0
  48. data/spec/lasgn_spec.rb +377 -0
  49. data/spec/lit_spec.rb +61 -0
  50. data/spec/masgn_spec.rb +406 -0
  51. data/spec/match2_spec.rb +19 -0
  52. data/spec/match3_spec.rb +24 -0
  53. data/spec/match_spec.rb +7 -0
  54. data/spec/module_spec.rb +47 -0
  55. data/spec/nil_spec.rb +7 -0
  56. data/spec/not_spec.rb +17 -0
  57. data/spec/nth_ref_spec.rb +7 -0
  58. data/spec/op_asgn_spec.rb +246 -0
  59. data/spec/or_spec.rb +35 -0
  60. data/spec/postexe_spec.rb +7 -0
  61. data/spec/regex_spec.rb +28 -0
  62. data/spec/rescue_spec.rb +359 -0
  63. data/spec/return_spec.rb +57 -0
  64. data/spec/sclass_spec.rb +55 -0
  65. data/spec/str_spec.rb +97 -0
  66. data/spec/super_spec.rb +93 -0
  67. data/spec/true_spec.rb +7 -0
  68. data/spec/undef_spec.rb +98 -0
  69. data/spec/until_spec.rb +140 -0
  70. data/spec/valias_spec.rb +7 -0
  71. data/spec/while_spec.rb +192 -0
  72. data/spec/xstr_spec.rb +7 -0
  73. data/spec/yield_spec.rb +65 -0
  74. data/spec/zsuper_spec.rb +45 -0
  75. metadata +171 -13
@@ -0,0 +1,7 @@
1
+ describe "A False node" do
2
+ relates "false" do
3
+ parse do
4
+ [:false]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,43 @@
1
+ describe "A Flip2 node" do
2
+ relates <<-ruby do
3
+ x = if ((i % 4) == 0)..((i % 3) == 0) then
4
+ i
5
+ else
6
+ nil
7
+ end
8
+ ruby
9
+
10
+ parse do
11
+ [:lasgn,
12
+ :x,
13
+ [:if,
14
+ [:flip2,
15
+ [:call,
16
+ [:call, [:call, nil, :i, [:arglist]], :%, [:arglist, [:lit, 4]]],
17
+ :==,
18
+ [:arglist, [:lit, 0]]],
19
+ [:call,
20
+ [:call, [:call, nil, :i, [:arglist]], :%, [:arglist, [:lit, 3]]],
21
+ :==,
22
+ [:arglist, [:lit, 0]]]],
23
+ [:call, nil, :i, [:arglist]],
24
+ [:nil]]]
25
+ end
26
+ end
27
+
28
+ relates <<-ruby do
29
+ if 1..2.a?(b) then
30
+ nil
31
+ end
32
+ ruby
33
+
34
+ parse do
35
+ [:if,
36
+ [:flip2,
37
+ [:lit, 1],
38
+ [:call, [:lit, 2], :a?, [:arglist, [:call, nil, :b, [:arglist]]]]],
39
+ [:nil],
40
+ nil]
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,27 @@
1
+ describe "A Flip3 node" do
2
+ relates <<-ruby do
3
+ x = if ((i % 4) == 0)...((i % 3) == 0) then
4
+ i
5
+ else
6
+ nil
7
+ end
8
+ ruby
9
+
10
+ parse do
11
+ [:lasgn,
12
+ :x,
13
+ [:if,
14
+ [:flip3,
15
+ [:call,
16
+ [:call, [:call, nil, :i, [:arglist]], :%, [:arglist, [:lit, 4]]],
17
+ :==,
18
+ [:arglist, [:lit, 0]]],
19
+ [:call,
20
+ [:call, [:call, nil, :i, [:arglist]], :%, [:arglist, [:lit, 3]]],
21
+ :==,
22
+ [:arglist, [:lit, 0]]]],
23
+ [:call, nil, :i, [:arglist]],
24
+ [:nil]]]
25
+ end
26
+ end
27
+ end
data/spec/for_spec.rb ADDED
@@ -0,0 +1,61 @@
1
+ describe "A For node" do
2
+ relates <<-ruby do
3
+ for o in ary do
4
+ puts(o)
5
+ end
6
+ ruby
7
+
8
+ parse do
9
+ [:for,
10
+ [:call, nil, :ary, [:arglist]],
11
+ [:lasgn, :o],
12
+ [:call, nil, :puts, [:arglist, [:lvar, :o]]]]
13
+ end
14
+ end
15
+
16
+ relates <<-ruby do
17
+ for i in (0..max) do
18
+ # do nothing
19
+ end
20
+ ruby
21
+
22
+ parse do
23
+ [:for, [:dot2, [:lit, 0], [:call, nil, :max, [:arglist]]], [:lasgn, :i]]
24
+ end
25
+ end
26
+
27
+ relates <<-ruby do
28
+ for a, b in x do
29
+ 5
30
+ end
31
+ ruby
32
+
33
+ parse do
34
+ [:for,
35
+ [:call, nil, :x, [:arglist]],
36
+ [:masgn, [:array, [:lasgn, :a], [:lasgn, :b]]],
37
+ [:lit, 5]]
38
+ end
39
+ end
40
+
41
+ relates <<-ruby do
42
+ for i in ()
43
+ i
44
+ end
45
+ ruby
46
+
47
+ parse do
48
+ [:for, [:nil], [:lasgn, :i], [:lvar, :i]]
49
+ end
50
+ end
51
+
52
+ relates <<-ruby do
53
+ c = 1
54
+ for i in a
55
+ for j in b
56
+ c
57
+ end
58
+ end
59
+ ruby
60
+ end
61
+ end
@@ -0,0 +1,13 @@
1
+ describe "A Gasgn node" do
2
+ relates "$x = 42" do
3
+ parse do
4
+ [:gasgn, :$x, [:lit, 42]]
5
+ end
6
+ end
7
+
8
+ relates "$a = *[1]" do
9
+ parse do
10
+ [:gasgn, :$a, [:svalue, [:splat, [:array, [:lit, 1]]]]]
11
+ end
12
+ end
13
+ end
data/spec/gvar_spec.rb ADDED
@@ -0,0 +1,25 @@
1
+ describe "A Gvar node" do
2
+ relates "$x" do
3
+ parse do
4
+ [:gvar, :$x]
5
+ end
6
+ end
7
+
8
+ relates "$stderr" do
9
+ parse do
10
+ [:gvar, :$stderr]
11
+ end
12
+ end
13
+
14
+ relates "$__blah" do
15
+ parse do
16
+ [:gvar, :$__blah]
17
+ end
18
+ end
19
+
20
+ relates "$_" do
21
+ parse do
22
+ [:gvar, :$_]
23
+ end
24
+ end
25
+ end
data/spec/hash_spec.rb ADDED
@@ -0,0 +1,31 @@
1
+ describe "A Hash node" do
2
+ relates "{ 1 => 2, 3 => 4 }" do
3
+ parse do
4
+ [:hash, [:lit, 1], [:lit, 2], [:lit, 3], [:lit, 4]]
5
+ end
6
+ end
7
+
8
+ relates "{ 1 => (2 rescue 3) }" do
9
+ parse do
10
+ [:hash, [:lit, 1], [:rescue, [:lit, 2], [:resbody, [:array], [:lit, 3]]]]
11
+ end
12
+ end
13
+
14
+ relates "{ 1 => [*1] }" do
15
+ parse do
16
+ [:hash, [:lit, 1], [:array, [:splat, [:lit, 1]]]]
17
+ end
18
+ end
19
+
20
+ relates <<-ruby do
21
+ a = 1
22
+ { :a => a }
23
+ ruby
24
+
25
+ parse do
26
+ [:block,
27
+ [:lasgn, :a, [:lit, 1]],
28
+ [:hash, [:lit, :a], [:lvar, :a]]]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ describe "A Iasgn node" do
2
+ relates "@a = 4" do
3
+ parse do
4
+ [:iasgn, :@a, [:lit, 4]]
5
+ end
6
+ end
7
+
8
+ relates "@a = *[1]" do
9
+ parse do
10
+ [:iasgn, :@a, [:svalue, [:splat, [:array, [:lit, 1]]]]]
11
+ end
12
+ end
13
+
14
+ relates <<-ruby do
15
+ a = 1
16
+ @a = a
17
+ ruby
18
+
19
+ parse do
20
+ [:block,
21
+ [:lasgn, :a, [:lit, 1]],
22
+ [:iasgn, :@a, [:lvar, :a]]]
23
+ end
24
+ end
25
+ end
data/spec/if_spec.rb ADDED
@@ -0,0 +1,131 @@
1
+ describe "An If node" do
2
+ relates <<-ruby do
3
+ if true then
4
+ 10
5
+ else
6
+ 12
7
+ end
8
+ ruby
9
+
10
+ parse do
11
+ [:if, [:true], [:lit, 10], [:lit, 12]]
12
+ end
13
+ end
14
+
15
+ relates "if b then a end" do
16
+ parse do
17
+ [:if, [:call, nil, :b, [:arglist]], [:call, nil, :a, [:arglist]], nil]
18
+ end
19
+ end
20
+
21
+ relates <<-ruby do
22
+ if (x = 5
23
+ (x + 1)) then
24
+ nil
25
+ end
26
+ ruby
27
+
28
+ parse do
29
+ [:if,
30
+ [:block,
31
+ [:lasgn, :x, [:lit, 5]],
32
+ [:call, [:lvar, :x], :+, [:arglist, [:lit, 1]]]],
33
+ [:nil],
34
+ nil]
35
+ end
36
+ end
37
+
38
+ relates <<-ruby do
39
+ if x = obj.x then
40
+ x.do_it
41
+ end
42
+ ruby
43
+
44
+ parse do
45
+ [:if,
46
+ [:lasgn, :x, [:call, [:call, nil, :obj, [:arglist]], :x, [:arglist]]],
47
+ [:call, [:lvar, :x], :do_it, [:arglist]],
48
+ nil]
49
+ end
50
+ end
51
+
52
+ relates "return if false unless true" do
53
+ parse do
54
+ [:if, [:true], nil, [:if, [:false], [:return], nil]]
55
+ end
56
+ end
57
+
58
+ relates "a if not b" do
59
+ parse do
60
+ [:if, [:call, nil, :b, [:arglist]], nil, [:call, nil, :a, [:arglist]]]
61
+ end
62
+ end
63
+
64
+ relates "a if b" do
65
+ parse do
66
+ [:if, [:call, nil, :b, [:arglist]], [:call, nil, :a, [:arglist]], nil]
67
+ end
68
+ end
69
+
70
+ relates "if not b then a end" do
71
+ parse do
72
+ [:if, [:call, nil, :b, [:arglist]], nil, [:call, nil, :a, [:arglist]]]
73
+ end
74
+ end
75
+
76
+ relates "if b then a end" do
77
+ parse do
78
+ [:if, [:call, nil, :b, [:arglist]], [:call, nil, :a, [:arglist]], nil]
79
+ end
80
+ end
81
+
82
+ nil_condition_sexp = [:if, [:nil], [:call, nil, :a, [:arglist]], nil]
83
+
84
+ relates "a if ()" do
85
+ parse do
86
+ nil_condition_sexp
87
+ end
88
+ end
89
+
90
+ relates "if () then a end" do
91
+ parse do
92
+ nil_condition_sexp
93
+ end
94
+ end
95
+
96
+ relates "a unless not ()" do
97
+ parse do
98
+ nil_condition_sexp
99
+ end
100
+ end
101
+
102
+ relates "unless not () then a end" do
103
+ parse do
104
+ nil_condition_sexp
105
+ end
106
+ end
107
+
108
+ relates "a unless not b" do
109
+ parse do
110
+ [:if, [:call, nil, :b, [:arglist]], [:call, nil, :a, [:arglist]], nil]
111
+ end
112
+ end
113
+
114
+ relates "a unless b" do
115
+ parse do
116
+ [:if, [:call, nil, :b, [:arglist]], nil, [:call, nil, :a, [:arglist]]]
117
+ end
118
+ end
119
+
120
+ relates "unless not b then a end" do
121
+ parse do
122
+ [:if, [:call, nil, :b, [:arglist]], [:call, nil, :a, [:arglist]], nil]
123
+ end
124
+ end
125
+
126
+ relates "unless b then a end" do
127
+ parse do
128
+ [:if, [:call, nil, :b, [:arglist]], nil, [:call, nil, :a, [:arglist]]]
129
+ end
130
+ end
131
+ end
data/spec/iter_spec.rb ADDED
@@ -0,0 +1,613 @@
1
+ describe "An Iter node" do
2
+ relates "m { }" do
3
+ parse do
4
+ [:iter, [:call, nil, :m, [:arglist]], nil]
5
+ end
6
+ end
7
+
8
+ relates "m do end" do
9
+ parse do
10
+ [:iter, [:call, nil, :m, [:arglist]], nil]
11
+ end
12
+ end
13
+
14
+ relates "m { x }" do
15
+ parse do
16
+ [:iter,
17
+ [:call, nil, :m, [:arglist]],
18
+ nil,
19
+ [:call, nil, :x, [:arglist]]]
20
+ end
21
+ end
22
+
23
+ relates "m { || x }" do
24
+ parse do
25
+ [:iter,
26
+ [:call, nil, :m, [:arglist]],
27
+ 0,
28
+ [:call, nil, :x, [:arglist]]]
29
+ end
30
+ end
31
+
32
+ relates "m { |a| a + x }" do
33
+ parse do
34
+ [:iter,
35
+ [:call, nil, :m, [:arglist]],
36
+ [:lasgn, :a],
37
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]]]
38
+ end
39
+ end
40
+
41
+ relates "m { |*| x }" do
42
+ parse do
43
+ [:iter,
44
+ [:call, nil, :m, [:arglist]],
45
+ [:masgn, [:array, [:splat]]],
46
+ [:call, nil, :x, [:arglist]]]
47
+ end
48
+ end
49
+
50
+ relates "m { |*c| x; c }" do
51
+ parse do
52
+ [:iter,
53
+ [:call, nil, :m, [:arglist]],
54
+ [:masgn, [:array, [:splat, [:lasgn, :c]]]],
55
+ [:block, [:call, nil, :x, [:arglist]], [:lvar, :c]]]
56
+ end
57
+ end
58
+
59
+ relates "m { |a, | a + x }" do
60
+ parse do
61
+ [:iter,
62
+ [:call, nil, :m, [:arglist]],
63
+ [:masgn, [:array, [:lasgn, :a]]],
64
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]]]
65
+ end
66
+ end
67
+
68
+ relates "m { |a, *| a + x }" do
69
+ parse do
70
+ [:iter,
71
+ [:call, nil, :m, [:arglist]],
72
+ [:masgn, [:array, [:lasgn, :a], [:splat]]],
73
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]]]
74
+ end
75
+ end
76
+
77
+ relates "m { |a, *c| a + x; c }" do
78
+ parse do
79
+ [:iter,
80
+ [:call, nil, :m, [:arglist]],
81
+ [:masgn, [:array, [:lasgn, :a], [:splat, [:lasgn, :c]]]],
82
+ [:block,
83
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]],
84
+ [:lvar, :c]]]
85
+ end
86
+ end
87
+
88
+ relates "m { |a, b| a + x; b }" do
89
+ parse do
90
+ [:iter,
91
+ [:call, nil, :m, [:arglist]],
92
+ [:masgn, [:array, [:lasgn, :a], [:lasgn, :b]]],
93
+ [:block,
94
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]],
95
+ [:lvar, :b]]]
96
+ end
97
+ end
98
+
99
+ relates "m { |a, b, | a + x; b }" do
100
+ parse do
101
+ [:iter,
102
+ [:call, nil, :m, [:arglist]],
103
+ [:masgn, [:array, [:lasgn, :a], [:lasgn, :b]]],
104
+ [:block,
105
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]],
106
+ [:lvar, :b]]]
107
+ end
108
+ end
109
+
110
+ relates "m { |a, b, *| a + x; b }" do
111
+ parse do
112
+ [:iter,
113
+ [:call, nil, :m, [:arglist]],
114
+ [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:splat]]],
115
+ [:block,
116
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]],
117
+ [:lvar, :b]]]
118
+ end
119
+ end
120
+
121
+ masgn_rest_arg_block = lambda do |g|
122
+ g.push :self
123
+
124
+ g.in_block_send :m, :rest, -3 do |d|
125
+ d.push_local 0
126
+ d.push :self
127
+ d.send :x, 0, true
128
+ d.send :+, 1, false
129
+ d.pop
130
+ d.push_local 1
131
+ d.pop
132
+ d.push_local 2
133
+ end
134
+ end
135
+
136
+ relates "m { |a, b, *c| a + x; b; c }" do
137
+ parse do
138
+ [:iter,
139
+ [:call, nil, :m, [:arglist]],
140
+ [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:splat, [:lasgn, :c]]]],
141
+ [:block,
142
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]],
143
+ [:lvar, :b],
144
+ [:lvar, :c]]]
145
+ end
146
+ end
147
+
148
+ relates "m do |a, b, *c| a + x; b; c end" do
149
+ parse do
150
+ [:iter,
151
+ [:call, nil, :m, [:arglist]],
152
+ [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:splat, [:lasgn, :c]]]],
153
+ [:block,
154
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]],
155
+ [:lvar, :b],
156
+ [:lvar, :c]]]
157
+ end
158
+ end
159
+
160
+ relates "m { n = 1; n }" do
161
+ parse do
162
+ [:iter,
163
+ [:call, nil, :m, [:arglist]],
164
+ nil,
165
+ [:block, [:lasgn, :n, [:lit, 1]], [:lvar, :n]]]
166
+ end
167
+ end
168
+
169
+ relates "m { n = 1; m { n } }" do
170
+ parse do
171
+ [:iter,
172
+ [:call, nil, :m, [:arglist]],
173
+ nil,
174
+ [:block,
175
+ [:lasgn, :n, [:lit, 1]],
176
+ [:iter, [:call, nil, :m, [:arglist]], nil, [:lvar, :n]]]]
177
+ end
178
+ end
179
+
180
+ relates "n = 1; m { n = 2 }; n" do
181
+ parse do
182
+ [:block,
183
+ [:lasgn, :n, [:lit, 1]],
184
+ [:iter, [:call, nil, :m, [:arglist]], nil, [:lasgn, :n, [:lit, 2]]],
185
+ [:lvar, :n]]
186
+ end
187
+ end
188
+
189
+ relates "m(a) { |b| a + x }" do
190
+ parse do
191
+ [:iter,
192
+ [:call, nil, :m, [:arglist, [:call, nil, :a, [:arglist]]]],
193
+ [:lasgn, :b],
194
+ [:call,
195
+ [:call, nil, :a, [:arglist]],
196
+ :+,
197
+ [:arglist, [:call, nil, :x, [:arglist]]]]]
198
+ end
199
+ end
200
+
201
+ relates <<-ruby do
202
+ m { |a|
203
+ a + x
204
+ }
205
+ ruby
206
+
207
+ parse do
208
+ [:iter,
209
+ [:call, nil, :m, [:arglist]],
210
+ [:lasgn, :a],
211
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]]]
212
+ end
213
+ end
214
+
215
+ relates <<-ruby do
216
+ m do |a|
217
+ a + x
218
+ end
219
+ ruby
220
+
221
+ parse do
222
+ [:iter,
223
+ [:call, nil, :m, [:arglist]],
224
+ [:lasgn, :a],
225
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]]]
226
+ end
227
+ end
228
+
229
+ relates "obj.m { |a| a + x }" do
230
+ parse do
231
+ [:iter,
232
+ [:call, [:call, nil, :obj, [:arglist]], :m, [:arglist]],
233
+ [:lasgn, :a],
234
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]]]
235
+ end
236
+ end
237
+
238
+ relates "obj.m(x) { |a| a + x }" do
239
+ parse do
240
+ [:iter,
241
+ [:call,
242
+ [:call, nil, :obj, [:arglist]],
243
+ :m,
244
+ [:arglist, [:call, nil, :x, [:arglist]]]],
245
+ [:lasgn, :a],
246
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]]]
247
+ end
248
+ end
249
+
250
+ relates "obj.m(a) { |a| a + x }" do
251
+ parse do
252
+ [:iter,
253
+ [:call,
254
+ [:call, nil, :obj, [:arglist]],
255
+ :m,
256
+ [:arglist, [:call, nil, :a, [:arglist]]]],
257
+ [:lasgn, :a],
258
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]]]
259
+ end
260
+ end
261
+
262
+ relates "a = 1; m { |a| a + x }" do
263
+ parse do
264
+ [:block,
265
+ [:lasgn, :a, [:lit, 1]],
266
+ [:iter,
267
+ [:call, nil, :m, [:arglist]],
268
+ [:lasgn, :a],
269
+ [:call, [:lvar, :a], :+, [:arglist, [:call, nil, :x, [:arglist]]]]]]
270
+ end
271
+ end
272
+
273
+ relates <<-ruby do
274
+ x = nil
275
+ m do |a|
276
+ begin
277
+ x
278
+ rescue Exception => x
279
+ break
280
+ ensure
281
+ x = a
282
+ end
283
+ end
284
+ ruby
285
+
286
+ parse do
287
+ [:block,
288
+ [:lasgn, :x, [:nil]],
289
+ [:iter,
290
+ [:call, nil, :m, [:arglist]],
291
+ [:lasgn, :a],
292
+ [:ensure,
293
+ [:rescue,
294
+ [:lvar, :x],
295
+ [:resbody,
296
+ [:array, [:const, :Exception], [:lasgn, :x, [:gvar, :$!]]],
297
+ [:break]]],
298
+ [:lasgn, :x, [:lvar, :a]]]]]
299
+ end
300
+ end
301
+
302
+ relates "m { next }" do
303
+ parse do
304
+ [:iter, [:call, nil, :m, [:arglist]], nil, [:next]]
305
+ end
306
+ end
307
+
308
+ relates "m { next if x }" do
309
+ parse do
310
+ [:iter,
311
+ [:call, nil, :m, [:arglist]],
312
+ nil,
313
+ [:if, [:call, nil, :x, [:arglist]], [:next], nil]]
314
+ end
315
+ end
316
+
317
+ relates "m { next x }" do
318
+ parse do
319
+ [:iter,
320
+ [:call, nil, :m, [:arglist]],
321
+ nil,
322
+ [:next, [:call, nil, :x, [:arglist]]]]
323
+ end
324
+ end
325
+
326
+ relates "m { x = 1; next x }" do
327
+ parse do
328
+ [:iter,
329
+ [:call, nil, :m, [:arglist]],
330
+ nil,
331
+ [:block,
332
+ [:lasgn, :x, [:lit, 1]],
333
+ [:next, [:lvar, :x]]]]
334
+ end
335
+ end
336
+
337
+ relates "m { next [1] }" do
338
+ parse do
339
+ [:iter, [:call, nil, :m, [:arglist]], nil, [:next, [:array, [:lit, 1]]]]
340
+ end
341
+ end
342
+
343
+ relates "m { next *[1] }" do
344
+ parse do
345
+ [:iter,
346
+ [:call, nil, :m, [:arglist]],
347
+ nil,
348
+ [:next, [:svalue, [:splat, [:array, [:lit, 1]]]]]]
349
+ end
350
+ end
351
+
352
+ relates "m { next [*[1]] }" do
353
+ parse do
354
+ [:iter,
355
+ [:call, nil, :m, [:arglist]],
356
+ nil,
357
+ [:next, [:array, [:splat, [:array, [:lit, 1]]]]]]
358
+ end
359
+ end
360
+
361
+ relates "m { next *[1, 2] }" do
362
+ parse do
363
+ [:iter,
364
+ [:call, nil, :m, [:arglist]],
365
+ nil,
366
+ [:next, [:svalue, [:splat, [:array, [:lit, 1], [:lit, 2]]]]]]
367
+ end
368
+ end
369
+
370
+ relates "m { next [*[1, 2]] }" do
371
+ parse do
372
+ [:iter,
373
+ [:call, nil, :m, [:arglist]],
374
+ nil,
375
+ [:next, [:array, [:splat, [:array, [:lit, 1], [:lit, 2]]]]]]
376
+ end
377
+ end
378
+
379
+ relates "m { break }" do
380
+ parse do
381
+ [:iter, [:call, nil, :m, [:arglist]], nil, [:break]]
382
+ end
383
+ end
384
+
385
+ relates "m { break if x }" do
386
+ parse do
387
+ [:iter,
388
+ [:call, nil, :m, [:arglist]],
389
+ nil,
390
+ [:if, [:call, nil, :x, [:arglist]], [:break], nil]]
391
+ end
392
+ end
393
+
394
+ relates "m { break x }" do
395
+ parse do
396
+ [:iter,
397
+ [:call, nil, :m, [:arglist]],
398
+ nil,
399
+ [:break, [:call, nil, :x, [:arglist]]]]
400
+ end
401
+ end
402
+
403
+ relates "m { x = 1; break x }" do
404
+ parse do
405
+ [:iter,
406
+ [:call, nil, :m, [:arglist]],
407
+ nil,
408
+ [:block,
409
+ [:lasgn, :x, [:lit, 1]],
410
+ [:break, [:lvar, :x]]]]
411
+ end
412
+ end
413
+
414
+ relates "m { break [1] }" do
415
+ parse do
416
+ [:iter,
417
+ [:call, nil, :m, [:arglist]],
418
+ nil,
419
+ [:break, [:array, [:lit, 1]]]]
420
+ end
421
+ end
422
+
423
+ relates "m { break *[1] }" do
424
+ parse do
425
+ [:iter,
426
+ [:call, nil, :m, [:arglist]],
427
+ nil,
428
+ [:break, [:svalue, [:splat, [:array, [:lit, 1]]]]]]
429
+ end
430
+ end
431
+
432
+ relates "m { break [*[1]] }" do
433
+ parse do
434
+ [:iter,
435
+ [:call, nil, :m, [:arglist]],
436
+ nil,
437
+ [:break, [:array, [:splat, [:array, [:lit, 1]]]]]]
438
+ end
439
+ end
440
+
441
+ relates "m { break *[1, 2] }" do
442
+ parse do
443
+ [:iter,
444
+ [:call, nil, :m, [:arglist]],
445
+ nil,
446
+ [:break, [:svalue, [:splat, [:array, [:lit, 1], [:lit, 2]]]]]]
447
+ end
448
+ end
449
+
450
+ relates "m { break [*[1, 2]] }" do
451
+ parse do
452
+ [:iter,
453
+ [:call, nil, :m, [:arglist]],
454
+ nil,
455
+ [:break, [:array, [:splat, [:array, [:lit, 1], [:lit, 2]]]]]]
456
+ end
457
+ end
458
+
459
+ relates "m { return }" do
460
+ parse do
461
+ [:iter, [:call, nil, :m, [:arglist]], nil, [:return]]
462
+ end
463
+ end
464
+
465
+ relates "m { return if x }" do
466
+ parse do
467
+ [:iter,
468
+ [:call, nil, :m, [:arglist]],
469
+ nil,
470
+ [:if, [:call, nil, :x, [:arglist]], [:return], nil]]
471
+ end
472
+ end
473
+
474
+ relates "m { return x }" do
475
+ parse do
476
+ [:iter,
477
+ [:call, nil, :m, [:arglist]],
478
+ nil,
479
+ [:return, [:call, nil, :x, [:arglist]]]]
480
+ end
481
+ end
482
+
483
+ relates "m { x = 1; return x }" do
484
+ parse do
485
+ [:iter,
486
+ [:call, nil, :m, [:arglist]],
487
+ nil,
488
+ [:block,
489
+ [:lasgn, :x, [:lit, 1]],
490
+ [:return, [:lvar, :x]]]]
491
+ end
492
+ end
493
+
494
+ relates "m { return [1] }" do
495
+ parse do
496
+ [:iter,
497
+ [:call, nil, :m, [:arglist]],
498
+ nil,
499
+ [:return, [:array, [:lit, 1]]]]
500
+ end
501
+ end
502
+
503
+ relates "m { return *[1] }" do
504
+ parse do
505
+ [:iter,
506
+ [:call, nil, :m, [:arglist]],
507
+ nil,
508
+ [:return, [:svalue, [:splat, [:array, [:lit, 1]]]]]]
509
+ end
510
+ end
511
+
512
+ relates "m { return [*[1]] }" do
513
+ parse do
514
+ [:iter,
515
+ [:call, nil, :m, [:arglist]],
516
+ nil,
517
+ [:return, [:array, [:splat, [:array, [:lit, 1]]]]]]
518
+ end
519
+ end
520
+
521
+ relates "m { return *[1, 2] }" do
522
+ parse do
523
+ [:iter,
524
+ [:call, nil, :m, [:arglist]],
525
+ nil,
526
+ [:return, [:svalue, [:splat, [:array, [:lit, 1], [:lit, 2]]]]]]
527
+ end
528
+ end
529
+
530
+ relates "m { return [*[1, 2]] }" do
531
+ parse do
532
+ [:iter,
533
+ [:call, nil, :m, [:arglist]],
534
+ nil,
535
+ [:return, [:array, [:splat, [:array, [:lit, 1], [:lit, 2]]]]]]
536
+ end
537
+ end
538
+
539
+ relates "m { redo }" do
540
+ parse do
541
+ [:iter, [:call, nil, :m, [:arglist]], nil, [:redo]]
542
+ end
543
+ end
544
+
545
+ relates "m { redo if x }" do
546
+ parse do
547
+ [:iter,
548
+ [:call, nil, :m, [:arglist]],
549
+ nil,
550
+ [:if, [:call, nil, :x, [:arglist]], [:redo], nil]]
551
+ end
552
+ end
553
+
554
+ relates "m(a) { retry }" do
555
+ parse do
556
+ [:iter,
557
+ [:call, nil, :m, [:arglist, [:call, nil, :a, [:arglist]]]],
558
+ nil,
559
+ [:retry]]
560
+ end
561
+
562
+ # TODO
563
+ end
564
+
565
+ relates "m(a) { retry if x }" do
566
+ parse do
567
+ [:iter,
568
+ [:call, nil, :m, [:arglist, [:call, nil, :a, [:arglist]]]],
569
+ nil,
570
+ [:if, [:call, nil, :x, [:arglist]], [:retry], nil]]
571
+ end
572
+
573
+ # TODO
574
+ end
575
+
576
+ relates "break" do
577
+ parse do
578
+ [:break]
579
+ end
580
+ end
581
+
582
+ relates "redo" do
583
+ parse do
584
+ [:redo]
585
+ end
586
+ end
587
+
588
+ relates "retry" do
589
+ parse do
590
+ [:retry]
591
+ end
592
+ end
593
+
594
+ relates "next" do
595
+ parse do
596
+ [:next]
597
+ end
598
+ end
599
+
600
+ relates <<-ruby do
601
+ def x(a)
602
+ bar { super }
603
+ end
604
+ ruby
605
+
606
+ parse do
607
+ [:defn,
608
+ :x,
609
+ [:args, :a],
610
+ [:scope, [:block, [:iter, [:call, nil, :bar, [:arglist]], nil, [:zsuper]]]]]
611
+ end
612
+ end
613
+ end