Skip to content

Commit 9d95a0b

Browse files
author
José Valim
committed
Propagate generated: true in Elixir definitions
1 parent 3df2a02 commit 9d95a0b

File tree

1 file changed

+32
-32
lines changed

1 file changed

+32
-32
lines changed

lib/elixir/src/elixir_def.erl

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
391391
invalid_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

Comments
 (0)