Skip to content

Commit 24c03d0

Browse files
committed
Handle OTP links when generating OTP docs
1 parent 6a0276d commit 24c03d0

File tree

4 files changed

+39
-12
lines changed

4 files changed

+39
-12
lines changed

lib/ex_doc/autolink.ex

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,17 @@ defmodule ExDoc.Autolink do
7979
end
8080

8181
@doc false
82-
def tool(module) do
82+
def tool(module, config) do
8383
if match?("Elixir." <> _, Atom.to_string(module)) do
8484
:ex_doc
8585
else
86-
case app_info(module) do
87-
{true, _} -> :otp
88-
{false, _} -> :ex_doc
86+
{otp, app} = app_info(module)
87+
apps = Enum.uniq(config.apps ++ Keyword.keys(config.deps))
88+
89+
if otp == true and app not in apps do
90+
:otp
91+
else
92+
:ex_doc
8993
end
9094
end
9195
end

lib/ex_doc/language/elixir.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ defmodule ExDoc.Language.Elixir do
763763

764764
case {mode, Refs.get_visibility(ref)} do
765765
{_link_type, :public} ->
766-
Autolink.app_module_url(Autolink.tool(module), module, config)
766+
Autolink.app_module_url(Autolink.tool(module, config), module, config)
767767

768768
{:regular_link, :undefined} ->
769769
nil
@@ -798,7 +798,7 @@ defmodule ExDoc.Language.Elixir do
798798

799799
case {kind, visibility} do
800800
{_kind, :public} ->
801-
fragment(Autolink.tool(module), kind, name, arity)
801+
fragment(Autolink.tool(module, config), kind, name, arity)
802802

803803
{:function, _visibility} ->
804804
try_autoimported_function(name, arity, mode, config, original_text)
@@ -829,7 +829,7 @@ defmodule ExDoc.Language.Elixir do
829829

830830
case {mode, Refs.get_visibility({:module, module}), Refs.get_visibility(ref)} do
831831
{_mode, _module_visibility, :public} ->
832-
case Autolink.tool(module) do
832+
case Autolink.tool(module, config) do
833833
:no_tool ->
834834
nil
835835

lib/ex_doc/language/erlang.ex

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ defmodule ExDoc.Language.Erlang do
353353
end
354354

355355
defp final_url({:module, module}, config) do
356-
tool = Autolink.tool(module)
356+
tool = Autolink.tool(module, config)
357357
Autolink.app_module_url(tool, module, config)
358358
end
359359

@@ -362,9 +362,11 @@ defmodule ExDoc.Language.Erlang do
362362
end
363363

364364
defp final_url({kind, module, name, arity}, config) do
365-
tool = Autolink.tool(module)
365+
tool = Autolink.tool(module, config)
366366
module_url = Autolink.app_module_url(tool, module, config)
367-
module_url && module_url <> fragment(tool, kind, name, arity)
367+
# TODO: fix me
368+
module_url = String.trim_trailing(module_url, "#content")
369+
module_url <> fragment(tool, kind, name, arity)
368370
end
369371

370372
defp fragment(:otp, :function, name, arity) do
@@ -379,11 +381,15 @@ defmodule ExDoc.Language.Erlang do
379381
"#type-#{name}"
380382
end
381383

382-
defp fragment(_, :function, name, arity) do
384+
defp fragment(:ex_doc, :function, name, arity) do
383385
"##{name}/#{arity}"
384386
end
385387

386-
defp fragment(_, :type, name, arity) do
388+
defp fragment(:ex_doc, :callback, name, arity) do
389+
"#c:#{name}/#{arity}"
390+
end
391+
392+
defp fragment(:ex_doc, :type, name, arity) do
387393
"#t:#{name}/#{arity}"
388394
end
389395

test/ex_doc/language/erlang_test.exs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ defmodule ExDoc.Language.ErlangTest do
2222
~s|<a href="https://erlang.org/doc/man/array.html"><code>array</code></a>|
2323
end
2424

25+
test "OTP module when generating OTP docs", c do
26+
assert autolink_doc("{@link array}", [deps: [stdlib: "https://example.com/stdlib"]], c) ==
27+
~s|<a href="https://example.com/stdlib/array.html"><code>array</code></a>|
28+
end
29+
2530
test "app module", c do
2631
assert autolink_doc("{@link //stdlib/array}", c) ==
2732
~s|<a href="https://erlang.org/doc/man/array.html"><code>array</code></a>|
@@ -73,6 +78,16 @@ defmodule ExDoc.Language.ErlangTest do
7378
~s|<a href="https://erlang.org/doc/man/array.html#new-0"><code>array:new/0</code></a>|
7479
end
7580

81+
test "OTP function when generating OTP docs", c do
82+
assert autolink_doc("{@link array:new/0}", [apps: [:stdlib]], c) ==
83+
~s|<a href="array.html#new/0"><code>array:new/0</code></a>|
84+
end
85+
86+
test "OTP function when generating OTP docs, same module", c do
87+
assert autolink_doc("{@link array:new/0}", [current_module: :array, apps: [:stdlib]], c) ==
88+
~s|<a href="array.html#new/0"><code>array:new/0</code></a>|
89+
end
90+
7691
test "ERTS function", c do
7792
assert autolink_doc("{@link zlib:gunzip/1}", c) ==
7893
~s|<a href="https://erlang.org/doc/man/zlib.html#gunzip-1"><code>zlib:gunzip/1</code></a>|
@@ -83,6 +98,8 @@ defmodule ExDoc.Language.ErlangTest do
8398
~s|<a href="https://erlang.org/doc/man/array.html#new-0"><code>array:new/0</code></a>|
8499
end
85100

101+
# TODO: test callbacks. No support in EDoc, use :docgen_xml_to_chunks.
102+
86103
test "external function", c do
87104
assert autolink_doc("{@link 'Elixir.EarmarkParser':as_ast/2}", c) ==
88105
~s|<a href="https://hexdocs.pm/earmark_parser/EarmarkParser.html#as_ast/2"><code>'Elixir.EarmarkParser':as_ast/2</code></a>|

0 commit comments

Comments
 (0)