Current section

Files

Jump to
beamoji src beamoji_utils.erl
Raw

src/beamoji_utils.erl

-module(beamoji_utils).
-export(['πŸͺ„'/2]).
-type translator() :: fun((erl_parse:abstract_form()) -> erl_parse:abstract_form()).
-spec 'πŸͺ„'(translator(), erl_parse:abstract_form()) -> erl_parse:abstract_form().
'πŸͺ„'(Translator, {atom, Anno, Atom}) ->
{atom, Anno, Translator(Atom)};
'πŸͺ„'(Translator, {function, Anno, Name, Arity, Clauses}) when is_atom(Name) ->
{function, Anno, Translator(Name), Arity, Clauses};
'πŸͺ„'(Translator, {attribute, Anno, record, {Name, Fields}}) when is_atom(Name) ->
{attribute, Anno, record, {Translator(Name), Fields}};
'πŸͺ„'(Translator, {attribute, Anno, AttrName, Es})
when AttrName == export; AttrName == export_type ->
{attribute, Anno, AttrName, 'πŸͺ„πŸͺ„'(Translator, Es)};
'πŸͺ„'(Translator, {attribute, Anno, import, {Mod, Es}}) ->
{attribute, Anno, import, {Mod, 'πŸͺ„πŸͺ„'(Translator, Es)}};
'πŸͺ„'(Translator, {attribute, Anno, AttrName, {Name, Type, Variables}})
when AttrName == type; AttrName == opaque ->
{attribute, Anno, AttrName, {Translator(Name), Type, Variables}};
'πŸͺ„'(Translator, {attribute, Anno, AttrName, {{Name, Arity}, Clauses}})
when AttrName == spec; AttrName == callback ->
{attribute, Anno, AttrName, {{Translator(Name), Arity}, Clauses}};
'πŸͺ„'(Translator, {attribute, Anno, spec, {{Module, Name, Arity}, Clauses}}) ->
{attribute, Anno, spec, {{Module, Translator(Name), Arity}, Clauses}};
'πŸͺ„'(_Translator, Ast) ->
Ast.
'πŸͺ„πŸͺ„'(Translator, Es) ->
[{Translator(Name), Arity} || {Name, Arity} <- Es].