1
1
Code . require_file "../test_helper.exs" , __DIR__
2
2
3
- defrecord BadRange , first: 0 , last: 0 do
3
+ defrecord Rec , first: 0 , last: 0
4
+
5
+ defrecord BadRec , first: 0 , last: 0 do
4
6
defoverridable [ first: 1 ]
5
7
6
8
def first ( _ ) do
@@ -67,11 +69,11 @@ defmodule Kernel.RecordRewriterTest do
67
69
end
68
70
69
71
test "with tuple match" do
70
- clause = clause ( fn ( { x , y } = { Macro.Env [ ], Range [ ] } ) -> :foo end )
71
- assert optimize_clause ( clause ) == { clause , [ x: Macro.Env , y: Range ] , nil }
72
+ clause = clause ( fn ( { x , y } = { Macro.Env [ ], Rec [ ] } ) -> :foo end )
73
+ assert optimize_clause ( clause ) == { clause , [ x: Macro.Env , y: Rec ] , nil }
72
74
73
- clause = clause ( fn ( { Macro.Env [ ], y } = { x , Range [ ] } ) -> :foo end )
74
- assert optimize_clause ( clause ) == { clause , [ x: Macro.Env , y: Range ] , nil }
75
+ clause = clause ( fn ( { Macro.Env [ ], y } = { x , Rec [ ] } ) -> :foo end )
76
+ assert optimize_clause ( clause ) == { clause , [ x: Macro.Env , y: Rec ] , nil }
75
77
end
76
78
77
79
test "inside body" do
@@ -80,13 +82,13 @@ defmodule Kernel.RecordRewriterTest do
80
82
end
81
83
82
84
test "inside body with variable overridden" do
83
- clause = clause ( fn ( x = Macro.Env [ ], y = Range [ ]) -> y = x end )
84
- assert optimize_clause ( clause ) == { clause , [ x: Macro.Env , y: Range , "y@1": Macro.Env ] , { Macro.Env , nil } }
85
+ clause = clause ( fn ( x = Macro.Env [ ], y = Rec [ ]) -> y = x end )
86
+ assert optimize_clause ( clause ) == { clause , [ x: Macro.Env , y: Rec , "y@1": Macro.Env ] , { Macro.Env , nil } }
85
87
end
86
88
87
89
test "inside body with nested tuple" do
88
- clause = clause ( fn ( x = Range [ ]) -> ^ x = Range [ first : { :hello , 2 } ] end )
89
- assert optimize_clause ( clause ) == { clause , [ x: Range ] , { Range , [ nil , { :hello , nil } , nil ] } }
90
+ clause = clause ( fn ( x = Rec [ ]) -> ^ x = Rec [ first : { :hello , 2 } ] end )
91
+ assert optimize_clause ( clause ) == { clause , [ x: Rec ] , { Rec , [ nil , { :hello , nil } , nil ] } }
90
92
end
91
93
92
94
test "with setelement" do
@@ -102,7 +104,7 @@ defmodule Kernel.RecordRewriterTest do
102
104
end
103
105
104
106
test "conflicting definition" do
105
- clause = clause ( fn ( x = Macro.Env [ ]) -> ^ x = Range [ ]; :foo end )
107
+ clause = clause ( fn ( x = Macro.Env [ ]) -> ^ x = Rec [ ]; :foo end )
106
108
assert optimize_clause ( clause ) == { clause , [ x: nil ] , nil }
107
109
end
108
110
@@ -132,13 +134,13 @@ defmodule Kernel.RecordRewriterTest do
132
134
end
133
135
134
136
test "inside local call" do
135
- clause = clause ( fn -> ( x = Macro.Env [ ]) . ( y = Range [ ]) end )
136
- assert optimize_clause ( clause ) == { clause , [ x: Macro.Env , y: Range ] , nil }
137
+ clause = clause ( fn -> ( x = Macro.Env [ ]) . ( y = Rec [ ]) end )
138
+ assert optimize_clause ( clause ) == { clause , [ x: Macro.Env , y: Rec ] , nil }
137
139
end
138
140
139
141
test "inside remote call" do
140
- clause = clause ( fn -> x . call ( y = Range [ ]) end )
141
- assert optimize_clause ( clause ) == { clause , [ y: Range ] , nil }
142
+ clause = clause ( fn -> x . call ( y = Rec [ ]) end )
143
+ assert optimize_clause ( clause ) == { clause , [ y: Rec ] , nil }
142
144
end
143
145
144
146
test "inside list comprehension" do
@@ -161,19 +163,19 @@ defmodule Kernel.RecordRewriterTest do
161
163
clause = clause ( fn -> case something do 1 -> x = Macro.Env [ ]; 2 -> x = Macro.Env [ ] end end )
162
164
assert optimize_clause ( clause ) == { clause , [ x: Macro.Env ] , { Macro.Env , nil } }
163
165
164
- clause = clause ( fn -> case something do 1 -> x = Macro.Env [ ]; 2 -> x = Range [ ] end end )
166
+ clause = clause ( fn -> case something do 1 -> x = Macro.Env [ ]; 2 -> x = Rec [ ] end end )
165
167
assert optimize_clause ( clause ) == { clause , [ x: nil ] , nil }
166
168
167
- clause = clause ( fn -> case something do x = Macro.Env [ ] -> x ; x = Range [ ] -> x; _ -> :ok end end )
169
+ clause = clause ( fn -> case something do x = Macro.Env [ ] -> x ; x = Rec [ ] -> x; _ -> :ok end end )
168
170
assert optimize_clause ( clause ) == { clause , [ ] , nil }
169
171
end
170
172
171
173
test "inside case with nested tuple" do
172
- clause = clause ( fn -> case something do x = Range [ first : { :foo , 2 } ] -> x = x ; Range [ ] = x -> x = x end end )
173
- assert optimize_clause ( clause ) == { clause , [ "x@4": Range ] , { Range , nil } }
174
+ clause = clause ( fn -> case something do x = Rec [ first : { :foo , 2 } ] -> x = x ; Rec [ ] = x -> x = x end end )
175
+ assert optimize_clause ( clause ) == { clause , [ "x@4": Rec ] , { Rec , nil } }
174
176
175
- clause = clause ( fn -> case something do x = Range [ first : { :foo , 2 } ] -> x = x ; Range [ first : { :foo , 2 } ] = x -> x = x end end )
176
- assert optimize_clause ( clause ) == { clause , [ "x@4": Range ] , { Range , [ nil , { :foo , nil } , nil ] } }
177
+ clause = clause ( fn -> case something do x = Rec [ first : { :foo , 2 } ] -> x = x ; Rec [ first : { :foo , 2 } ] = x -> x = x end end )
178
+ assert optimize_clause ( clause ) == { clause , [ "x@4": Rec ] , { Rec , [ nil , { :foo , nil } , nil ] } }
177
179
end
178
180
179
181
test "empty receive" do
@@ -188,15 +190,15 @@ defmodule Kernel.RecordRewriterTest do
188
190
clause = clause ( fn -> receive do 1 -> x = Macro.Env [ ]; 2 -> x = Macro.Env [ ] end end )
189
191
assert optimize_clause ( clause ) == { clause , [ x: Macro.Env ] , { Macro.Env , nil } }
190
192
191
- clause = clause ( fn -> receive do 1 -> x = Macro.Env [ ]; 2 -> x = Range [ ] end end )
193
+ clause = clause ( fn -> receive do 1 -> x = Macro.Env [ ]; 2 -> x = Rec [ ] end end )
192
194
assert optimize_clause ( clause ) == { clause , [ x: nil ] , nil }
193
195
end
194
196
195
197
test "inside receive with after" do
196
198
clause = clause ( fn -> receive do 1 -> x = Macro.Env [ ]; after 2 -> x = Macro.Env [ ]; end end )
197
199
assert optimize_clause ( clause ) == { clause , [ x: Macro.Env ] , { Macro.Env , nil } }
198
200
199
- clause = clause ( fn -> receive do 1 -> x = Macro.Env [ ]; after 2 -> x = Range [ ]; end end )
201
+ clause = clause ( fn -> receive do 1 -> x = Macro.Env [ ]; after 2 -> x = Rec [ ]; end end )
200
202
assert optimize_clause ( clause ) == { clause , [ x: nil ] , nil }
201
203
end
202
204
@@ -215,54 +217,54 @@ defmodule Kernel.RecordRewriterTest do
215
217
216
218
test "getter call is rewriten" do
217
219
{ clause , rewriten } =
218
- { clause ( fn ( x = Range [ ]) -> x . first end ) , clause ( fn ( x = Range [ ]) -> :erlang . element ( 2 , x ) end ) }
220
+ { clause ( fn ( x = Rec [ ]) -> x . first end ) , clause ( fn ( x = Rec [ ]) -> :erlang . element ( 2 , x ) end ) }
219
221
220
- assert optimize_clause ( clause ) == { rewriten , [ x: Range ] , nil }
222
+ assert optimize_clause ( clause ) == { rewriten , [ x: Rec ] , nil }
221
223
end
222
224
223
225
test "direct getter call is rewriten" do
224
226
{ clause , rewriten } =
225
- { clause ( fn ( ) -> Range [ ]. first end ) , clause ( fn ( ) -> :erlang . element ( 2 , Range [ ]) end ) }
227
+ { clause ( fn ( ) -> Rec [ ]. first end ) , clause ( fn ( ) -> :erlang . element ( 2 , Rec [ ]) end ) }
226
228
227
229
assert optimize_clause ( clause ) == { rewriten , [ ] , nil }
228
230
end
229
231
230
232
test "setter call is rewriten" do
231
233
{ clause , rewriten } =
232
- { clause ( fn ( x = Range [ ]) -> x . first ( :first ) end ) , clause ( fn ( x = Range [ ]) -> :erlang . setelement ( 2 , x , :first ) end ) }
234
+ { clause ( fn ( x = Rec [ ]) -> x . first ( :first ) end ) , clause ( fn ( x = Rec [ ]) -> :erlang . setelement ( 2 , x , :first ) end ) }
233
235
234
- assert optimize_clause ( clause ) == { rewriten , [ x: Range ] , { Range , nil } }
236
+ assert optimize_clause ( clause ) == { rewriten , [ x: Rec ] , { Rec , nil } }
235
237
end
236
238
237
239
test "nested setter call is rewriten" do
238
240
{ clause , rewriten } =
239
- { clause ( fn ( x = Range [ ]) -> x . first ( :first ) . last ( :last ) end ) , clause ( fn ( x = Range [ ]) -> :erlang . setelement ( 3 , :erlang . setelement ( 2 , x , :first ) , :last ) end ) }
241
+ { clause ( fn ( x = Rec [ ]) -> x . first ( :first ) . last ( :last ) end ) , clause ( fn ( x = Rec [ ]) -> :erlang . setelement ( 3 , :erlang . setelement ( 2 , x , :first ) , :last ) end ) }
240
242
241
- assert optimize_clause ( clause ) == { rewriten , [ x: Range ] , { Range , nil } }
243
+ assert optimize_clause ( clause ) == { rewriten , [ x: Rec ] , { Rec , nil } }
242
244
end
243
245
244
246
test "updater call is rewriten" do
245
247
{ clause , rewriten } =
246
- { clause ( fn ( x = Range [ ]) -> x . update_first ( & ( & 1 + 1 ) ) end ) , clause ( fn ( x = Range [ ]) -> Range . update_first ( & ( & 1 + 1 ) , x ) end ) }
247
- assert optimize_clause ( clause ) == { rewriten , [ x: Range ] , { Range , nil } }
248
+ { clause ( fn ( x = Rec [ ]) -> x . update_first ( & ( & 1 + 1 ) ) end ) , clause ( fn ( x = Rec [ ]) -> Rec . update_first ( & ( & 1 + 1 ) , x ) end ) }
249
+ assert optimize_clause ( clause ) == { rewriten , [ x: Rec ] , { Rec , nil } }
248
250
end
249
251
250
252
test "update call is rewriten" do
251
253
{ clause , rewriten } =
252
- { clause ( fn ( x = Range [ ]) -> x . update ( first: 1 ) end ) , clause ( fn ( x = Range [ ]) -> Range . update ( [ first: 1 ] , x ) end ) }
253
- assert optimize_clause ( clause ) == { rewriten , [ x: Range ] , { Range , nil } }
254
+ { clause ( fn ( x = Rec [ ]) -> x . update ( first: 1 ) end ) , clause ( fn ( x = Rec [ ]) -> Rec . update ( [ first: 1 ] , x ) end ) }
255
+ assert optimize_clause ( clause ) == { rewriten , [ x: Rec ] , { Rec , nil } }
254
256
end
255
257
256
258
test "fallback for unknown fields" do
257
259
{ clause , rewriten } =
258
- { clause ( fn ( x = Range [ ]) -> x . unknown ( 1 , 2 ) end ) , clause ( fn ( x = Range [ ]) -> Range . unknown ( 1 , 2 , x ) end ) }
259
- assert optimize_clause ( clause ) == { rewriten , [ x: Range ] , nil }
260
+ { clause ( fn ( x = Rec [ ]) -> x . unknown ( 1 , 2 ) end ) , clause ( fn ( x = Rec [ ]) -> Rec . unknown ( 1 , 2 , x ) end ) }
261
+ assert optimize_clause ( clause ) == { rewriten , [ x: Rec ] , nil }
260
262
end
261
263
262
264
test "fallback for rewriten fields" do
263
265
{ clause , rewriten } =
264
- { clause ( fn ( x = BadRange [ ]) -> x . first end ) , clause ( fn ( x = BadRange [ ]) -> BadRange . first ( x ) end ) }
265
- assert optimize_clause ( clause ) == { rewriten , [ x: BadRange ] , nil }
266
+ { clause ( fn ( x = BadRec [ ]) -> x . first end ) , clause ( fn ( x = BadRec [ ]) -> BadRec . first ( x ) end ) }
267
+ assert optimize_clause ( clause ) == { rewriten , [ x: BadRec ] , nil }
266
268
end
267
269
268
270
test "noop for not records fields" do
@@ -271,7 +273,7 @@ defmodule Kernel.RecordRewriterTest do
271
273
end
272
274
273
275
test "noop for conflicting inference" do
274
- clause = clause ( fn ( x = Macro.Env [ ]) -> ^ x = Range [ ]; x . first end )
276
+ clause = clause ( fn ( x = Macro.Env [ ]) -> ^ x = Rec [ ]; x . first end )
275
277
assert optimize_clause ( clause ) == { clause , [ x: nil ] , nil }
276
278
end
277
279
end
0 commit comments