diff options
author | Hans Bolinder <[email protected]> | 2014-04-25 10:42:09 +0200 |
---|---|---|
committer | Hans Bolinder <[email protected]> | 2014-04-28 11:56:42 +0200 |
commit | eafe7f889a4ff60d9e3155518bda095740efe143 (patch) | |
tree | b7414677fed503f2db33adbc47b1cb44a8e6f23b /lib/edoc/src/edoc_data.erl | |
parent | 15c6bea32b05ea1eca612c7637fc3df133937059 (diff) | |
download | otp-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.erl | 37 |
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 |