Packages
otpbp
4.69.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
Current section
Files
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.