typer_preprocess.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 120 行
ERL
120 行
%% -*- erlang-indent-level: 2 -*-%%%----------------------------------------------%%% File : typer_preprocess.erl%%% Author : Bingwen He <hebingwen@hotmail.com>%%% Description : %%%-----------------------------------------------module(typer_preprocess).-export([get_all_files/2]).-include("typer.hrl").get_all_files(Args, analysis) -> case internal_get_all_files(Args#args.analyze, Args#args.analyzed_dir_r, fun test_erl_file/1) of [] -> typer:error("no file(s) to analyze"); AllFiles -> AllFiles end;get_all_files(Args, trust) -> internal_get_all_files(Args#args.trust,[], fun test_ann_erl_file/1).test_erl_file(File) -> %% Get ".erl" files without ".ann.erl" files case filename:extension(File) of ".erl" -> %% Exclude files ending with ".ann.erl" case regexp:matches(File, "[\.](ann)[\.](erl)$") of {match, []} -> true; {match, _ } -> false end; _ -> false end.test_ann_erl_file(File) -> %% Get ".ann.erl" files case regexp:matches(File, "[\.](ann)[\.](erl)$") of {match, []} -> false; {match, _ } -> true end.internal_get_all_files(File_Dir, Dir_R, Fun) -> All_File_1 = process_file_and_dir(File_Dir, Fun), All_File_2 = process_dir_recursively(Dir_R, Fun), remove_dup(All_File_1 ++ All_File_2).process_file_and_dir(File_Dir,TestFun) -> Fun = fun (Elem, Acc) -> case filelib:is_regular(Elem) of true -> process_file(Elem,TestFun,Acc); false -> check_dir(Elem,non_recursive,Acc,TestFun) end end, lists:foldl(Fun,[],File_Dir).process_dir_recursively(Dirs,TestFun) -> Fun = fun (Dir, Acc) -> check_dir(Dir,recursive,Acc,TestFun) end, lists:foldl(Fun, [], Dirs).check_dir(Dir, Mode, Acc, Fun) -> case file:list_dir(Dir) of {ok, Files} -> {TmpDirs, TmpFiles} = split_dirs_and_files(Files,Dir), case Mode of non_recursive -> FinalFiles = process_file_and_dir(TmpFiles,Fun), Acc++FinalFiles; recursive -> TmpAcc1 = process_file_and_dir(TmpFiles,Fun), TmpAcc2 = process_dir_recursively(TmpDirs,Fun), Acc++TmpAcc1++TmpAcc2 end; {error, eacces} -> typer:error("no access permission to dir \""++Dir++"\""); {error, enoent} -> typer:error("\""++Dir++"\" is not a valid file or directory"); {error, _Reason} -> typer:error("error involving a use of file:list_dir/1") end.%% Same order as the input listprocess_file(File,TestFun,Acc) -> case TestFun(File) of true -> Acc++[File]; false -> Acc end.%% Same order as the input listsplit_dirs_and_files(Elems,Dir) -> Test_Fun = fun (Elem, {DirAcc,FileAcc}) -> File = filename:join(Dir,Elem), case filelib:is_regular(File) of false -> {[File|DirAcc], FileAcc}; true -> {DirAcc, [File|FileAcc]} end end, {Dirs,Files} = lists:foldl(Test_Fun, {[],[]}, Elems), {lists:reverse(Dirs), lists:reverse(Files)}. %%-------------------------------------------------------------%% utils%%-------------------------------------------------------------%% Same order as the input list%% Remove duplicate filenamesremove_dup(Files) -> Test_Dup = fun (File, Acc) -> case lists:member(File,Acc) of true -> Acc; false -> [File|Acc] end end, Reversed_Elems = lists:foldl(Test_Dup, [], Files), lists:reverse(Reversed_Elems).
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?