Merge pull request #139 from gomoripeti/fix-cover-otp-18.0
Update for OTP 18.0
diff --git a/rebar.config b/rebar.config
index e7e33ff..bd09e12 100644
--- a/rebar.config
+++ b/rebar.config
@@ -1,7 +1,7 @@
%% Compiler Options ===========================================================
{erl_opts, [
%% Erlang releases after 17 don't put R in front of their name, and also require dict() to be written like dict:dict()
- {platform_define, "^[0-9]+", namespaced_dicts},
+ {platform_define, "^[0-9]+", namespaced_types},
warn_export_all,
warn_export_vars,
warn_shadow_vars,
diff --git a/src/meck_cover.erl b/src/meck_cover.erl
index 7ef2963..07bfc45 100644
--- a/src/meck_cover.erl
+++ b/src/meck_cover.erl
@@ -27,8 +27,8 @@
%% @doc Enabled cover on `<name>_meck_original'.
compile_beam(OriginalMod, Bin) ->
- alter_cover(),
- {ok, _} = cover:compile_beam(OriginalMod, Bin).
+ CompileBeams = alter_cover(),
+ [{ok, _}] = CompileBeams([{OriginalMod, Bin}]).
%% @doc Given a cover file `File' exported by `cover:export' overwrite
%% the module name with `Name'.
@@ -52,19 +52,38 @@
%%
%% 2. In order to avoid creating temporary files meck needs direct
%% access to `compile_beam/2' which allows passing a binary.
+%% In OTP 18.0 the internal API of cover changed a bit and
+%% compile_beam/2 was replaced by compile_beams/1.
alter_cover() ->
- case lists:member({compile_beam,2}, cover:module_info(exports)) of
- true ->
- ok;
- false ->
+ CoverExports = cover:module_info(exports),
+ case {lists:member({compile_beams,1}, CoverExports),
+ lists:member({compile_beam,2}, CoverExports)} of
+ {true, _} ->
+ fun cover:compile_beams/1;
+ {_, true} ->
+ fun compile_beam_wrapper/1;
+ {false, false} ->
Beam = meck_code:beam_file(cover),
AbsCode = meck_code:abstract_code(Beam),
- Exports = [{compile_beam, 2}, {get_term, 1}, {write, 2}],
+ {Exports, CompileBeams} =
+ case lists:member({analyse,0}, CoverExports) of
+ true ->
+ %% new API from OTP 18.0 on
+ {[{compile_beams, 1}, {get_term, 1}, {write, 2}],
+ fun cover:compile_beams/1};
+ false ->
+ {[{compile_beam, 2}, {get_term, 1}, {write, 2}],
+ fun compile_beam_wrapper/1}
+ end,
AbsCode2 = meck_code:add_exports(Exports, AbsCode),
_Bin = meck_code:compile_and_load_forms(AbsCode2),
- ok
+ CompileBeams
end.
+%% wrap cover's pre-18.0 internal API to simulate the new API
+compile_beam_wrapper(ModFiles) ->
+ [cover:compile_beam(Mod, Bin)||{Mod, Bin} <- ModFiles].
+
change_cover_mod_name(CoverTerms, Name) ->
{_, Terms} = lists:foldl(fun change_name_in_term/2, {Name,[]}, CoverTerms),
Terms.
diff --git a/src/meck_proc.erl b/src/meck_proc.erl
index 58c5603..2791905 100644
--- a/src/meck_proc.erl
+++ b/src/meck_proc.erl
@@ -47,7 +47,7 @@
%%% Definitions
%%%============================================================================
--ifdef(namespaced_dicts).
+-ifdef(namespaced_types).
-type meck_dict() :: dict:dict().
-else.
-type meck_dict() :: dict().
diff --git a/test.config b/test.config
index f2159d7..74bf444 100644
--- a/test.config
+++ b/test.config
@@ -4,11 +4,11 @@
{branch, "master"}}}]}.
%% Compiler Options ===========================================================
-% FIXME: Add warnings_as_errors once Hamcrest is fixed
{erl_opts, [
%% Erlang releases after 17 don't put R in front of their name, and also require dict() to be written like dict:dict()
- {platform_define, "^[0-9]+", namespaced_dicts},
+ {platform_define, "^[0-9]+", namespaced_types},
{platform_define, "^R(?!16B03)", cover_empty_compile_opts},
+ warnings_as_errors,
debug_info
]}.