typer_options.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 142 行

ERL
142
字号
%% -*- erlang-indent-level: 2 -*-%%--------------------------------------------------------------------%% File        : typer_options.erl%% Author      : Bingwen He <Bingwen.He@gmail.com>%% Description : Handles all command-line options given to TypEr%%---------------------------------------------------------------------module(typer_options).-export([process/0, lookup/2]).-include("typer.hrl").process() ->  Args = init:get_plain_arguments(),  %% io:format("Args is ~p\n",[Args]),  analyze_arg(Args, #args{}, #analysis{}).lookup(Elem, Options) ->  lists:member(Elem, Options).analyze_arg([], Arg, Analysis) -> {Arg, Analysis};analyze_arg(ArgList, Arg, Analysis) ->  {Result,Rest} = cl(ArgList),  {NewArg,NewAnalysis} = analyze_result(Result, Arg, Analysis),  analyze_arg(Rest, NewArg, NewAnalysis).cl(["-h"|_])     -> help_message();cl(["--help"|_]) -> help_message();cl(["-v"|_])        -> version_message();cl(["--version"|_]) -> version_message();cl(["--show"|Opts]) -> {{mode,show}, Opts};cl(["--show-exported"|Opts]) -> {{mode,show_exported}, Opts};cl(["--annotate-inc-files"|Opts]) -> {{mode,annotate_inc_files}, Opts};cl(["-D"++Defines|Opts]) ->  case Defines of    "" -> typer:error("no defines specified after -D");    _ ->      {ok,Result} = regexp:split(Defines, "="),      Elem = collect_defines(Result),      {{macros,Elem}, Opts}  end;cl(["-I",Dir|Opts]) -> {{inc,Dir}, Opts};cl(["-I"++Dir|Opts]) ->  case Dir of    "" -> typer:error("no include directory specified after -I");    _ -> {{inc,Dir}, Opts}  end;cl(["-T"|Opts]) ->  {Files, RestOpts} = dialyzer_cl_parse:collect_args(Opts),  case Files of    [] -> typer:error("no file or directory specified after -T");    [_|_] -> {{trust,Files}, RestOpts}  end;cl(["-r"|Opts]) ->  {Files, RestOpts} = dialyzer_cl_parse:collect_args(Opts),  {{a_dir_r,Files}, RestOpts};cl(["-"++H|_]) -> typer:error("unknown option -"++H);cl(Opts) ->   {Args, RestOpts} = dialyzer_cl_parse:collect_args(Opts),  {{analyze,Args}, RestOpts}.collect_defines(Result) ->  case Result of    [Def,Val] ->      {ok,Tokens,_} = erl_scan:string(Val++"."),      {ok,ErlVal} = erl_parse:parse_term(Tokens),      {list_to_atom(Def), ErlVal};    [Def] ->      {list_to_atom(Def), true}  end.%% Get information about files that the user trusts and wants to analyzeanalyze_result({analyze,Val}, Args, Analysis) ->   NewVal = Args#args.analyze ++ Val,  {Args#args{analyze=NewVal}, Analysis};analyze_result({a_dir_r,Val}, Args, Analysis) ->   NewVal = Args#args.analyzed_dir_r ++ Val,  {Args#args{analyzed_dir_r=NewVal}, Analysis};analyze_result({trust,Val}, Args, Analysis) ->   NewVal = Args#args.trust ++ Val,  {Args#args{trust=NewVal}, Analysis};%% Get useful information for actual analysisanalyze_result({mode,Val}, Args, Analysis) ->   case Analysis#analysis.mode of    [] -> {Args, Analysis#analysis{mode=[Val]}};    _  -> mode_error()  end;analyze_result({macros,Val}, Args, Analysis) ->  NewVal = Analysis#analysis.macros ++ [Val],  {Args, Analysis#analysis{macros=NewVal}};analyze_result({inc,Val}, Args, Analysis) ->   NewVal = Analysis#analysis.includes ++ [Val],  {Args, Analysis#analysis{includes=NewVal}}.%%--------------------------------------------------------------------mode_error() ->  typer:error("can not do \"show\", \"show-exported\", and \"annotate-inc-files\" at the same time").  version_message() ->  io:format("TypEr version "++?VSN++"\n"),  erlang:halt(0).help_message() ->  S = " Usage: typer [--help] [--version]              [--show | --show-exported | --annotate-inc-files]              [-Ddefine]* [-I include_dir]* [-T application]* [-r] file* Options:   -r       type annotate application(s) searching their directories       recursively for .erl files   --show       Prints on the current output the types of all functions in the       file(s) that are analyzed (default is to annotate these files)   --show-exported       Same as --show, but only prints types of exported functions   --annotate-inc-files       Annotates all -include() files as well as all .erl files that       are analyzed   -T file*       The file(s) already contain type annotations and these annotations       are to be trusted in order to type annotate the rest of the files       (Multiple files or dirs, separated by spaces, can be specified.)   -Dname (or -Dname=value)       pass the defined name(s) to TypEr       (The syntax of defines is the same as that used by \"erlc\".)   -I include_dir       pass the include_dir to TypEr       (The syntax of includes is the same as that used by \"erlc\".)   --version (or -v)       prints the Typer version and exits   --help (or -h)       prints this message and exits Note:   * denotes that multiple occurrences of these options are possible.",  io:put_chars(S),  erlang:halt(0).

⌨️ 快捷键说明

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