summaryrefslogtreecommitdiff
path: root/lib/erl_docgen
diff options
context:
space:
mode:
authorLukas Larsson <lukas@erlang.org>2020-03-11 12:30:19 +0100
committerLukas Larsson <lukas@erlang.org>2020-03-27 11:02:23 +0100
commit398e668961c1c52d752131f2f37230eb567f17f6 (patch)
tree1e411aecf946bb43e98fdca2169949026bf2e708 /lib/erl_docgen
parent0799c2b0e9ae5fce18d092a153fff884d1dd3912 (diff)
downloaderlang-398e668961c1c52d752131f2f37230eb567f17f6.tar.gz
docgen: Generate correct see tags for edoc and specs
Diffstat (limited to 'lib/erl_docgen')
-rw-r--r--lib/erl_docgen/priv/dtd/common.dtd32
-rw-r--r--lib/erl_docgen/priv/dtd/common.refs.dtd6
-rw-r--r--lib/erl_docgen/priv/dtd/erlref.dtd2
-rw-r--r--lib/erl_docgen/src/docgen_edoc_xml_cb.erl21
-rw-r--r--lib/erl_docgen/src/docgen_otp_specs.erl8
-rw-r--r--lib/erl_docgen/src/docgen_xmerl_xml_cb.erl15
6 files changed, 65 insertions, 19 deletions
diff --git a/lib/erl_docgen/priv/dtd/common.dtd b/lib/erl_docgen/priv/dtd/common.dtd
index ca680c15b6..d4d5d989a5 100644
--- a/lib/erl_docgen/priv/dtd/common.dtd
+++ b/lib/erl_docgen/priv/dtd/common.dtd
@@ -22,13 +22,15 @@
<!ENTITY % common.entities SYSTEM "common.entities.dtd" >
%common.entities;
+<!ENTITY % refs "seemfa|seeerl|seetype|seeapp|seecom|seecref|seefile|seeguide|url" >
+
<!ENTITY % block "p|pre|code|list|taglist|codeinclude" >
-<!ENTITY % inline "#PCDATA|c|i|em|strong|term|br|seealso|
- url|marker|anno|image" >
+<!ENTITY % inline "#PCDATA|c|i|em|strong|term|br|%refs;|
+ marker|anno|image" >
<!-- XXX -->
<!ELEMENT p (%inline;)* >
-<!ELEMENT pre (#PCDATA|seealso|url|input|anno)* >
-<!ELEMENT input (#PCDATA|seealso|url|anno)* >
+<!ELEMENT pre (#PCDATA|%refs;|input|anno)* >
+<!ELEMENT input (#PCDATA|%refs;|anno)* >
<!ELEMENT code (#PCDATA|anno)* >
<!ATTLIST code type (erl|c|none) "none" >
<!ELEMENT quote (p)* >
@@ -50,13 +52,29 @@
<!ELEMENT list (item+) >
<!ATTLIST list type (ordered|bulleted) "bulleted" >
<!ELEMENT taglist (marker*,tag,item+)+ >
-<!ELEMENT tag (#PCDATA|c|i|em|br|seealso|url|marker|anno)* >
+<!ELEMENT tag (#PCDATA|c|i|em|br|%refs;|marker|anno)* >
<!ELEMENT item (%inline;|%block;|warning|note|dont|do|quote|table)* >
<!-- References -->
-<!ELEMENT seealso (#PCDATA|c|i|em|anno)* >
-<!ATTLIST seealso marker CDATA #REQUIRED >
+<!ENTITY % refinline "#PCDATA|c|i|em|anno" >
+
+<!ELEMENT seemfa (%refinline;)* >
+<!ATTLIST seemfa marker CDATA #REQUIRED >
+<!ELEMENT seeerl (%refinline;)* >
+<!ATTLIST seeerl marker CDATA #REQUIRED >
+<!ELEMENT seetype (%refinline;)* >
+<!ATTLIST seetype marker CDATA #REQUIRED >
+<!ELEMENT seeapp (%refinline;)* >
+<!ATTLIST seeapp marker CDATA "" >
+<!ELEMENT seecom (%refinline;)* >
+<!ATTLIST seecom marker CDATA #REQUIRED >
+<!ELEMENT seecref (%refinline;)* >
+<!ATTLIST seecref marker CDATA #REQUIRED >
+<!ELEMENT seefile (%refinline;)* >
+<!ATTLIST seefile marker CDATA #REQUIRED >
+<!ELEMENT seeguide (%refinline;)* >
+<!ATTLIST seeguide marker CDATA "" >
<!ELEMENT url (#PCDATA) >
<!ATTLIST url href CDATA #REQUIRED >
<!ELEMENT marker EMPTY >
diff --git a/lib/erl_docgen/priv/dtd/common.refs.dtd b/lib/erl_docgen/priv/dtd/common.refs.dtd
index 07c876a17f..9a60d52682 100644
--- a/lib/erl_docgen/priv/dtd/common.refs.dtd
+++ b/lib/erl_docgen/priv/dtd/common.refs.dtd
@@ -36,8 +36,8 @@
<!ATTLIST type variable CDATA #IMPLIED
name CDATA #IMPLIED
name_i CDATA #IMPLIED>
-<!ELEMENT v (#PCDATA|seealso)* >
-<!ELEMENT d (#PCDATA|seealso|c|i|em)* >
+<!ELEMENT v (#PCDATA|%refs;)* >
+<!ELEMENT d (#PCDATA|%refs;|c|i|em)* >
<!ELEMENT desc (%block;|quote|br|marker|warning|note|dont|do)* >
<!ELEMENT authors (aname,email)+ >
<!ELEMENT aname (#PCDATA) >
@@ -49,6 +49,6 @@
<!ELEMENT datatype_title (#PCDATA) >
<!ELEMENT datatype (name+,desc?) >
<!ATTLIST datatype ghlink CDATA #IMPLIED>
-<!ELEMENT type_desc (#PCDATA|anno|c|seealso)* >
+<!ELEMENT type_desc (#PCDATA|anno|c|%refs;)* >
<!ATTLIST type_desc variable CDATA #IMPLIED
name CDATA #IMPLIED>
diff --git a/lib/erl_docgen/priv/dtd/erlref.dtd b/lib/erl_docgen/priv/dtd/erlref.dtd
index 8202ea5a4d..960a00025d 100644
--- a/lib/erl_docgen/priv/dtd/erlref.dtd
+++ b/lib/erl_docgen/priv/dtd/erlref.dtd
@@ -30,7 +30,7 @@
<!-- `name' is used in common.refs.dtd and must therefore
be defined in each *ref. dtd -->
-<!ELEMENT name (#PCDATA|seealso)* >
+<!ELEMENT name (#PCDATA|%refs;)* >
<!ATTLIST name name CDATA #IMPLIED
arity CDATA #IMPLIED
clause_i CDATA #IMPLIED
diff --git a/lib/erl_docgen/src/docgen_edoc_xml_cb.erl b/lib/erl_docgen/src/docgen_edoc_xml_cb.erl
index 19743cf221..06781f4b32 100644
--- a/lib/erl_docgen/src/docgen_edoc_xml_cb.erl
+++ b/lib/erl_docgen/src/docgen_edoc_xml_cb.erl
@@ -951,7 +951,7 @@ seealso_function(Es) ->
see(#xmlElement{content=Es0} = E) ->
Href0 = get_attrval(href, E),
{Href, Es} = otp_xmlify_a_href(Href0, Es0),
- [{seealso, [{marker, Href}], Es}].
+ [makesee(Href, Es)].
equiv(Es) ->
case get_content(equiv, Es) of
@@ -970,13 +970,28 @@ equiv(Es) ->
{c,Expr1};
Ref0 ->
{Ref, _Es2} = otp_xmlify_a_href(Ref0, [E]),
- {seealso, [{marker, Ref}], Expr1}
+ makesee(Ref, Expr1)
end
end,
[{p, ["Equivalent to ", Expr2, "."]}, ?NL]
end
end.
+makesee(Ref, Es) ->
+ case split(Ref,"#") of
+ [Mod,"type-"++Anchor] ->
+ {seetype,[{marker,Mod ++ "#" ++ Anchor}], Es};
+ ["type-"++Anchor] ->
+ {seetype,[{marker,"#" ++ Anchor}], Es};
+ _Else ->
+ case split(Ref,"/") of
+ [_] ->
+ {seeerl, [{marker,Ref}], Es};
+ [_,_] ->
+ {seemfa, [{marker,Ref}], Es}
+ end
+ end.
+
authors(Es) ->
case get_elem(author, Es) of
[] ->
@@ -1123,7 +1138,7 @@ see_type(E, Es0) ->
%% Fails for parametrized types:
Text = #xmlText{value = lists:append(Es0)},
{Href, Es} = otp_xmlify_a_href(Href0, [Text]),
- [{seealso, [{marker, Href}], Es}]
+ [makesee(Href, Es)]
catch
_:_ ->
Es0
diff --git a/lib/erl_docgen/src/docgen_otp_specs.erl b/lib/erl_docgen/src/docgen_otp_specs.erl
index 311ec1471a..7a81056aae 100644
--- a/lib/erl_docgen/src/docgen_otp_specs.erl
+++ b/lib/erl_docgen/src/docgen_otp_specs.erl
@@ -252,10 +252,10 @@ diaf(L, St, " "++O, R, Opts) ->
diaf(L, St, "\n"++O, R, Opts) ->
Ss = lists:takewhile(fun(C) -> C =:= $\s end, O),
diaf(L, St, lists:nthtail(length(Ss), O), ["\n"++Ss | R], Opts);
-diaf([{seealso, HRef0, S0} | L], St, O0, R, Opts) ->
+diaf([{seetype, HRef0, S0} | L], St, O0, R, Opts) ->
{S, O} = diaf(S0, app_fix(O0), Opts),
HRef = fix_mod_ref(HRef0, Opts),
- diaf(L, St, O, [{seealso, HRef, S} | R], Opts);
+ diaf(L, St, O, [{seetype, HRef, S} | R], Opts);
diaf("="++L, St, "::"++O, R, Opts) ->
%% EDoc uses "=" for record field types; Dialyzer uses "::". Maybe
%% there should be an option for this, possibly affecting other
@@ -329,8 +329,8 @@ fix_mod_ref([{marker, S}]=HRef0, #opts{file_suffix = FS}) ->
see(E, Es) ->
case href(E) of
[] -> Es;
- Ref ->
- [{seealso, Ref, Es}]
+ [{marker,Ref}] ->
+ [{seetype, [{marker,lists:flatten(string:replace(Ref,"#type-","#"))}], Es}]
end.
href(E) ->
diff --git a/lib/erl_docgen/src/docgen_xmerl_xml_cb.erl b/lib/erl_docgen/src/docgen_xmerl_xml_cb.erl
index 9d69143c3c..01b6ececcb 100644
--- a/lib/erl_docgen/src/docgen_xmerl_xml_cb.erl
+++ b/lib/erl_docgen/src/docgen_xmerl_xml_cb.erl
@@ -65,7 +65,7 @@ convert_tag(a, [Attr]) ->
true ->
{url, [Attr]};
false ->
- {seealso, [Attr#xmlAttribute{name=marker}]}
+ makesee(Val)
end;
name ->
{marker, [Attr#xmlAttribute{name=id}]}
@@ -94,3 +94,16 @@ is_url(FileRef) ->
"" -> false; % no extension = xml file
_Ext -> true % extension
end.
+
+makesee(Ref) ->
+ case string:split(Ref,"#") of
+ [Mod,"type-"++Anchor] ->
+ {seetype,[#xmlAttribute{name = marker, value = Mod ++ "#" ++ Anchor}]};
+ _Else ->
+ case string:split(Ref,"/") of
+ [_] ->
+ {seeerl, [#xmlAttribute{name = marker, value = Ref}]};
+ [_,_] ->
+ {seemfa, [#xmlAttribute{name = marker, value = Ref}]}
+ end
+ end.