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
 ]}.