summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeru Ohta <phjgt308@gmail.com>2015-09-08 03:43:13 +0900
committerTakeru Ohta <phjgt308@gmail.com>2015-09-08 04:30:22 +0900
commitfa462e9dba1e3e94f6d74e36c99e25b80d4f524a (patch)
tree3bfc75d4fc09d6e513d792d1925490e23018c765
parentb72c19c12cfaa3cfae335a63372c252c819548e1 (diff)
Add `plt_include_all_deps` dialyzer config option
-rw-r--r--rebar.config.sample1
-rw-r--r--src/rebar_prv_dialyzer.erl37
2 files changed, 37 insertions, 1 deletions
diff --git a/rebar.config.sample b/rebar.config.sample
index 8621b44..5dcd7de 100644
--- a/rebar.config.sample
+++ b/rebar.config.sample
@@ -100,6 +100,7 @@
{warnings, [underspecs, no_return]},
{get_warnings, true},
{plt_extra_apps, []},
+ {plt_include_all_deps, false},
{plt_location, local}, % local | "/my/file/name"
{plt_prefix, "rebar3"},
{base_plt_apps, [stdlib, kernel, crypto]},
diff --git a/src/rebar_prv_dialyzer.erl b/src/rebar_prv_dialyzer.erl
index 1cf7b71..68cc63a 100644
--- a/src/rebar_prv_dialyzer.erl
+++ b/src/rebar_prv_dialyzer.erl
@@ -45,6 +45,9 @@ desc() ->
"`warnings` - a list of dialyzer warnings\n"
"`get_warnings` - display warnings when altering a PLT file (boolean)\n"
"`plt_extra_apps` - a list of applications to include in the PLT file*\n"
+ "`plt_include_all_deps` - in addition to the first level dependencies, "
+ "include all nested dependent applications in the PLT file (boolean), "
+ "default to `false`\n"
"`plt_location` - the location of the PLT file, `local` to store in the "
"profile's base directory (default) or a custom directory.\n"
"`plt_prefix` - the prefix to the PLT file, defaults to \"rebar3\"**\n"
@@ -178,7 +181,12 @@ proj_plt_files(State) ->
PltApps = get_config(State, plt_extra_apps, []),
Apps = rebar_state:project_apps(State),
DepApps = lists:flatmap(fun rebar_app_info:applications/1, Apps),
- get_plt_files(BasePltApps ++ PltApps ++ DepApps, Apps).
+ DepApps1 =
+ case get_config(State, plt_include_all_deps, false) of
+ false -> DepApps;
+ true -> collect_nested_dependent_apps(DepApps)
+ end,
+ get_plt_files(BasePltApps ++ PltApps ++ DepApps1, Apps).
default_plt_apps() ->
[erts,
@@ -442,3 +450,30 @@ no_warnings() ->
get_config(State, Key, Default) ->
Config = rebar_state:get(State, dialyzer, []),
proplists:get_value(Key, Config, Default).
+
+-spec collect_nested_dependent_apps([atom()]) -> [atom()].
+collect_nested_dependent_apps(RootApps) ->
+ Deps = lists:foldl(fun collect_nested_dependent_apps/2, sets:new(), RootApps),
+ sets:to_list(Deps).
+
+-spec collect_nested_dependent_apps(atom(), rebar_set()) -> rebar_set().
+collect_nested_dependent_apps(App, Seen) ->
+ case sets:is_element(App, Seen) of
+ true ->
+ Seen;
+ false ->
+ Seen1 = sets:add_element(App, Seen),
+ case code:lib_dir(App) of
+ {error, _} ->
+ Seen1;
+ AppDir ->
+ case rebar_app_discover:find_app(AppDir, all) of
+ false ->
+ Seen1;
+ {true, AppInfo} ->
+ lists:foldl(fun collect_nested_dependent_apps/2,
+ Seen1,
+ rebar_app_info:applications(AppInfo))
+ end
+ end
+ end.