⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xref.erl

📁 OTP是开放电信平台的简称
💻 ERL
📖 第 1 页 / 共 2 页
字号:
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 2000, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id $%%-module(xref).-behaviour(gen_server).%% External exports-export([start/1, start/2, stop/1]).-export([m/1, d/1,	 add_release/2, add_release/3,	 add_application/2, add_application/3, 	 add_module/2, add_module/3,	 add_directory/2, add_directory/3,	 replace_module/3, replace_module/4,	 replace_application/3, replace_application/4,	 remove_module/2, remove_application/2, remove_release/2,	 get_library_path/1, set_library_path/2, set_library_path/3,	 q/2, q/3, info/1, info/2, info/3, 	 update/1, update/2, 	 forget/1, forget/2, variables/1, variables/2,	 analyze/2, analyze/3, analyse/2, analyse/3,	 get_default/1, get_default/2, 	 set_default/2, set_default/3]).-export([format_error/1]).%% gen_server callbacks-export([init/1, handle_call/3, handle_cast/2, handle_info/2, 	 terminate/2, code_change/3]).-import(lists, [keydelete/3, keysearch/3]).-import(sofs, [to_external/1, is_sofs_set/1]).%%%----------------------------------------------------------------------%%% API%%%----------------------------------------------------------------------%% add_release(Servername, Directory) -> %%         {ok, ReleaseName} | Error%% add_release(Servername, Directory, Options) ->%%         {ok, ReleaseName} | Error%% add_application(Servername, Directory) -> %%         {ok, AppName} | Error%% add_application(Servername, Directory, Options) ->%%         {ok, AppName} | Error%% add_module(ServerName, Filename) ->%%     {ok, ModuleName} | Error%% add_module(ServerName, Filename, Options) ->%%     {ok, ModuleName} | Error%% add_directory(ServerName, Directory) ->%%     {ok, [ModuleName]} | Error%% add_directory(ServerName, Directory, Options) ->%%     {ok, [ModuleName]} | Error%% replace_module(ServerName, Module, Filename) ->%%     {ok, Module} | Error%% replace_module(ServerName, Module, Filename, Options) ->%%     {ok, Module} | Error%% replace_application(ServerName, Application, Directory) ->%%     {ok, AppName} | Error%% replace_application(ServerName, Application, Directory, Options) ->%%     {ok, AppName} | Error%% remove_module(ServerName, Module) -> ok | Error%% remove_application(ServerName, Application) -> ok | Error%% remove_release(ServerName, Release) -> ok | Error%% get_library_path(Servername) -> {ok, Path}%% set_library_path(Servername, Path) -> ok | Error%% set_library_path(Servername, Path, Options) -> ok | Error%% info(Servername) -> InfoList%% info(Servername, What) -> [{what(), InfoList}] | Error%% info(Servername, What, Qual) -> [{what(), InfoList}] | Error%% update(Servername) -> {ok, [Module]} | Error%% update(Servername, Options) -> {ok, [Module]} | Error%% forget(Servername) -> ok%% forget(Servername, VariableName) -> ok | Error%% variables(Servername) -> {ok, [{VarType, [VariableName]}]} | Error%% variables(Servername, [VarType]) -> {ok, [{VarType, [VariableName]}]}%% analyze(ServerName, What) -> {ok, Answer} | Error%% analyze(ServerName, What, Options) -> {ok, Answer} | Error%% q(Servername, Query) -> {ok, Answer} | Error%% q(Servername, Query, Options) -> {ok, Answer} | Error%% get_default(ServerName, Option) -> {ok, Value} | Error%% set_default(ServerName, Option, Value) -> {ok, OldValue} | Error%% get_default(ServerName) -> [{Option, Value}]%% set_default(ServerName, [{Option, Value}]) -> ok | Error%% format_error(Error) -> io_string()%% m(Module) -> [Result] | Error%% m(File) -> [Result] | Error%% d(Directory) -> [Result] | Error%% -> [Faulty] | Error; Faulty = {undefined, Calls} | {unused, Funs}%% No user variables have been assigned digraphs, so there is no%% need to call xref_base:delete/1.m(Module) when is_atom(Module) ->    case xref_utils:find_beam(Module) of	{ok, File} ->	    Fun = fun(S) ->                           xref_base:add_module(S, File, {builtins,true})                  end,	    case catch do_functions_analysis(Fun) of		{error, _, {no_debug_info, _}} ->		    catch do_modules_analysis(Fun);		Result ->		    Result	    end;	Error -> Error    end;m(File) ->    case xref_utils:split_filename(File, ".beam") of	false ->	    {error, xref_base, {invalid_filename, File}};	{Dir, BaseName} ->	    BeamFile = filename:join(Dir, BaseName),	    Fun = fun(S) ->                           xref_base:add_module(S, BeamFile, {builtins, true})                  end,	    case catch do_functions_analysis(Fun) of		{error, _, {no_debug_info, _}} ->		    catch do_modules_analysis(Fun);		Result ->		    Result	    end    end.%% -> [Faulty] | Error; Faulty = {undefined, Calls} | {unused, Funs}d(Directory) ->    Fun = fun(S) ->                  xref_base:add_directory(S, Directory, {builtins, true})          end,    Fun1 = fun(S) ->		   case Fun(S) of		       {ok, [], _S} -> 			   no_modules;		       Reply -> 			   Reply		   end	   end,    case catch do_functions_analysis(Fun1) of	no_modules ->	    catch do_modules_analysis(Fun);	Result -> 	    Result    end.start(Name) ->    start(Name, []).start(Name, Opts0) when is_list(Opts0) ->    {Args, Opts} = case keysearch(xref_mode, 1, Opts0) of		       {value, Mode} ->			   {[Mode], keydelete(xref_mode, 1, Opts0)};		       false ->			   {[], Opts0}		   end,    gen_server:start({local, Name}, xref, Args, Opts);start(Name, Opt) ->    start(Name, [Opt]).stop(Name) ->    gen_server:call(Name, stop, infinity).add_release(Name, Dir) ->    gen_server:call(Name, {add_release, Dir}, infinity).add_release(Name, Dir, Options) ->    gen_server:call(Name, {add_release, Dir, Options}, infinity).add_application(Name, Dir) ->    gen_server:call(Name, {add_application, Dir}, infinity).add_application(Name, Dir, Options) ->    gen_server:call(Name, {add_application, Dir, Options}, infinity).add_module(Name, File) ->    gen_server:call(Name, {add_module, File}, infinity).add_module(Name, File, Options) ->    gen_server:call(Name, {add_module, File, Options}, infinity).add_directory(Name, Dir) ->    gen_server:call(Name, {add_directory, Dir}, infinity).add_directory(Name, Dir, Options) ->    gen_server:call(Name, {add_directory, Dir, Options}, infinity).replace_module(Name, Module, File) ->    gen_server:call(Name, {replace_module, Module, File}, infinity).replace_module(Name, Module, File, Options) ->    gen_server:call(Name, {replace_module, Module, File, Options}, infinity).replace_application(Name, App, Dir) ->    gen_server:call(Name, {replace_application, App, Dir}, infinity).replace_application(Name, App, Dir, Options) ->    gen_server:call(Name, {replace_application, App, Dir, Options}, infinity).remove_module(Name, Mod) ->    gen_server:call(Name, {remove_module, Mod}, infinity).remove_application(Name, App) ->    gen_server:call(Name, {remove_application, App}, infinity).remove_release(Name, Rel) ->    gen_server:call(Name, {remove_release, Rel}, infinity).get_library_path(Name) ->    gen_server:call(Name, get_library_path, infinity).set_library_path(Name, Path) ->    gen_server:call(Name, {set_library_path, Path}, infinity).set_library_path(Name, Path, Options) ->    gen_server:call(Name, {set_library_path, Path, Options}, infinity).info(Name) ->    gen_server:call(Name, info, infinity).info(Name, What) ->    gen_server:call(Name, {info, What}, infinity).info(Name, What, Qual) ->    gen_server:call(Name, {info, What, Qual}, infinity).update(Name) ->    gen_server:call(Name, update, infinity).update(Name, Options) ->    gen_server:call(Name, {update, Options}, infinity).forget(Name) ->    gen_server:call(Name, forget, infinity).forget(Name, Variable) ->    gen_server:call(Name, {forget, Variable}, infinity).variables(Name) ->    gen_server:call(Name, variables, infinity).variables(Name, Options) ->    gen_server:call(Name, {variables, Options}, infinity).analyse(Name, What) ->    gen_server:call(Name, {analyze, What}, infinity).analyse(Name, What, Options) ->    gen_server:call(Name, {analyze, What, Options}, infinity).analyze(Name, What) ->    gen_server:call(Name, {analyze, What}, infinity).analyze(Name, What, Options) ->    gen_server:call(Name, {analyze, What, Options}, infinity).q(Name, Q) ->    gen_server:call(Name, {qry, Q}, infinity).q(Name, Q, Options) ->    gen_server:call(Name, {qry, Q, Options}, infinity).get_default(Name) ->    gen_server:call(Name, get_default, infinity).get_default(Name, Option) ->    gen_server:call(Name, {get_default, Option}, infinity).set_default(Name, OptionValues) ->    gen_server:call(Name, {set_default, OptionValues}, infinity).set_default(Name, Option, Value) ->    gen_server:call(Name, {set_default, Option, Value}, infinity).format_error({error, Module, Error}) ->    Module:format_error(Error);format_error(E) ->    io_lib:format("~p~n", [E]).%%%----------------------------------------------------------------------%%%Callback functions from gen_server%%%----------------------------------------------------------------------%%----------------------------------------------------------------------%% Func: init/1%% Returns: {ok, State}          |

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -