rubinius-melbourne 2.0.0.19 → 2.0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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