File 7451-edoc-Propagate-type-links-from-type-macro.patch of Package erlang
From 8f7aa9cf9989669ff77ff2ac549c0e3bae3530c5 Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Fri, 10 Nov 2023 15:03:19 +0100
Subject: [PATCH 1/4] edoc: Propagate type links from {@type macro}
---
lib/edoc/src/edoc_layout.erl | 11 +++++++----
lib/edoc/src/edoc_refs.erl | 6 +++---
lib/edoc/src/edoc_types.erl | 14 ++++++++++++--
lib/edoc/test/eep48_SUITE.erl | 2 ++
lib/edoc/test/eep48_SUITE_data/eep48_links.erl | 5 +++++
5 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/lib/edoc/src/edoc_layout.erl b/lib/edoc/src/edoc_layout.erl
index f6f11ae5d8..6580ce47d9 100644
--- a/lib/edoc/src/edoc_layout.erl
+++ b/lib/edoc/src/edoc_layout.erl
@@ -660,10 +660,13 @@ href(E) ->
case get_attrval(href, E) of
"" -> [];
URI ->
- T = case get_attrval(target, E) of
- "" -> [];
- S -> [{target, S}]
- end,
+ T = lists:flatmap(
+ fun(K) ->
+ case get_attrval(K, E) of
+ "" -> [];
+ S -> [{K, S}]
+ end
+ end, [target, 'docgen-rel', 'docgen-href']),
[{href, URI} | T]
end.
diff --git a/lib/edoc/src/edoc_refs.erl b/lib/edoc/src/edoc_refs.erl
index f5bf2468a2..f1e26ea660 100644
--- a/lib/edoc/src/edoc_refs.erl
+++ b/lib/edoc/src/edoc_refs.erl
@@ -140,12 +140,12 @@ docgen_uri({module, M}) ->
docgen_uri({module, M, Ref}) ->
[atom_to_list(M), docgen_uri(Ref)];
docgen_uri({function, F, A}) ->
- ["#", atom_to_list(F), "/", integer_to_list(A)];
+ ["#", escape_uri(atom_to_list(F)), "/", integer_to_list(A)];
docgen_uri({type, T}) ->
- ["#", atom_to_list(T), "/0"];
+ ["#", escape_uri(atom_to_list(T)), "/0"];
docgen_uri({type, T, A}) ->
%% This case is not used yet, but since types also have arity it should be in the future.
- ["#", atom_to_list(T), "/", integer_to_list(A)].
+ ["#", escape_uri(atom_to_list(T)), "/", integer_to_list(A)].
get_uri({app, App}, Env) ->
join_uri(app_ref(App, Env), ?INDEX_FILE);
diff --git a/lib/edoc/src/edoc_types.erl b/lib/edoc/src/edoc_types.erl
index 94e8db5749..9bc7b33386 100644
--- a/lib/edoc/src/edoc_types.erl
+++ b/lib/edoc/src/edoc_types.erl
@@ -160,6 +160,10 @@ get_uri(Name, Env) ->
NewName = infer_module_app(Name),
edoc_refs:get_uri(to_ref(NewName), Env).
+get_docgen_uri(Name, _Env) ->
+ NewName = infer_module_app(Name),
+ edoc_refs:get_docgen_link(to_ref(NewName)).
+
infer_module_app(#t_name{app = [], module = M} = TName) when is_atom(M) ->
case edoc_lib:infer_module_app(M) of
no_app ->
@@ -194,9 +198,15 @@ to_xml(#t_type{name = N, args = As}, Env, Opts) ->
HRef = case {Predef, proplists:get_value(link_predefined_types, Opts, false)} of
{true, false} -> [];
{true, true} ->
- [{href, get_uri(N#t_name{ module = erlang }, Env)}];
+ {DocgenRel, DocgenURI} = get_docgen_uri(N#t_name{ module = erlang }, Env),
+ [{'docgen-rel',DocgenRel},
+ {'docgen-href',DocgenURI},
+ {href, get_uri(N#t_name{ module = erlang }, Env)}];
{false, _} ->
- [{href, get_uri(N, Env)}]
+ {DocgenRel, DocgenURI} = get_docgen_uri(N, Env),
+ [{'docgen-rel',DocgenRel},
+ {'docgen-href',DocgenURI},
+ {href, get_uri(N, Env)}]
end,
{abstype, HRef, [to_xml(N, Env, Opts) | map(fun wrap_utype/3, As, Env, Opts)]};
to_xml(#t_fun{args = As, range = T}, Env, Opts) ->
diff --git a/lib/edoc/test/eep48_SUITE.erl b/lib/edoc/test/eep48_SUITE.erl
index 7932634b34..e56e88e93e 100644
--- a/lib/edoc/test/eep48_SUITE.erl
+++ b/lib/edoc/test/eep48_SUITE.erl
@@ -233,6 +233,8 @@ links(Config) ->
get_doc_link({function, local_function_link, 0}, Docs)),
?assertEqual({<<"seetype">>, <<"#t/0">>},
get_doc_link({function, local_type_link, 0}, Docs)),
+ ?assertEqual({<<"seetype">>, <<"#t/0">>},
+ get_doc_link({function, local_type_link_macro, 0}, Docs)),
?assertEqual({<<"seetype">>, <<"eep48_links#t/0">>},
get_doc_link({function, external_type_link, 0}, Docs)).
diff --git a/lib/edoc/test/eep48_SUITE_data/eep48_links.erl b/lib/edoc/test/eep48_SUITE_data/eep48_links.erl
index 0e5c8033db..2345495aed 100644
--- a/lib/edoc/test/eep48_SUITE_data/eep48_links.erl
+++ b/lib/edoc/test/eep48_SUITE_data/eep48_links.erl
@@ -11,6 +11,7 @@
external_function_link/0,
local_function_link/0,
local_type_link/0,
+ local_type_link_macro/0,
external_type_link/0]).
-export([see_module/0,
@@ -57,6 +58,10 @@ local_function_link() -> ok.
%% Should map to `seetype'.
local_type_link() -> ok.
+%% @doc Local type link {@type {type, t()@}}.
+%% Should map to `seetype'.
+local_type_link_macro() -> ok.
+
%% @doc External type link {@link eep48_links:t()}.
%% Should map to `seetype'.
external_type_link() -> ok.
--
2.35.3