1818 line = false ,
1919 file = nil ,
2020 context = nil ,
21- op = none , % none | prune_metadata | add_context
21+ op = escape , % escape | escape_and_prune | quote
2222 aliases_hygiene = nil ,
2323 imports_hygiene = nil ,
2424 unquote = true ,
@@ -145,21 +145,27 @@ do_tuple_linify(Fun, Meta, Left, Right, Var, Gen) ->
145145% % Escapes the given expression. It is similar to quote, but
146146% % lines are kept and hygiene mechanisms are disabled.
147147escape (Expr , Op , Unquote ) ->
148- do_quote ( Expr , # elixir_quote {
148+ Q = # elixir_quote {
149149 line = true ,
150150 file = nil ,
151151 op = Op ,
152152 unquote = Unquote
153- }).
153+ },
154+ case Unquote of
155+ true -> do_quote (Expr , Q );
156+ false -> do_escape (Expr , Q )
157+ end .
154158
155- do_escape ({Left , Meta , Right }, # elixir_quote {op = prune_metadata } = Q ) when is_list (Meta ) ->
159+ do_escape ({Left , Meta , Right }, # elixir_quote {op = escape_and_prune } = Q ) when is_list (Meta ) ->
156160 TM = [{K , V } || {K , V } <- Meta , (K == no_parens ) orelse (K == line ) orelse (K == delimiter )],
157- TL = do_quote (Left , Q ),
158- TR = do_quote (Right , Q ),
161+ TL = do_escape (Left , Q ),
162+ TR = do_escape (Right , Q ),
159163 {'{}' , [], [TL , TM , TR ]};
160164
165+ do_escape ({Left , Right }, Q ) ->
166+ {do_escape (Left , Q ), do_escape (Right , Q )};
161167do_escape (Tuple , Q ) when is_tuple (Tuple ) ->
162- TT = do_quote (tuple_to_list (Tuple ), Q ),
168+ TT = do_escape (tuple_to_list (Tuple ), Q ),
163169 {'{}' , [], TT };
164170
165171do_escape (BitString , _ ) when is_bitstring (BitString ) ->
@@ -193,7 +199,7 @@ do_escape([], _) ->
193199 [];
194200
195201do_escape ([H | T ], # elixir_quote {unquote = false } = Q ) ->
196- do_quote_simple_list (T , do_quote (H , Q ), Q );
202+ do_quote_simple_list (T , do_escape (H , Q ), Q );
197203
198204do_escape ([H | T ], Q ) ->
199205 % % The improper case is inefficient, but improper lists are rare.
@@ -203,7 +209,7 @@ do_escape([H | T], Q) ->
203209 _ :_ ->
204210 {L , R } = reverse_improper (T , [H ]),
205211 TL = do_quote_splice (L , Q , [], []),
206- TR = do_quote (R , Q ),
212+ TR = do_escape (R , Q ),
207213 update_last (TL , fun (X ) -> {'|' , [], [X , TR ]} end )
208214 end ;
209215
@@ -232,7 +238,7 @@ escape_map_key_value(K, V, Map, Q) ->
232238 ('Elixir.Kernel' :inspect (MaybeRef , []))/binary , " ) and therefore it cannot be escaped " ,
233239 " (it must be defined within a function instead). " , (bad_escape_hint ())/binary >>);
234240 true ->
235- {do_quote (K , Q ), do_quote (V , Q )}
241+ {do_escape (K , Q ), do_escape (V , Q )}
236242 end .
237243
238244find_tuple_ref (Tuple , Index ) when Index > tuple_size (Tuple ) -> nil ;
@@ -261,7 +267,7 @@ build(Meta, Line, File, Context, Unquote, Generated, E) ->
261267 validate_runtime (generated , Generated ),
262268
263269 Q = # elixir_quote {
264- op = add_context ,
270+ op = quote ,
265271 aliases_hygiene = E ,
266272 imports_hygiene = E ,
267273 line = VLine ,
@@ -341,7 +347,7 @@ do_quote({quote, Meta, [Arg]}, Q) when is_list(Meta) ->
341347 TArg = do_quote (Arg , Q # elixir_quote {unquote = false }),
342348
343349 NewMeta = case Q of
344- # elixir_quote {op = add_context , context = Context } -> keystore (context , Meta , Context );
350+ # elixir_quote {op = quote , context = Context } -> keystore (context , Meta , Context );
345351 _ -> Meta
346352 end ,
347353
@@ -352,7 +358,7 @@ do_quote({quote, Meta, [Opts, Arg]}, Q) when is_list(Meta) ->
352358 TArg = do_quote (Arg , Q # elixir_quote {unquote = false }),
353359
354360 NewMeta = case Q of
355- # elixir_quote {op = add_context , context = Context } -> keystore (context , Meta , Context );
361+ # elixir_quote {op = quote , context = Context } -> keystore (context , Meta , Context );
356362 _ -> Meta
357363 end ,
358364
@@ -379,7 +385,7 @@ do_quote({'__aliases__', Meta, [H | T]}, #elixir_quote{aliases_hygiene=(#{}=E)}
379385
380386% % Vars
381387
382- do_quote ({Name , Meta , nil }, # elixir_quote {op = add_context } = Q )
388+ do_quote ({Name , Meta , nil }, # elixir_quote {op = quote } = Q )
383389 when is_atom (Name ), is_list (Meta ) ->
384390 ImportMeta = case Q # elixir_quote .imports_hygiene of
385391 nil -> Meta ;
@@ -435,7 +441,7 @@ do_quote({Left, Right}, Q) ->
435441
436442% % Everything else
437443
438- do_quote (Other , # elixir_quote {op = Op } = Q ) when Op =/= add_context ->
444+ do_quote (Other , # elixir_quote {op = Op } = Q ) when Op =/= quote ->
439445 do_escape (Other , Q );
440446
441447do_quote ({_ , _ , _ } = Tuple , Q ) ->
0 commit comments