44
55% % Translate Elixir quoted expressions to Erlang Abstract Format.
66-module (elixir_erl_pass ).
7- -export ([translate /3 , translate_args /3 , no_parens_error /2 ]).
8- % % TODO: Remove me on Elixir v2.0.
9- -export ([parens_map_field /2 , no_parens_remote /2 ]).
7+ -export ([translate /3 , translate_args /3 , no_parens_remote /2 , parens_map_field /2 ]).
108-include (" elixir.hrl" ).
119
1210% % =
@@ -241,13 +239,15 @@ translate({{'.', _, [Left, Right]}, Meta, []}, _Ann, S)
241239 Ann = ? ann (Meta ),
242240 {TLeft , SL } = translate (Left , Ann , S ),
243241 TRight = {atom , Ann , Right },
242+
244243 Generated = erl_anno :set_generated (true , Ann ),
244+ {InnerVar , SI } = elixir_erl_var :build ('_' , SL ),
245+ TInnerVar = {var , Generated , InnerVar },
246+ {Var , SV } = elixir_erl_var :build ('_' , SI ),
247+ TVar = {var , Generated , Var },
245248
246249 case proplists :get_value (no_parens , Meta , false ) of
247250 true ->
248- {Var , SV } = elixir_erl_var :build ('_' , SL ),
249- TVar = {var , Generated , Var },
250-
251251 {{'case' , Generated , TLeft , [
252252 {clause , Generated ,
253253 [{map , Ann , [{map_field_exact , Ann , TRight , TVar }]}],
@@ -256,13 +256,24 @@ translate({{'.', _, [Left, Right]}, Meta, []}, _Ann, S)
256256 {clause , Generated ,
257257 [TVar ],
258258 [],
259- [? remote (Ann , erlang , error , [
260- ? remote (Generated , elixir_erl_pass , no_parens_error , [TVar , TRight ])
261- ])]}
259+ [{'case' , Generated , ? remote (Generated , elixir_erl_pass , no_parens_remote , [TVar , TRight ]), [
260+ {clause , Generated ,
261+ [{tuple , Generated , [{atom , Generated , ok }, TInnerVar ]}], [], [TInnerVar ]},
262+ {clause , Generated ,
263+ [{tuple , Generated , [{atom , Generated , error }, TInnerVar ]}], [], [? remote (Ann , erlang , error , [TInnerVar ])]}
264+ ]}]}
262265 ]}, SV };
263-
264266 false ->
265- {{call , Generated , {remote , Generated , TLeft , TRight }, []}, SL }
267+ {{'case' , Generated , TLeft , [
268+ {clause , Generated ,
269+ [{map , Ann , [{map_field_exact , Ann , TRight , TVar }]}],
270+ [],
271+ [? remote (Generated , elixir_erl_pass , parens_map_field , [TRight , TVar ])]},
272+ {clause , Generated ,
273+ [TVar ],
274+ [],
275+ [{call , Generated , {remote , Generated , TVar , TRight }, []}]}
276+ ]}, SV }
266277 end ;
267278
268279translate ({{'.' , _ , [Left , Right ]}, Meta , Args }, _Ann , S )
@@ -740,13 +751,9 @@ generate_struct_name_guard([{map_field_exact, Ann, {atom, _, '__struct__'} = Key
740751generate_struct_name_guard ([Field | Rest ], Acc , S ) ->
741752 generate_struct_name_guard (Rest , [Field | Acc ], S ).
742753
743- no_parens_error (#{} = Map , Key ) ->
744- {badkey , Key , Map };
745- no_parens_error (Other , _Key ) ->
746- {badmap , Other }.
747-
748- % % TODO: Previous Elixir code was compiled with these functions,
749- % % so we have to keep them.
754+ % % TODO: Make this a runtime error on Elixir v2.0
755+ % % Note we must keep these old functions around for
756+ % % a while as compiled code may still call them.
750757no_parens_remote (nil , _Key ) -> {error , {badmap , nil }};
751758no_parens_remote (false , _Key ) -> {error , {badmap , false }};
752759no_parens_remote (true , _Key ) -> {error , {badmap , true }};
@@ -774,4 +781,4 @@ parens_map_field(Key, Value) ->
774781 )
775782 end ,
776783 'Elixir.IO' :warn_once (? MODULE , Message , 3 ),
777- Value .
784+ Value .
0 commit comments