aboutsummaryrefslogtreecommitdiffstats
path: root/lib/edoc/src/edoc_data.erl
diff options
context:
space:
mode:
authorHans Bolinder <[email protected]>2014-04-25 10:42:09 +0200
committerHans Bolinder <[email protected]>2014-04-28 11:56:42 +0200
commiteafe7f889a4ff60d9e3155518bda095740efe143 (patch)
treeb7414677fed503f2db33adbc47b1cb44a8e6f23b /lib/edoc/src/edoc_data.erl
parent15c6bea32b05ea1eca612c7637fc3df133937059 (diff)
downloadotp-eafe7f889a4ff60d9e3155518bda095740efe143.tar.gz
otp-eafe7f889a4ff60d9e3155518bda095740efe143.tar.bz2
otp-eafe7f889a4ff60d9e3155518bda095740efe143.zip
[edoc] Handle optional behaviour callbacks
Diffstat (limited to 'lib/edoc/src/edoc_data.erl')
-rw-r--r--lib/edoc/src/edoc_data.erl37
1 files changed, 25 insertions, 12 deletions
diff --git a/lib/edoc/src/edoc_data.erl b/lib/edoc/src/edoc_data.erl
index f88ba05f4b..eceb5cb1bd 100644
--- a/lib/edoc/src/edoc_data.erl
+++ b/lib/edoc/src/edoc_data.erl
@@ -173,21 +173,34 @@ callbacks(Es, Module, Env, Opts) ->
lists:keymember(callback, 1, Module#module.attributes)
of
true ->
- try (Module#module.name):behaviour_info(callbacks) of
- Fs ->
- Fs1 = [{F,A} || {F,A} <- Fs, is_atom(F), is_integer(A)],
- if Fs1 =:= [] ->
- [];
- true ->
- [{callbacks,
- [callback(F, Env, Opts) || F <- Fs1]}]
- end
- catch
- _:_ -> []
- end;
+ M = Module#module.name,
+ Fs = get_callback_functions(M, callbacks),
+ Os1 = get_callback_functions(M, optional_callbacks),
+ Fs1 = [FA || FA <- Fs, not lists:member(FA, Os1)],
+ Req = if Fs1 =:= [] ->
+ [];
+ true ->
+ [{callbacks,
+ [callback(FA, Env, Opts) || FA <- Fs1]}]
+ end,
+ Opt = if Os1 =:= [] ->
+ [];
+ true ->
+ [{optional_callbacks,
+ [callback(FA, Env, Opts) || FA <- Os1]}]
+ end,
+ Req ++ Opt;
false -> []
end.
+get_callback_functions(M, Callbacks) ->
+ try
+ [FA || {F, A} = FA <- M:behaviour_info(Callbacks),
+ is_atom(F), is_integer(A), A >= 0]
+ catch
+ _:_ -> []
+ end.
+
%% <!ELEMENT callback EMPTY>
%% <!ATTLIST callback
%% name CDATA #REQUIRED