Si j'ai un fichier beam compilé à partir de code Erlang avec debug_info
il est assez facile d'imprimer le code source correspondant :
{ok, {_, [{debug_info, {debug_info_v1, erl_abstract_code, AbstractCode}}]}} =
beam_lib:chunks("my_module.beam", [debug_info]).
{ok, Forms} = erl_abstract_code:debug_info(erlang_v1, module_name, AbstractCode, []).
io:format("~s~n", [erl_prettypr:format(erl_syntax:form_list(Forms))]).
Mais qu'en est-il d'Elixir ? Je peux faire les deux premières étapes comme ceci :
{ok, {_, [{debug_info, {debug_info_v1, elixir_erl, AbstractCode}}]}} =
beam_lib:chunks("Elixir.MyModule.beam", [debug_info]).
{ok, Forms} = elixir_erl:debug_info(elixir_v1, module_name, AbstractCode).
On obtient ainsi une carte de cette forme :
#{attributes => ...,
compile_opts => [],
definitions => ...,
deprecated => [],
file => <<"my_module.ex">>,
line => 95,
module => 'Elixir.MyModule',
unreachable => []}
Comment puis-je imprimer cela sous forme de code Elixir lisible par l'homme ?