1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
-module(xref_examples).
-export([script/0]).
%% Used at Erlang/OTP for finding undefined functions and unused local
%% functions. Output are the two files ${HOME}/undefined.txt and
%% ${HOME}/unused_locals.txt.
script() ->
Root = code:root_dir(),
Dir = os:getenv("HOME"),
Server = s,
xref:start(Server),
{ok, _Relname} = xref:add_release(Server, code:lib_dir(), {name,otp}),
%% Exclude undefined functions in some modules...
Exclude = "(CORBA|Cos|Orber|Puller|Pusher|"
"StackModule|oe_Cos|mnesia).*_impl",
UndefS = "XC || (XU - X - B)",
Q = io_lib:format("Undef = ~s,"
"Excluded = ~p:_/_,"
"Undef - Undef || Excluded",
[UndefS, Exclude]),
{ok, Undef} = xref:q(Server, lists:flatten(Q)),
{ok, NotCalled} = xref:analyze(Server, locals_not_used),
dump("%% " ++ Root ++
"\n%% Undefined external functions." ++
"\n%% The second MFA is the undefined function." ++
"\n%% Functions in modules matching the following "
"regular expression have been skipped:" ++
"\n%% " ++ Exclude,
filename:join(Dir, "undefined.txt"),
Undef),
dump("%% " ++ Root ++ "\n%% Unused local functions.",
filename:join(Dir, "unused_locals.txt"),
NotCalled),
catch xref:stop(Server),
halt().
dump(H, F, T) ->
{ok, IoDev} = file:open(F,[write]),
io:format(IoDev, "~s~n", [H]),
io:format(IoDev, "~p.~n", [T]),
file:close(IoDev).
|