@@ -186,6 +186,13 @@ store_definition(Check, Kind, Meta, Name, Arity, File, Module, Defaults, Clauses
186
186
Tuple = {Name , Arity },
187
187
HasBody = Clauses =/= [],
188
188
189
+ if
190
+ Defaults > 0 ->
191
+ ets :insert (Defs , {{default , Name }, Arity , Defaults });
192
+ true ->
193
+ ok
194
+ end ,
195
+
189
196
MaxDefaults =
190
197
case ets :take (Defs , {def , Tuple }) of
191
198
[{_ , StoredKind , StoredMeta , StoredFile , StoredCheck ,
@@ -194,14 +201,14 @@ store_definition(Check, Kind, Meta, Name, Arity, File, Module, Defaults, Clauses
194
201
(Check and StoredCheck ) andalso
195
202
check_valid_clause (Meta , File , Name , Arity , Kind , Data , StoredMeta , StoredFile ),
196
203
check_valid_defaults (Meta , File , Name , Arity , Kind , Defaults , StoredDefaults , LastDefaults , LastHasBody ),
197
- { max (Defaults , StoredDefaults ), HasBody , Defaults } ;
204
+ max (Defaults , StoredDefaults );
198
205
[] ->
199
- { Defaults , HasBody , Defaults }
206
+ Defaults
200
207
end ,
201
208
202
209
Check andalso ets :insert (Data , {? last_def , Tuple }),
203
210
ets :insert (Defs , [{{clauses , Tuple }, Clause } || Clause <- Clauses ]),
204
- ets :insert (Defs , {{def , Tuple }, Kind , Meta , File , Check , MaxDefaults }).
211
+ ets :insert (Defs , {{def , Tuple }, Kind , Meta , File , Check , { MaxDefaults , HasBody , Defaults } }).
205
212
206
213
% % Handling of defaults
207
214
@@ -271,7 +278,7 @@ check_valid_defaults(Meta, File, Name, Arity, Kind, Defaults, 0, 0, _) when Defa
271
278
check_valid_defaults (Meta , File , Name , Arity , Kind , 0 , _ , LastDefaults , true ) when LastDefaults > 0 ->
272
279
elixir_errors :form_warn (Meta , File , ? MODULE , {clauses_with_defaults , {Kind , Name , Arity }});
273
280
% Clause without defaults
274
- check_valid_defaults (_Meta , _File , _Name , _Arity , _Kind , 0 , _ , _ , _ ) -> [] .
281
+ check_valid_defaults (_Meta , _File , _Name , _Arity , _Kind , 0 , _ , _ , _ ) -> ok .
275
282
276
283
warn_bodyless_function (Check , _Meta , _File , Module , _Kind , _Tuple )
277
284
when Check == false ; Module == 'Elixir.Module' ->
@@ -289,12 +296,11 @@ invalid_arg({Name, _, Kind}) when is_atom(Name), is_atom(Kind) -> false;
289
296
invalid_arg (_ ) -> true .
290
297
291
298
check_previous_defaults (Meta , Module , Name , Arity , Kind , Defaults , E ) ->
292
- Matches = ets :match (elixir_module :defs_table (Module ),
293
- {{def , {Name , '$2' }}, '$1' , '_' , '_' , '_' , {'$3' , '_' , '_' }}),
299
+ Matches = ets :lookup (elixir_module :defs_table (Module ), {default , Name }),
294
300
[begin
295
301
elixir_errors :form_error (Meta , ? key (E , file ), ? MODULE ,
296
- {defs_with_defaults , Name , { Kind , Arity }, { K , A } })
297
- end || [ K , A , D ] <- Matches , A /= Arity , D /= 0 , defaults_conflict (A , D , Arity , Defaults )].
302
+ {defs_with_defaults , Kind , Name , Arity , A })
303
+ end || { _ , A , D } <- Matches , A /= Arity , D /= 0 , defaults_conflict (A , D , Arity , Defaults )].
298
304
299
305
defaults_conflict (A , D , Arity , Defaults ) ->
300
306
((Arity >= (A - D )) andalso (Arity < A )) orelse
@@ -324,13 +330,13 @@ format_error({bodyless_clause, Kind, {Name, Arity}}) ->
324
330
format_error ({no_module , {Kind , Name , Arity }}) ->
325
331
io_lib :format (" cannot define function outside module, invalid scope for ~ts ~ts /~B " , [Kind , Name , Arity ]);
326
332
327
- format_error ({defs_with_defaults , Name , { Kind , Arity }, { K , A } }) when Arity > A ->
328
- io_lib :format (" ~ts ~ts /~B defaults conflicts with ~ts ~ts /~B " ,
329
- [Kind , Name , Arity , K , Name , A ]);
333
+ format_error ({defs_with_defaults , Kind , Name , Arity , A }) when Arity > A ->
334
+ io_lib :format (" ~ts ~ts /~B defaults conflicts with ~ts /~B " ,
335
+ [Kind , Name , Arity , Name , A ]);
330
336
331
- format_error ({defs_with_defaults , Name , { Kind , Arity }, { K , A } }) when Arity < A ->
332
- io_lib :format (" ~ts ~ts /~B conflicts with defaults from ~ts ~ts /~B " ,
333
- [Kind , Name , Arity , K , Name , A ]);
337
+ format_error ({defs_with_defaults , Kind , Name , Arity , A }) when Arity < A ->
338
+ io_lib :format (" ~ts ~ts /~B conflicts with defaults from ~ts /~B " ,
339
+ [Kind , Name , Arity , Name , A ]);
334
340
335
341
format_error ({clauses_with_defaults , {Kind , Name , Arity }}) ->
336
342
io_lib :format (" "
0 commit comments