workaround for R16B03 revert/lint bug

This commit is contained in:
Ulf Wiger 2013-12-19 12:22:57 +01:00
parent f89567ec01
commit 1a6cadd7bc

View File

@ -555,7 +555,8 @@ get_orig_syntax_tree(File) ->
-spec revert(forms()) -> -spec revert(forms()) ->
forms(). forms().
revert(Tree) when is_list(Tree) -> revert(Tree) when is_list(Tree) ->
[revert_form(T) || T <- lists:flatten(Tree)]. WorkAround = needs_revert_workaround(),
[revert_form(T, WorkAround) || T <- lists:flatten(Tree)].
%%% @spec (Tree) -> Form %%% @spec (Tree) -> Form
%%% %%%
@ -567,13 +568,56 @@ revert(Tree) when is_list(Tree) ->
%%% syntax tree, so this function is safe to call even on a regular Erlang %%% syntax tree, so this function is safe to call even on a regular Erlang
%%% form.</p> %%% form.</p>
revert_form(F) -> revert_form(F) ->
revert_form(F, needs_revert_workaround()).
revert_form(F, W) ->
case erl_syntax:revert(F) of case erl_syntax:revert(F) of
{attribute,L,A,Tree} when element(1,Tree) == tree -> {attribute,L,A,Tree} when element(1,Tree) == tree ->
{attribute,L,A,erl_syntax:revert(Tree)}; {attribute,L,A,erl_syntax:revert(Tree)};
Result -> Result ->
Result if W -> fix_impl_fun(Result);
true -> Result
end
end. end.
fix_impl_fun({'fun',L,{function,{atom,_,Fn},{integer,_,Ay}}}) ->
{'fun',L,{function,Fn,Ay}};
fix_impl_fun({'fun',L,{function,{atom,_,M},{atom,_,Fn},{integer,_,Ay}}}) ->
{'fun',L,{function,M,Fn,Ay}};
fix_impl_fun(T) when is_tuple(T) ->
list_to_tuple([fix_impl_fun(F) || F <- tuple_to_list(T)]);
fix_impl_fun([H|T]) ->
[fix_impl_fun(H) | fix_impl_fun(T)];
fix_impl_fun(X) ->
X.
needs_revert_workaround() ->
case application:get_env(parse_trans,revert_workaround) of
{ok, Bool} when is_boolean(Bool) -> Bool;
_ ->
Res = try lint_reverted()
catch
error:_ ->
true
end,
application:set_env(parse_trans,revert_workaround,Res),
Res
end.
lint_reverted() ->
Ts = [{attribute,1,module,m},
{attribute,2,export,[{f,0}]},
erl_syntax:function(erl_syntax:atom(f),
[erl_syntax:clause(
[],
[erl_syntax:implicit_fun(
erl_syntax:atom(f),
erl_syntax:integer(0))])])],
Rev = erl_syntax:revert_forms(Ts),
erl_lint:module(Rev),
false.
%%% @spec (Forms, Context) -> Forms | {error,Es,Ws} | {warnings,Forms,Ws} %%% @spec (Forms, Context) -> Forms | {error,Es,Ws} | {warnings,Forms,Ws}
%%% %%%
%%% @doc Checks the transformed result for errors and warnings %%% @doc Checks the transformed result for errors and warnings