1
1
% Holds the logic responsible for defining overridable functions and handling super.
2
2
-module (elixir_def_overridable ).
3
- -export ([setup /1 , overridable /1 , overridable /2 , name /2 , super /2 , store_pending /1 ,
3
+ -export ([setup /1 , overridable /1 , overridable /2 , kind_and_name /2 , super /2 , store_pending /1 ,
4
4
ensure_defined /4 , format_error /1 ]).
5
5
-include (" elixir.hrl" ).
6
6
-define (attr , {elixir , overridable }).
@@ -23,15 +23,21 @@ ensure_defined(Meta, Module, Tuple, S) ->
23
23
_ -> elixir_errors :form_error (Meta , S # elixir_scope .file , ? MODULE , {no_super , Module , Tuple })
24
24
end .
25
25
26
- % % Gets the name based on the function and stored overridables
26
+ % % Builds a function name based on how many times the function has been
27
+ % % overridden.
27
28
28
- name (Module , Function ) ->
29
- name (Module , Function , overridable (Module )).
30
-
31
- name (_Module , {Name , _ } = Function , Overridable ) ->
32
- {Count , _ , _ , _ } = maps :get (Function , Overridable ),
29
+ name ({Name , _ } = _Function , Count ) when is_integer (Count ) ->
33
30
elixir_utils :atom_concat ([Name , " (overridable " , Count , " )" ]).
34
31
32
+ % % Returns the kind (def, defp, and so on) of the given overridable function and
33
+ % % its overridable name.
34
+
35
+ kind_and_name (Module , FunctionOrMacro ) ->
36
+ Overridable = overridable (Module ),
37
+ {Count , Clause , _ , _ } = maps :get (FunctionOrMacro , Overridable ),
38
+ {{{def , _Function }, Kind , _Line , _File , _Check , _Location , _Defaults }, _Clauses } = Clause ,
39
+ {Kind , name (FunctionOrMacro , Count )}.
40
+
35
41
% % Store
36
42
37
43
store (Module , Function , GenerateName ) ->
@@ -44,10 +50,15 @@ store(Module, Function, GenerateName) ->
44
50
{{{def , {Name , Arity }}, Kind , Line , File , _Check ,
45
51
Location , {Defaults , _HasBody , _LastDefaults }}, Clauses } = Clause ,
46
52
47
- {FinalKind , FinalName } = case GenerateName of
48
- true -> {defp , name (Module , Function , Overridable )};
49
- false -> {Kind , Name }
50
- end ,
53
+ {FinalKind , FinalName , FinalArity } =
54
+ case {GenerateName , Kind } of
55
+ {false , _ } ->
56
+ {Kind , Name , Arity };
57
+ {true , K } when K == defmacro ; K == defmacrop ->
58
+ {defp , elixir_utils :macro_name (name (Function , Count )), Arity + 1 };
59
+ {true , K } when K == def ; K == defp ->
60
+ {defp , name (Function , Count ), Arity }
61
+ end ,
51
62
52
63
case elixir_compiler :get_opt (internal ) of
53
64
false ->
@@ -56,7 +67,7 @@ store(Module, Function, GenerateName) ->
56
67
ok
57
68
end ,
58
69
59
- Def = {function , Line , FinalName , Arity , Clauses },
70
+ Def = {function , Line , FinalName , FinalArity , Clauses },
60
71
elixir_def :store_each (false , FinalKind , File , Location , Module , Defaults , Def )
61
72
end .
62
73
0 commit comments