@@ -195,8 +195,18 @@ do_quote(Tuple, #elixir_quote{escape=true} = Q, S) when is_tuple(Tuple) ->
195195 { TT , TQ } = do_quote (tuple_to_list (Tuple ), Q , S ),
196196 { { '{}' , [], TT }, TQ };
197197
198+ do_quote (List , # elixir_quote {escape = true } = Q , S ) when is_list (List ) ->
199+ % The improper case is pretty inefficient, but improper lists are hopefully
200+ % rare.
201+ case reverse_improper (List ) of
202+ { L } -> do_splice (L , Q , S );
203+ { L , R } ->
204+ { TL , QL } = do_splice (L , Q , S , [], []),
205+ { TR , QR } = do_quote (R , QL , S ),
206+ { update_last (TL , fun (X ) -> { '|' , [], [X , TR ] } end ), QR }
207+ end ;
198208do_quote (List , Q , S ) when is_list (List ) ->
199- do_splice (lists :reverse (List ), Q , S );
209+ do_splice (lists :reverse (List ), Q , S );
200210
201211do_quote (Other , Q , _ ) ->
202212 { Other , Q }.
@@ -229,6 +239,16 @@ meta(Meta, #elixir_quote{line=nil}) ->
229239meta (Meta , # elixir_quote {line = Line }) ->
230240 keystore (line , Meta , Line ).
231241
242+ reverse_improper (L ) -> reverse_improper (L , []).
243+
244+ reverse_improper ([], Acc ) -> { Acc };
245+ reverse_improper ([H |T ], Acc ) when is_list (T ) -> reverse_improper (T , [H |Acc ]);
246+ reverse_improper ([H |T ], Acc ) -> { [H |Acc ], T }.
247+
248+ update_last ([], _ ) -> [];
249+ update_last ([H ], F ) -> [F (H )];
250+ update_last ([H |T ], F ) -> [H |update_last (T ,F )].
251+
232252keyfind (Key , Meta ) ->
233253 lists :keyfind (Key , 1 , Meta ).
234254keydelete (Key , Meta ) ->
0 commit comments