diff options
Diffstat (limited to 'lib/edoc/src/edoc_data.erl')
| -rw-r--r-- | lib/edoc/src/edoc_data.erl | 70 | 
1 files changed, 28 insertions, 42 deletions
| diff --git a/lib/edoc/src/edoc_data.erl b/lib/edoc/src/edoc_data.erl index f88ba05f4b..b797d74a71 100644 --- a/lib/edoc/src/edoc_data.erl +++ b/lib/edoc/src/edoc_data.erl @@ -26,7 +26,7 @@  -module(edoc_data). --export([module/4, package/4, overview/4, type/2]). +-export([module/4, overview/4, type/2]).  -export([hidden_filter/2, get_all_tags/1]). @@ -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 @@ -497,41 +510,14 @@ get_tags(_, []) -> [].  type(T, Env) ->      xmerl_lib:expand_element({type, [edoc_types:to_xml(T, Env)]}). -%% <!ELEMENT package (description?, author*, copyright?, version?, -%% 		   since?, deprecated?, see*, reference*, todo?, -%% 		   modules)> -%% <!ATTLIST package -%%   name CDATA #REQUIRED -%%   root CDATA #IMPLIED> -%% <!ELEMENT modules (module+)> - -package(Package, Tags, Env, Opts) -> -    Env1 = Env#env{package = Package, -		   root = edoc_refs:relative_package_path('', Package)}, -    xmerl_lib:expand_element(package_1(Package, Tags, Env1, Opts)). - -package_1(Package, Tags, Env, Opts) -> -    {package, [{root, Env#env.root}], -     ([{packageName, [atom_to_list(Package)]}] -      ++ get_doc(Tags) -      ++ authors(Tags) -      ++ get_copyright(Tags) -      ++ get_version(Tags) -      ++ get_since(Tags) -      ++ get_deprecated(Tags) -      ++ sees(Tags, Env) -      ++ references(Tags) -      ++ todos(Tags, Opts)) -    }. -  %% <!ELEMENT overview (title, description?, author*, copyright?, version?, -%%                     since?, see*, reference*, todo?, packages, modules)> +%%                     since?, see*, reference*, todo?, modules)>  %% <!ATTLIST overview  %%   root CDATA #IMPLIED>  %% <!ELEMENT title (#PCDATA)>  overview(Title, Tags, Env, Opts) -> -    Env1 = Env#env{package = '', +    Env1 = Env#env{  		   root = ""},      xmerl_lib:expand_element(overview_1(Title, Tags, Env1, Opts)). | 
