From 0bbc255814c7a669d568aa31b0c2f83cfdc79ffa Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 6 Jun 2023 12:34:05 +0200 Subject: [PATCH] Dialyzer dirty workarounds because re:mp() is not an exported type Since Erlang/OTP 26, Dialyzer by default reports unknown types. ejabberd's type specs refer to the re:mp() type, but that isn't exported in the OTP source code, and cannot be used in any other modules. This commit provides very dirty workarounds, and any cleaner alternative is very welcomed. --- Makefile.in | 2 ++ include/logger.hrl | 2 ++ src/acl.erl | 18 +++++++++--------- src/gen_mod.erl | 2 +- src/mod_shared_roster_ldap.erl | 2 +- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Makefile.in b/Makefile.in index c51811b09..c56070eec 100644 --- a/Makefile.in +++ b/Makefile.in @@ -442,7 +442,9 @@ Makefile: Makefile.in ifeq "$(REBAR_VER)" "3" dialyzer: + find src/*_opt.erl -type f \! -regex ".*git.*" -exec sed -i 's/re:mp/ tuple/g' {} \; $(REBAR) dialyzer + find src/*_opt.erl -type f \! -regex ".*git.*" -exec sed -i 's/ tuple/re:mp/g' {} \; else deps := $(wildcard $(DEPSDIR)/*/ebin) diff --git a/include/logger.hrl b/include/logger.hrl index b6f272b73..b6e7067fe 100644 --- a/include/logger.hrl +++ b/include/logger.hrl @@ -62,5 +62,7 @@ _ -> 'Elixir.Logger':bare_log(error, io_lib:format(Format, Args), [?MODULE]) end). +-type re_mp() :: {re_pattern, _, _, _, _}. % Copied from re.erl + %% Uncomment if you want to debug p1_fsm/gen_fsm %%-define(DBGFSM, true). diff --git a/src/acl.erl b/src/acl.erl index 70bed9909..6b8ea42bf 100644 --- a/src/acl.erl +++ b/src/acl.erl @@ -39,14 +39,14 @@ -type acl_rule() :: {user, {binary(), binary()} | binary()} | {server, binary()} | {resource, binary()} | - {user_regexp, {re:mp(), binary()} | re:mp()} | - {server_regexp, re:mp()} | - {resource_regexp, re:mp()} | - {node_regexp, {re:mp(), re:mp()}} | - {user_glob, {re:mp(), binary()} | re:mp()} | - {server_glob, re:mp()} | - {resource_glob, re:mp()} | - {node_glob, {re:mp(), re:mp()}} | + {user_regexp, {re_mp(), binary()} | re_mp()} | + {server_regexp, re_mp()} | + {resource_regexp, re_mp()} | + {node_regexp, {re_mp(), re_mp()}} | + {user_glob, {re_mp(), binary()} | re_mp()} | + {server_glob, re_mp()} | + {resource_glob, re_mp()} | + {node_glob, {re_mp(), re_mp()}} | {shared_group, {binary(), binary()} | binary()} | {ip, ip_mask()}. -type access() :: [{action(), [access_rule()]}]. @@ -348,7 +348,7 @@ node_validator(UV, SV) -> %%%=================================================================== %%% Aux %%%=================================================================== --spec match_regexp(iodata(), re:mp()) -> boolean(). +-spec match_regexp(iodata(), re_mp()) -> boolean(). match_regexp(Data, RegExp) -> re:run(Data, RegExp) /= nomatch. diff --git a/src/gen_mod.erl b/src/gen_mod.erl index 75af9cab9..a3c8cb4fa 100644 --- a/src/gen_mod.erl +++ b/src/gen_mod.erl @@ -431,7 +431,7 @@ is_equal_opt(Opt, NewOpts, OldOpts) -> %%%=================================================================== -spec format_module_error(atom(), start | reload, non_neg_integer(), opts(), error | exit | throw, any(), - [erlang:stack_item()]) -> iolist(). + [tuple()]) -> iolist(). format_module_error(Module, Fun, Arity, Opts, Class, Reason, St) -> case {Class, Reason} of {error, {bad_return, Module, {error, _} = Err}} -> diff --git a/src/mod_shared_roster_ldap.erl b/src/mod_shared_roster_ldap.erl index 67dcdf4e4..665f52827 100644 --- a/src/mod_shared_roster_ldap.erl +++ b/src/mod_shared_roster_ldap.erl @@ -72,7 +72,7 @@ user_desc = <<"">> :: binary(), user_uid = <<"">> :: binary(), uid_format = <<"">> :: binary(), - uid_format_re :: undefined | re:mp(), + uid_format_re :: undefined | re_mp(), filter = <<"">> :: binary(), ufilter = <<"">> :: binary(), rfilter = <<"">> :: binary(),