Packages

otpbp

7.3.0
7.18.0 7.16.1 7.15.0 7.14.0 7.13.0 7.12.0 7.11.0 7.10.2 7.9.3 7.9.2 7.9.1 7.8.7 7.8.6 7.8.5 7.8.4 7.7.1 7.7.0 7.6.3 7.6.2 7.6.1 7.6.0 7.5.1 7.5.0 7.4.0 7.3.4 7.3.3 7.3.2 7.3.1 7.3.0 7.2.0 7.1.1 7.1.0 7.0.4 7.0.3 7.0.2 7.0.1 6.26.0 6.25.0 6.24.0 6.23.0 6.22.2 6.21.3 6.21.2 6.21.1 6.20.2 6.19.1 6.19.0 6.18.3 6.18.2 6.18.1 6.18.0 6.17.1 6.17.0 6.16.0 6.15.4 6.15.3 6.15.2 6.15.1 6.15.0 6.14.0 6.13.5 6.13.4 6.13.3 6.13.2 6.13.1 6.13.0 6.12.0 6.11.2 6.11.1 6.10.0 6.9.2 6.9.1 6.9.0 6.8.0 6.7.1 6.7.0 6.6.4 6.6.3 6.6.2 6.6.1 6.6.0 6.5.0 6.4.0 6.3.3 6.3.2 6.3.1 6.3.0 6.2.1 6.2.0 6.1.0 6.0.0 5.39.0 5.38.0 5.37.0 5.36.0 5.35.2 5.34.3 5.34.2 5.34.1 5.33.1 5.32.1 5.32.0 5.31.3 5.31.2 5.31.1 5.31.0 5.30.1 5.30.0 5.29.0 5.28.4 5.28.3 5.28.2 5.28.1 5.28.0 5.27.0 5.26.5 5.26.4 5.26.3 5.26.2 5.26.1 5.26.0 5.25.0 5.24.2 5.24.1 5.23.0 5.22.2 5.22.1 5.22.0 5.21.0 5.20.1 5.20.0 5.19.4 5.19.3 5.19.2 5.19.1 5.19.0 5.18.0 5.17.0 5.16.3 5.16.1 5.16.0 5.15.1 5.15.0 5.14.0 5.13.1 5.13.0 5.12.1 5.12.0 5.11.2 5.11.1 5.10.1 5.10.0 5.9.0 5.8.0 5.7.0 5.6.1 5.6.0 5.5.0 5.4.2 5.4.1 5.4.0 5.3.0 5.2.2 5.2.1 5.2.0 5.1.2 5.1.1 4.79.0 4.78.0 4.77.0 4.76.2 4.75.3 4.75.2 4.75.1 4.74.0 4.73.1 4.73.0 4.72.3 4.72.2 4.72.1 4.72.0 4.71.1 4.71.0 4.70.0 4.69.4 4.69.3 4.69.2 4.69.1 4.69.0 4.68.0 4.67.5 4.67.4 4.67.3 4.67.2 4.67.0 4.66.0 4.65.2 4.65.1 4.64.0 4.63.2 4.63.1 4.63.0 4.62.0 4.61.1 4.61.0 4.60.4 4.60.3 4.60.2 4.60.1 4.60.0 4.59.0 4.58.0 4.57.2 4.57.1 4.57.0 4.56.2 4.56.1 4.56.0 4.55.0 4.54.0 4.53.0 4.52.1 4.52.0 4.51.3 4.51.2 4.51.0 4.50.0 4.49.3 4.49.2

OTP backports

Current section

Files

Jump to
otpbp src otpbp_erl_pp.erl
Raw

src/otpbp_erl_pp.erl

-module(otpbp_erl_pp).
-ifndef(HAVE_erl_pp__legalize_vars_1).
% OTP 25.0
-export([legalize_vars/1]).
-endif.
-ifndef(HAVE_erl_pp__legalize_vars_1).
legalize_vars({function,ANNO,Name0,Arity,Clauses}) ->
%% Collect all used variables in this function and classify them as either syntactically valid or not.
{Valid, Invalid} = fold_vars(fun({var, _Anno, Name}, {Valid, Invalid}) ->
case atom_to_list(Name) of
[X|_] = Str when X >= $a, X =< $z -> {Valid, Invalid#{Name => Str}};
_ -> {Valid#{Name => Name}, Invalid}
end
end,
{#{}, #{}}, Clauses),
%% Make up an unique variable name for each key in Invalid, then replace all invalid names.
{function, ANNO, Name0, Arity,
map_vars(fun({var, Anno, Name}) -> {var, Anno, maps:get(Name, maps:fold(fun legalize_name/3, Valid, Invalid))} end,
Clauses)};
legalize_vars(Form) -> error(badarg, [Form]).
legalize_name(InvalidName, StringName, Used) ->
NewName = list_to_atom(string:to_upper(StringName)),
case Used of
#{NewName := _} -> legalize_name(InvalidName, [$X|StringName], Used);
#{} -> Used#{InvalidName => NewName}
end.
fold_vars(F, Acc0, Forms) when is_list(Forms) -> fold_vars_(F, Acc0, Forms);
fold_vars(F, Acc0, {var, _, _} = V) -> F(V, Acc0);
fold_vars(F, Acc0, Form) when is_tuple(Form) -> fold_vars_(F, Acc0, tuple_to_list(Form));
fold_vars(_, Acc, _) -> Acc.
fold_vars_(F, Acc0, Forms) -> lists:foldl(fun(Elem, Acc) -> fold_vars(F, Acc, Elem) end, Acc0, Forms).
map_vars(F, Forms) when is_list(Forms) -> map_vars_(F, Forms);
map_vars(F, {var, _, _} = V) -> F(V);
map_vars(F, Form) when is_tuple(Form) -> list_to_tuple(map_vars_(F, tuple_to_list(Form)));
map_vars(_, Form) -> Form.
map_vars_(F, Forms) -> [map_vars(F, Form) || Form <- Forms].
-endif.