@@ -65,13 +65,15 @@ store_definition(Line, Kind, CheckClauses, Call, Body, Pos) when is_integer(Line
6565 LinifyArgs = elixir_quote :linify (Line , Key , Args ),
6666 LinifyGuards = elixir_quote :linify (Line , Key , Guards ),
6767 LinifyBody = elixir_quote :linify (Line , Key , Body ),
68+ LinifyMeta = lists :keystore (line , 1 , Meta , {line , Line }),
6869
69- assert_no_aliases_name (Line , Name , Args , E ),
70- assert_valid_name (Line , Kind , Name , Args , E ),
71- store_definition (Line , Kind , DoCheckClauses , Name ,
70+ assert_no_aliases_name (LinifyMeta , Name , Args , E ),
71+ assert_valid_name (LinifyMeta , Kind , Name , Args , E ),
72+ store_definition (LinifyMeta , Line , Kind , DoCheckClauses , Name ,
7273 LinifyArgs , LinifyGuards , LinifyBody , Location , E ).
7374
74- store_definition (Line , Kind , CheckClauses , Name , Args , Guards , Body , KeepLocation , #{module := Module } = ER ) ->
75+ store_definition (Meta , Line , Kind , CheckClauses , Name , Args , Guards , Body , KeepLocation ,
76+ #{module := Module } = ER ) ->
7577 Arity = length (Args ),
7678 Tuple = {Name , Arity },
7779 Location = retrieve_location (KeepLocation , Module ),
@@ -83,8 +85,9 @@ store_definition(Line, Kind, CheckClauses, Name, Args, Guards, Body, KeepLocatio
8385
8486 elixir_locals :record_definition (Tuple , Kind , Module ),
8587
86- {Function , Defaults , Super } = translate_definition (Kind , Line , Name , Args , Guards , Body , E ),
87- run_on_definition_callbacks (Kind , Line , Module , Name , Args , Guards , expr_from_body (Line , Body ), E ),
88+ WrappedBody = expr_from_body (Line , Body ),
89+ {Function , Defaults , Super } = translate_definition (Kind , Meta , Name , Args , Guards , Body , WrappedBody , E ),
90+ run_on_definition_callbacks (Kind , Line , Module , Name , Args , Guards , WrappedBody , E ),
8891
8992 DefaultsLength = length (Defaults ),
9093 elixir_locals :record_defaults (Tuple , Kind , Module , DefaultsLength ),
@@ -152,42 +155,39 @@ compile_super(_Module, _, _E) -> ok.
152155% % Translate the given call and expression given
153156% % and then store it in memory.
154157
155- translate_definition (Kind , Line , Name , Args , Guards , Body , E ) when is_integer ( Line ) ->
158+ translate_definition (Kind , Meta , Name , Args , Guards , Body , WrappedBody , E ) ->
156159 Arity = length (Args ),
157160
158161 {EArgs , EGuards , EBody , _ } = elixir_exp_clauses :def (fun elixir_def_defaults :expand /2 ,
159- Args , Guards , expr_from_body (Line , Body ), E ),
160-
161- case Body of
162- nil -> check_args_for_bodyless_clause (Line , EArgs , E );
163- _ -> ok
164- end ,
162+ Args , Guards , WrappedBody , E ),
165163
166164 S = elixir_env :env_to_scope (E ),
167165 {Unpacked , Defaults } = elixir_def_defaults :unpack (Kind , Name , EArgs , S ),
168- {Clauses , Super } = translate_clause (Body , Line , Kind , Unpacked , EGuards , EBody , S ),
166+ {Clauses , Super } = translate_clause (Body , Kind , Meta , Unpacked , EGuards , EBody , S ),
169167
170- Function = {function , Line , Name , Arity , Clauses },
168+ Function = {function , ? ann ( Meta ) , Name , Arity , Clauses },
171169 {Function , Defaults , Super }.
172170
173- translate_clause (nil , _Line , _Kind , _Args , [], _Body , _S ) ->
171+ translate_clause (nil , _Kind , Meta , Args , [], _Body , S ) ->
172+ check_args_for_bodyless_clause (Meta , Args , S ),
174173 {[], false };
175- translate_clause (nil , Line , Kind , _Args , _Guards , _Body , # elixir_scope {file = File }) ->
176- elixir_errors :form_error ([{ line , Line }] , File , ? MODULE , {missing_do , Kind });
177- translate_clause (_ , Line , Kind , Args , Guards , Body , S ) ->
178- {TClause , TS } = elixir_clauses :clause ([{ line , Line }] ,
174+ translate_clause (nil , Kind , Meta , _Args , _Guards , _Body , # elixir_scope {file = File }) ->
175+ elixir_errors :form_error (Meta , File , ? MODULE , {missing_do , Kind });
176+ translate_clause (_ , Kind , Meta , Args , Guards , Body , S ) ->
177+ {TClause , TS } = elixir_clauses :clause (Meta ,
179178 fun elixir_translator :translate_args /2 , Args , Body , Guards , S ),
180179
181180 FClause = case is_macro (Kind ) of
182181 true ->
183- FArgs = {var , Line , '_@CALLER' },
182+ Ann = ? ann (Meta ),
183+ FArgs = {var , Ann , '_@CALLER' },
184184 MClause = setelement (3 , TClause , [FArgs |element (3 , TClause )]),
185185
186186 case TS # elixir_scope .caller of
187187 true ->
188- FBody = {'match' , Line ,
189- {'var' , Line , '__CALLER__' },
190- elixir_utils :erl_call (Line , elixir_env , linify , [{var , Line , '_@CALLER' }])
188+ FBody = {'match' , Ann ,
189+ {'var' , Ann , '__CALLER__' },
190+ elixir_utils :erl_call (Ann , elixir_env , linify , [{var , Ann , '_@CALLER' }])
191191 },
192192 setelement (5 , MClause , [FBody |element (5 , TClause )]);
193193 false ->
@@ -378,9 +378,9 @@ defaults_conflict(A, D, Arity, Defaults) ->
378378 ((Arity >= (A - D )) andalso (Arity < A )) orelse
379379 ((A >= (Arity - Defaults )) andalso (A < Arity )).
380380
381- check_args_for_bodyless_clause (Line , Args , E ) ->
381+ check_args_for_bodyless_clause (Meta , Args , S ) ->
382382 [ begin
383- elixir_errors :form_error ([{ line , Line }], ? m ( E , file ) , ? MODULE ,
383+ elixir_errors :form_error (Meta , S # elixir_scope . file , ? MODULE ,
384384 invalid_args_for_bodyless_clause )
385385 end || Arg <- Args , invalid_arg (Arg ) ].
386386
@@ -391,14 +391,14 @@ invalid_arg({'\\\\', _, [{Name, _, Kind}, _]}) when is_atom(Name), is_atom(Kind)
391391invalid_arg (_ ) ->
392392 true .
393393
394- assert_no_aliases_name (Line , '__aliases__' , [Atom ], #{file := File }) when is_atom (Atom ) ->
395- elixir_errors :form_error ([{ line , Line }] , File , ? MODULE , {no_alias , Atom });
396- assert_no_aliases_name (_Line , _Aliases , _Args , _S ) ->
394+ assert_no_aliases_name (Meta , '__aliases__' , [Atom ], #{file := File }) when is_atom (Atom ) ->
395+ elixir_errors :form_error (Meta , File , ? MODULE , {no_alias , Atom });
396+ assert_no_aliases_name (_Meta , _Aliases , _Args , _S ) ->
397397 ok .
398398
399- assert_valid_name (Line , Kind , is_record , [_ , _ ], #{file := File }) when Kind == defp ; Kind == def ->
400- elixir_errors :form_error ([{ line , Line }] , File , ? MODULE , {is_record , Kind });
401- assert_valid_name (_Line , _Kind , _Name , _Args , _S ) ->
399+ assert_valid_name (Meta , Kind , is_record , [_ , _ ], #{file := File }) when Kind == defp ; Kind == def ->
400+ elixir_errors :form_error (Meta , File , ? MODULE , {is_record , Kind });
401+ assert_valid_name (_Meta , _Kind , _Name , _Args , _S ) ->
402402 ok .
403403
404404% % Format errors
0 commit comments