11-module (elixir_aliases ).
22-export ([nesting_alias /2 , last /1 , concat /1 , safe_concat /1 ,
3- format_error /1 , ensure_loaded /3 , ensure_loaded /4 , expand /3 , store /4 ]).
3+ format_error /1 , ensure_loaded /3 , ensure_loaded /4 , expand /4 , store /5 ]).
44-include (" elixir.hrl" ).
55
66% % Store an alias in the given scope
7- store (_Meta , New , New , S ) -> S ;
8- store (Meta , New , Old , S ) ->
7+ store (_Meta , New , New , _TKV , S ) -> S ;
8+ store (Meta , New , Old , TKV , S ) ->
9+ record_warn (Meta , New , TKV , S ),
10+
911 SA = S # elixir_scope {
1012 aliases = orddict :store (New , Old , S # elixir_scope .aliases )
1113 },
@@ -19,47 +21,58 @@ store(Meta, New, Old, S) ->
1921 SA
2022 end .
2123
24+ record_warn (Meta , Ref , Opts , S ) ->
25+ Warn =
26+ case lists :keyfind (warn , 1 , Opts ) of
27+ { warn , false } -> false ;
28+ { warn , true } -> true ;
29+ false -> not lists :keymember (context , 1 , Meta )
30+ end ,
31+ elixir_lexical :record_alias (Ref , ? line (Meta ), Warn , S # elixir_scope .lexical_tracker ).
32+
2233% % Expand an alias. It returns an atom (meaning that there
2334% % was an expansion) or a list of atoms.
2435
25- expand ({ '__aliases__' , Meta , _ } = Alias , Aliases , MacroAliases ) ->
36+ expand ({ '__aliases__' , Meta , _ } = Alias , Aliases , MacroAliases , LexicalTracker ) ->
2637 case lists :keyfind (alias , 1 , Meta ) of
2738 { alias , false } ->
28- expand (Alias , MacroAliases );
39+ expand (Alias , MacroAliases , LexicalTracker );
2940 { alias , Atom } when is_atom (Atom ) ->
30- case expand (Alias , MacroAliases ) of
41+ case expand (Alias , MacroAliases , LexicalTracker ) of
3142 OtherAtom when is_atom (OtherAtom ) -> OtherAtom ;
3243 OtherAliases when is_list (OtherAliases ) -> Atom
3344 end ;
3445 false ->
35- expand (Alias , Aliases )
46+ expand (Alias , Aliases , LexicalTracker )
3647 end .
3748
38- expand ({ '__aliases__' , _Meta , [H ] }, Aliases ) when H /= 'Elixir' ->
39- case expand_one (H , Aliases ) of
49+ expand ({ '__aliases__' , _Meta , [H ] }, Aliases , LexicalTracker ) when H /= 'Elixir' ->
50+ case expand_one (H , Aliases , LexicalTracker ) of
4051 false -> [H ];
4152 Atom -> Atom
4253 end ;
4354
44- expand ({ '__aliases__' , _Meta , [H |T ] }, Aliases ) when is_atom (H ) ->
55+ expand ({ '__aliases__' , _Meta , [H |T ] }, Aliases , LexicalTracker ) when is_atom (H ) ->
4556 case H of
4657 'Elixir' ->
4758 concat (T );
4859 _ ->
49- case expand_one (H , Aliases ) of
60+ case expand_one (H , Aliases , LexicalTracker ) of
5061 false -> [H |T ];
5162 Atom -> concat ([Atom |T ])
5263 end
5364 end ;
5465
55- expand ({ '__aliases__' , _Meta , List }, _Aliases ) ->
66+ expand ({ '__aliases__' , _Meta , List }, _Aliases , _LexicalTracker ) ->
5667 List .
5768
58- expand_one (H , Aliases ) ->
69+ expand_one (H , Aliases , LexicalTracker ) ->
5970 Lookup = list_to_atom (" Elixir." ++ atom_to_list (H )),
6071 case lookup (Lookup , Aliases ) of
6172 Lookup -> false ;
62- Else -> Else
73+ Else ->
74+ elixir_lexical :record_alias (Lookup , LexicalTracker ),
75+ Else
6376 end .
6477
6578% % Ensure a module is loaded before its usage.
0 commit comments