diff --git a/lib/ex_doc/formatter/html/autolink.ex b/lib/ex_doc/formatter/html/autolink.ex
index aaa7596a7..9cd11b82f 100644
--- a/lib/ex_doc/formatter/html/autolink.ex
+++ b/lib/ex_doc/formatter/html/autolink.ex
@@ -67,7 +67,7 @@ defmodule ExDoc.Formatter.HTML.Autolink do
"""
def all(modules, extension, extra_lib_dirs) do
aliases = Enum.map modules, &(&1.module)
- lib_dirs = extra_lib_dirs ++ elixir_lib_dirs()
+ lib_dirs = extra_lib_dirs ++ elixir_lib_dirs() ++ erlang_lib_dirs()
modules
|> Enum.map(&Task.async(fn -> process_module(&1, modules, aliases, extension, lib_dirs) end))
|> Enum.map(&Task.await(&1, :infinity))
@@ -141,7 +141,7 @@ defmodule ExDoc.Formatter.HTML.Autolink do
Converts the given `ast` to string while linking the locals
given by `typespecs` as HTML.
"""
- def typespec(ast, typespecs, aliases, lib_dirs \\ elixir_lib_dirs()) do
+ def typespec(ast, typespecs, aliases, lib_dirs \\ elixir_lib_dirs() ++ erlang_lib_dirs()) do
if formatter_available?() do
format_typespec(ast, typespecs, aliases, lib_dirs)
else
@@ -246,8 +246,7 @@ defmodule ExDoc.Formatter.HTML.Autolink do
alias = expand_alias(alias)
if source = get_source(alias, aliases, lib_dirs) do
- n = enc_h("#{name}")
- url = "#{source}#{enc_h(inspect alias)}.html#t:#{n}/#{length(args)}"
+ url = remote_url(source, alias, name, args)
string = format_typespec_form(form, url)
put_placeholder(form, string, placeholders)
else
@@ -263,6 +262,16 @@ defmodule ExDoc.Formatter.HTML.Autolink do
|> replace_placeholders(placeholders)
end
+ defp remote_url(@erlang_docs = source, module, name, _args) do
+ module = enc_h("#{module}")
+ name = enc_h("#{name}")
+ "#{source}#{module}.html#type-#{name}"
+ end
+ defp remote_url(source, alias, name, args) do
+ name = enc_h("#{name}")
+ "#{source}#{enc_h(inspect alias)}.html#t:#{name}/#{length(args)}"
+ end
+
defp format_typespec_form(form, url) do
string = Macro.to_string(form)
{string_to_link, _string_with_parens} = split_string_to_link(string)
diff --git a/test/ex_doc/formatter/html/autolink_test.exs b/test/ex_doc/formatter/html/autolink_test.exs
index 9638a7d57..0dd25c9c4 100644
--- a/test/ex_doc/formatter/html/autolink_test.exs
+++ b/test/ex_doc/formatter/html/autolink_test.exs
@@ -305,6 +305,17 @@ defmodule ExDoc.Formatter.HTML.AutolinkTest do
~s[term()]
end
+ test "autolink Erlang types in typespecs" do
+ assert Autolink.typespec(quote(do: :sets.set()), [], []) ==
+ ~s[:sets.set()]
+
+ assert Autolink.typespec(quote(do: :sets.set(foo())), [], []) ==
+ ~s[:sets.set(foo())]
+
+ assert Autolink.typespec(quote(do: :sets.set(foo())), [foo: 0], []) ==
+ ~s[:sets.set(foo())]
+ end
+
test "autolink shared aliases in typespecs" do
assert Autolink.typespec(quote(do: Foo.t), [], [Foo]) ==
~s[Foo.t()]
diff --git a/test/ex_doc/formatter/html/templates_test.exs b/test/ex_doc/formatter/html/templates_test.exs
index 520fa9802..24c966f66 100644
--- a/test/ex_doc/formatter/html/templates_test.exs
+++ b/test/ex_doc/formatter/html/templates_test.exs
@@ -261,7 +261,7 @@ defmodule ExDoc.Formatter.HTML.TemplatesTest do
~S[TypesAndSpecs.Sub.t(), ] <>
~S[opaque(), :ok | :error}]
- ref_html = ~s[ref() :: {:binary.part(), public(#{any})}]
+ ref_html = ~s[ref() :: {:binary.part(), public(#{any})}]
assert content =~ ~s[public(t)]
refute content =~ ~s[private]