summaryrefslogtreecommitdiff
path: root/src/rebar_prv_dialyzer.erl
diff options
context:
space:
mode:
authorStuart Thackray <stuart.thackray@gmail.com>2017-01-06 12:57:03 +0200
committerStuart Thackray <stuart.thackray@gmail.com>2017-01-06 12:57:03 +0200
commit71187514dabdd94aa333495d92df84a2e750099f (patch)
tree74e3257522e3c9697a8b3aa1fa3a589d8a3ddf9b /src/rebar_prv_dialyzer.erl
parent8fb8a91130e0e5c239bb837b9adc4ad71e5806b8 (diff)
parent91a25c11841314e35b095ea0382867c090616ff1 (diff)
Merged branch master into master
Diffstat (limited to 'src/rebar_prv_dialyzer.erl')
-rw-r--r--src/rebar_prv_dialyzer.erl43
1 files changed, 35 insertions, 8 deletions
diff --git a/src/rebar_prv_dialyzer.erl b/src/rebar_prv_dialyzer.erl
index 622ee60..82d2d07 100644
--- a/src/rebar_prv_dialyzer.erl
+++ b/src/rebar_prv_dialyzer.erl
@@ -249,10 +249,15 @@ ebin_files(EbinDir) ->
File <- filelib:wildcard(Wildcard, EbinDir)].
read_plt(_State, Plt) ->
- case dialyzer:plt_info(Plt) of
- {ok, Info} ->
- Files = proplists:get_value(files, Info, []),
+ Vsn = dialyzer_version(),
+ case plt_files(Plt) of
+ {ok, Files} when Vsn < {2, 9, 0} ->
+ % Before dialyzer-2.9 (OTP 18.3) removing a beam file from the PLT
+ % that no longer exists would crash. Therefore force a rebuild of
+ % PLT if any files no longer exist.
read_plt_files(Plt, Files);
+ {ok, _} = Result when Vsn >= {2, 9, 0} ->
+ Result;
{error, no_such_file} ->
error;
{error, read_error} ->
@@ -260,6 +265,14 @@ read_plt(_State, Plt) ->
throw({dialyzer_error, Error})
end.
+plt_files(Plt) ->
+ case dialyzer:plt_info(Plt) of
+ {ok, Info} ->
+ {ok, proplists:get_value(files, Info, [])};
+ {error, _} = Error ->
+ Error
+ end.
+
%% If any file no longer exists dialyzer will fail when updating the PLT.
read_plt_files(Plt, Files) ->
case [File || File <- Files, not filelib:is_file(File)] of
@@ -353,8 +366,19 @@ update_base_plt(State, BasePlt, Output, BaseFiles) ->
build_plt(State, BasePlt, Output, BaseFiles)
end.
+build_plt(State, Plt, _, []) ->
+ ?INFO("Building with no files in ~p...", [Plt]),
+ Opts = [{get_warnings, false},
+ {output_plt, Plt},
+ {apps, [erts]}],
+ % Create a PLT with erts files and then remove erts files to be left with an
+ % empty PLT. Dialyzer will crash when trying to build a PLT with an empty
+ % file list.
+ _ = dialyzer:run([{analysis_type, plt_build} | Opts]),
+ _ = dialyzer:run([{analysis_type, plt_remove}, {init_plt, Plt} | Opts]),
+ {0, State};
build_plt(State, Plt, Output, Files) ->
- ?INFO("Adding ~b files to ~p...", [length(Files), Plt]),
+ ?INFO("Building with ~b files in ~p...", [length(Files), Plt]),
GetWarnings = get_config(State, get_warnings, false),
Opts = [{analysis_type, plt_build},
{get_warnings, GetWarnings},
@@ -369,12 +393,15 @@ succ_typings(State, Plt, Output) ->
{0, State};
_ ->
Apps = rebar_state:project_apps(State),
- succ_typings(State, Plt, Output, Apps)
+ ?INFO("Doing success typing analysis...", []),
+ Files = apps_to_files(Apps),
+ succ_typings(State, Plt, Output, Files)
end.
-succ_typings(State, Plt, Output, Apps) ->
- ?INFO("Doing success typing analysis...", []),
- Files = apps_to_files(Apps),
+succ_typings(State, Plt, _, []) ->
+ ?INFO("Analyzing no files with ~p...", [Plt]),
+ {0, State};
+succ_typings(State, Plt, Output, Files) ->
?INFO("Analyzing ~b files with ~p...", [length(Files), Plt]),
Opts = [{analysis_type, succ_typings},
{get_warnings, true},