Summary: This workflow still uses the parse transform hook to detect which files are compiled. The parse transform now adds an entry to a list of compiled BEAMs that will be traversed after compilation by the new `extract.escript` to produce the JSON ASTs in the provided outdir. Differential Revision: D29103633 fbshipit-source-id: 12b8720f4master
parent
97c9481070
commit
25711189a8
@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env escript
|
||||||
|
% Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
%
|
||||||
|
% This source code is licensed under the MIT license found in the
|
||||||
|
% LICENSE file in the root directory of this source tree.
|
||||||
|
%
|
||||||
|
%
|
||||||
|
|
||||||
|
usage() ->
|
||||||
|
Usage =
|
||||||
|
"Usage:\n"
|
||||||
|
" extract.escript <compiled_list_path> <outdir>\n"
|
||||||
|
"\n"
|
||||||
|
"This script extracts in <outdir> the AST of all compiled\n"
|
||||||
|
"BEAM files listed in <compiled_list_path>",
|
||||||
|
io:format("~s", [Usage]),
|
||||||
|
halt(1).
|
||||||
|
|
||||||
|
main([ListPath, OutDir]) ->
|
||||||
|
Beams =
|
||||||
|
case file:consult(ListPath) of
|
||||||
|
{ok, Contents} -> Contents;
|
||||||
|
Error ->
|
||||||
|
io:format("error while reading file `~s`: ~p~n", [ListPath, Error]),
|
||||||
|
halt(1)
|
||||||
|
end,
|
||||||
|
process_beams(Beams, OutDir);
|
||||||
|
main(_) ->
|
||||||
|
usage().
|
||||||
|
|
||||||
|
process_beams([], _) -> ok;
|
||||||
|
process_beams([BeamFilePath | L], OutDir) ->
|
||||||
|
case get_ast(BeamFilePath) of
|
||||||
|
{ok, Module, Forms} ->
|
||||||
|
OutFilePath = filename:join(OutDir, atom_to_list(Module) ++ ".json"),
|
||||||
|
dump_ast_as_json(Forms, OutFilePath);
|
||||||
|
{error, What} ->
|
||||||
|
io:format("error while getting AST from `~s`: ~p~n",[BeamFilePath, What])
|
||||||
|
end,
|
||||||
|
process_beams(L, OutDir).
|
||||||
|
|
||||||
|
get_ast(BeamFilePath) ->
|
||||||
|
case beam_lib:chunks(BeamFilePath, [abstract_code]) of
|
||||||
|
{ok, {Module, [{abstract_code, {_, Forms}}]}} ->
|
||||||
|
{ok, Module, Forms};
|
||||||
|
{error, _, What} ->
|
||||||
|
{error, What}
|
||||||
|
end.
|
||||||
|
|
||||||
|
dump_ast_as_json(Forms, OutFilePath) ->
|
||||||
|
Object = ast_to_json(Forms),
|
||||||
|
Contents = jsone:encode(Object),
|
||||||
|
file:write_file(OutFilePath, Contents).
|
||||||
|
|
||||||
|
ast_to_json([]) ->
|
||||||
|
[];
|
||||||
|
ast_to_json(Node) when is_list(Node) ->
|
||||||
|
case lists:all(fun(Item) -> is_integer(Item) end, Node) of
|
||||||
|
true -> unicode:characters_to_binary(Node);
|
||||||
|
false -> [ast_to_json(Child) || Child <- Node]
|
||||||
|
end;
|
||||||
|
ast_to_json(Node) when is_tuple(Node) ->
|
||||||
|
L = tuple_to_list(Node),
|
||||||
|
ast_to_json(L);
|
||||||
|
ast_to_json(Node) ->
|
||||||
|
Node.
|
Loading…
Reference in new issue