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 ,
@@ -140,21 +140,27 @@ do_tuple_linify(Fun, Meta, Left, Right, Var) ->
140140% % Escapes the given expression. It is similar to quote, but
141141% % lines are kept and hygiene mechanisms are disabled.
142142escape (Expr , Op , Unquote ) ->
143- do_quote ( Expr , # elixir_quote {
143+ Q = # elixir_quote {
144144 line = true ,
145145 file = nil ,
146146 op = Op ,
147147 unquote = Unquote
148- }).
148+ },
149+ case Unquote of
150+ true -> do_quote (Expr , Q );
151+ false -> do_escape (Expr , Q )
152+ end .
149153
150- do_escape ({Left , Meta , Right }, # elixir_quote {op = prune_metadata } = Q ) when is_list (Meta ) ->
154+ do_escape ({Left , Meta , Right }, # elixir_quote {op = escape_and_prune } = Q ) when is_list (Meta ) ->
151155 TM = [{K , V } || {K , V } <- Meta , (K == no_parens ) orelse (K == line ) orelse (K == delimiter )],
152- TL = do_quote (Left , Q ),
153- TR = do_quote (Right , Q ),
156+ TL = do_escape (Left , Q ),
157+ TR = do_escape (Right , Q ),
154158 {'{}' , [], [TL , TM , TR ]};
155159
160+ do_escape ({Left , Right }, Q ) ->
161+ {do_escape (Left , Q ), do_escape (Right , Q )};
156162do_escape (Tuple , Q ) when is_tuple (Tuple ) ->
157- TT = do_quote (tuple_to_list (Tuple ), Q ),
163+ TT = do_escape (tuple_to_list (Tuple ), Q ),
158164 {'{}' , [], TT };
159165
160166do_escape (BitString , _ ) when is_bitstring (BitString ) ->
@@ -188,7 +194,7 @@ do_escape([], _) ->
188194 [];
189195
190196do_escape ([H | T ], # elixir_quote {unquote = false } = Q ) ->
191- do_quote_simple_list (T , do_quote (H , Q ), Q );
197+ do_quote_simple_list (T , do_escape (H , Q ), Q );
192198
193199do_escape ([H | T ], Q ) ->
194200 % % The improper case is inefficient, but improper lists are rare.
@@ -198,7 +204,7 @@ do_escape([H | T], Q) ->
198204 _ :_ ->
199205 {L , R } = reverse_improper (T , [H ]),
200206 TL = do_quote_splice (L , Q , [], []),
201- TR = do_quote (R , Q ),
207+ TR = do_escape (R , Q ),
202208 update_last (TL , fun (X ) -> {'|' , [], [X , TR ]} end )
203209 end ;
204210
@@ -227,7 +233,7 @@ escape_map_key_value(K, V, Map, Q) ->
227233 ('Elixir.Kernel' :inspect (MaybeRef , []))/binary , " ) and therefore it cannot be escaped " ,
228234 " (it must be defined within a function instead). " , (bad_escape_hint ())/binary >>);
229235 true ->
230- {do_quote (K , Q ), do_quote (V , Q )}
236+ {do_escape (K , Q ), do_escape (V , Q )}
231237 end .
232238
233239find_tuple_ref (Tuple , Index ) when Index > tuple_size (Tuple ) -> nil ;
@@ -256,7 +262,7 @@ build(Meta, Line, File, Context, Unquote, Generated, E) ->
256262 validate_runtime (generated , Generated ),
257263
258264 Q = # elixir_quote {
259- op = add_context ,
265+ op = quote ,
260266 aliases_hygiene = E ,
261267 imports_hygiene = E ,
262268 line = VLine ,
@@ -336,7 +342,7 @@ do_quote({quote, Meta, [Arg]}, Q) when is_list(Meta) ->
336342 TArg = do_quote (Arg , Q # elixir_quote {unquote = false }),
337343
338344 NewMeta = case Q of
339- # elixir_quote {op = add_context , context = Context } -> keystore (context , Meta , Context );
345+ # elixir_quote {op = quote , context = Context } -> keystore (context , Meta , Context );
340346 _ -> Meta
341347 end ,
342348
@@ -347,7 +353,7 @@ do_quote({quote, Meta, [Opts, Arg]}, Q) when is_list(Meta) ->
347353 TArg = do_quote (Arg , Q # elixir_quote {unquote = false }),
348354
349355 NewMeta = case Q of
350- # elixir_quote {op = add_context , context = Context } -> keystore (context , Meta , Context );
356+ # elixir_quote {op = quote , context = Context } -> keystore (context , Meta , Context );
351357 _ -> Meta
352358 end ,
353359
@@ -374,7 +380,7 @@ do_quote({'__aliases__', Meta, [H | T]}, #elixir_quote{aliases_hygiene=(#{}=E)}
374380
375381% % Vars
376382
377- do_quote ({Name , Meta , nil }, # elixir_quote {op = add_context } = Q )
383+ do_quote ({Name , Meta , nil }, # elixir_quote {op = quote } = Q )
378384 when is_atom (Name ), is_list (Meta ) ->
379385 ImportMeta = case Q # elixir_quote .imports_hygiene of
380386 nil -> Meta ;
@@ -430,7 +436,7 @@ do_quote({Left, Right}, Q) ->
430436
431437% % Everything else
432438
433- do_quote (Other , # elixir_quote {op = Op } = Q ) when Op =/= add_context ->
439+ do_quote (Other , # elixir_quote {op = Op } = Q ) when Op =/= quote ->
434440 do_escape (Other , Q );
435441
436442do_quote ({_ , _ , _ } = Tuple , Q ) ->
0 commit comments