@@ -298,7 +298,7 @@ store_definition(CheckClauses, Kind, Meta, Name, Arity, File, Module, Defaults,
298
298
case ets :lookup (Set , {def , Tuple }) of
299
299
[{_ , StoredKind , StoredMeta , StoredFile , StoredCheck , {StoredDefaults , LastHasBody , LastDefaults }}] ->
300
300
check_valid_kind (Meta , File , Name , Arity , Kind , StoredKind , StoredFile , StoredMeta ),
301
- check_valid_defaults (Meta , File , Name , Arity , Kind , Defaults , StoredDefaults , LastDefaults , HasBody , LastHasBody ),
301
+ check_valid_defaults (Meta , File , Name , Arity , Kind , Defaults , StoredMeta , StoredDefaults , LastDefaults , HasBody , LastHasBody ),
302
302
(CheckAll and (StoredCheck == all )) andalso
303
303
check_valid_clause (Meta , File , Name , Arity , Kind , Set , StoredMeta , StoredFile , Clauses ),
304
304
@@ -380,17 +380,17 @@ check_valid_clause(Meta, File, Name, Arity, Kind, Set, StoredMeta, StoredFile, C
380
380
end .
381
381
382
382
% Clause with defaults after clause with defaults
383
- check_valid_defaults (Meta , File , Name , Arity , Kind , Defaults , StoredDefaults , _ , _ , _ )
383
+ check_valid_defaults (Meta , File , Name , Arity , Kind , Defaults , StoredMeta , StoredDefaults , _ , _ , _ )
384
384
when Defaults > 0 , StoredDefaults > 0 ->
385
- elixir_errors :file_error (Meta , File , ? MODULE , {duplicate_defaults , {Kind , Name , Arity }});
385
+ elixir_errors :file_error (Meta , File , ? MODULE , {duplicate_defaults , {Kind , Name , Arity , StoredMeta }});
386
386
% Clause with defaults after clause without defaults
387
- check_valid_defaults (Meta , File , Name , Arity , Kind , Defaults , 0 , _ , _ , _ ) when Defaults > 0 ->
388
- elixir_errors :file_warn (Meta , File , ? MODULE , {mixed_defaults , {Kind , Name , Arity }});
387
+ check_valid_defaults (Meta , File , Name , Arity , Kind , Defaults , StoredMeta , 0 , _ , _ , _ ) when Defaults > 0 ->
388
+ elixir_errors :file_warn (Meta , File , ? MODULE , {mixed_defaults , {Kind , Name , Arity , StoredMeta }});
389
389
% Clause without defaults directly after clause with defaults (bodiless does not count)
390
- check_valid_defaults (Meta , File , Name , Arity , Kind , 0 , _ , LastDefaults , true , true ) when LastDefaults > 0 ->
391
- elixir_errors :file_warn (Meta , File , ? MODULE , {mixed_defaults , {Kind , Name , Arity }});
390
+ check_valid_defaults (Meta , File , Name , Arity , Kind , 0 , StoredMeta , _ , LastDefaults , true , true ) when LastDefaults > 0 ->
391
+ elixir_errors :file_warn (Meta , File , ? MODULE , {mixed_defaults , {Kind , Name , Arity , StoredMeta }});
392
392
% Clause without defaults
393
- check_valid_defaults (_Meta , _File , _Name , _Arity , _Kind , 0 , _StoredDefaults , _LastDefaults , _HasBody , _LastHasBody ) ->
393
+ check_valid_defaults (_Meta , _File , _Name , _Arity , _Kind , 0 , _StoredMeta , _StoredDefaults , _LastDefaults , _HasBody , _LastHasBody ) ->
394
394
ok .
395
395
396
396
check_args_for_function_head (Meta , Args , E ) ->
@@ -445,7 +445,7 @@ format_error({defs_with_defaults, Kind, Name, Arity, A}) when Arity < A ->
445
445
io_lib :format (" ~ts ~ts /~B conflicts with defaults from ~ts /~B " ,
446
446
[Kind , Name , Arity , Name , A ]);
447
447
448
- format_error ({duplicate_defaults , {Kind , Name , Arity }}) ->
448
+ format_error ({duplicate_defaults , {Kind , Name , Arity , StoredMeta }}) ->
449
449
io_lib :format (
450
450
" ~ts ~ts /~B defines defaults multiple times. "
451
451
" Elixir allows defaults to be declared once per definition. Instead of:\n "
@@ -457,10 +457,11 @@ format_error({duplicate_defaults, {Kind, Name, Arity}}) ->
457
457
" \n "
458
458
" def foo(a, b \\\\ :default)\n "
459
459
" def foo(:first_clause, b) do ... end\n "
460
- " def foo(:second_clause, b) do ... end\n " ,
461
- [Kind , Name , Arity ]);
460
+ " def foo(:second_clause, b) do ... end\n "
461
+ " ~ts " ,
462
+ [Kind , Name , Arity , maybe_stored_meta_line (StoredMeta )]);
462
463
463
- format_error ({mixed_defaults , {Kind , Name , Arity }}) ->
464
+ format_error ({mixed_defaults , {Kind , Name , Arity , StoredMeta }}) ->
464
465
io_lib :format (
465
466
" ~ts ~ts /~B has multiple clauses and also declares default values. "
466
467
" In such cases, the default values should be defined in a header. Instead of:\n "
@@ -472,8 +473,9 @@ format_error({mixed_defaults, {Kind, Name, Arity}}) ->
472
473
" \n "
473
474
" def foo(a, b \\\\ :default)\n "
474
475
" def foo(:first_clause, b) do ... end\n "
475
- " def foo(:second_clause, b) do ... end\n " ,
476
- [Kind , Name , Arity ]);
476
+ " def foo(:second_clause, b) do ... end\n "
477
+ " ~ts " ,
478
+ [Kind , Name , Arity , maybe_stored_meta_line (StoredMeta )]);
477
479
478
480
format_error ({ungrouped_name , {Kind , Name , Arity , OrigLine , OrigFile }}) ->
479
481
io_lib :format (" clauses with the same name should be grouped together, \" ~ts ~ts /~B \" was previously defined (~ts :~B )" ,
@@ -525,3 +527,10 @@ format_error({module_info, Kind, Arity}) ->
525
527
format_error ({is_record , Kind }) ->
526
528
io_lib :format (" cannot define ~ts is_record/2 due to compatibility "
527
529
" with the Erlang compiler (it is a known limitation)" , [Kind ]).
530
+
531
+ maybe_stored_meta_line (StoredMeta ) ->
532
+ case lists :keyfind (line , 1 , StoredMeta ) of
533
+ {line , Line } when Line > 0 ->
534
+ " \n the previous clause is defined on line " ++ integer_to_list (Line ) ++ " \n " ;
535
+ _ -> " "
536
+ end .
0 commit comments