diff --git a/lib/ex_doc/formatter/html/autolink.ex b/lib/ex_doc/formatter/html/autolink.ex
index c8ba7a1ba..9ac3ab81c 100644
--- a/lib/ex_doc/formatter/html/autolink.ex
+++ b/lib/ex_doc/formatter/html/autolink.ex
@@ -148,7 +148,8 @@ defmodule ExDoc.Formatter.HTML.Autolink do
arity = length(args)
if {name, arity} in typespecs do
n = enc_h("#{name}")
- ~s[#{h(string)}]
+ {string_to_link, string_with_parens} = split_string_to_link(string)
+ ~s[#{h(string_to_link)}#{string_with_parens}]
else
string
end
@@ -157,7 +158,8 @@ defmodule ExDoc.Formatter.HTML.Autolink do
alias = expand_alias(alias)
if source = get_source(alias, aliases, lib_dirs) do
n = enc_h("#{name}")
- ~s[#{h(string)}]
+ {string_to_link, string_with_parens} = split_string_to_link(string)
+ ~s[#{h(string_to_link)}#{string_with_parens}]
else
string
end
@@ -179,6 +181,13 @@ defmodule ExDoc.Formatter.HTML.Autolink do
end
defp strip_parens(string, _), do: string
+ defp split_string_to_link(string) do
+ case :binary.split(string, "(") do
+ [head, tail] -> {head, "(" <> tail}
+ [head] -> {head, ""}
+ end
+ end
+
defp expand_alias({:__aliases__, _, [h|t]}) when is_atom(h), do: Module.concat([h|t])
defp expand_alias(atom) when is_atom(atom), do: atom
defp expand_alias(_), do: nil
diff --git a/test/ex_doc/formatter/html/autolink_test.exs b/test/ex_doc/formatter/html/autolink_test.exs
index 89a8e319a..4ae624f79 100644
--- a/test/ex_doc/formatter/html/autolink_test.exs
+++ b/test/ex_doc/formatter/html/autolink_test.exs
@@ -194,13 +194,13 @@ defmodule ExDoc.Formatter.HTML.AutolinkTest do
test "autolink locals in typespecs" do
assert Autolink.typespec(quote(do: foo(1)), [foo: 1], []) ==
- ~s[foo(1)]
+ ~s[foo(1)]
assert Autolink.typespec(quote(do: bar(foo(1))), [foo: 1], []) ==
- ~s[bar(foo(1))]
+ ~s[bar(foo(1))]
assert Autolink.typespec(quote(do: (bar(foo(1)) when bat: foo(1))), [foo: 1], []) ==
- ~s[bar(foo(1)) when bat: foo(1)]
+ ~s[bar(foo(1)) when bat: foo(1)]
assert Autolink.typespec(quote(do: bar(foo(1))), [], []) ==
~s[bar(foo(1))]
@@ -211,19 +211,19 @@ defmodule ExDoc.Formatter.HTML.AutolinkTest do
~s[foo() :: foo]
assert Autolink.typespec(quote(do: foo(1) :: foo(1)), [foo: 1], [], []) ==
- ~s[foo(1) :: foo(1)]
+ ~s[foo(1) :: foo(1)]
assert Autolink.typespec(quote(do: (foo(1) :: foo(1) when bat: foo(1))), [foo: 1], [], []) ==
- ~s[foo(1) :: foo(1) when bat: foo(1)]
+ ~s[foo(1) :: foo(1) when bat: foo(1)]
assert Autolink.typespec(quote(do: bar(foo(1)) :: foo(1)), [foo: 1], [], []) ==
- ~s[bar(foo(1)) :: foo(1)]
+ ~s[bar(foo(1)) :: foo(1)]
assert Autolink.typespec(quote(do: (bar(foo(1)) :: foo(1) when bat: foo(1))), [foo: 1], [], []) ==
- ~s[bar(foo(1)) :: foo(1) when bat: foo(1)]
+ ~s[bar(foo(1)) :: foo(1) when bat: foo(1)]
assert Autolink.typespec(quote(do: bar(foo :: foo(1)) :: foo(1)), [foo: 1], [], []) ==
- ~s[bar(foo :: foo(1)) :: foo(1)]
+ ~s[bar(foo :: foo(1)) :: foo(1)]
end
test "add new lines on |" do
@@ -252,4 +252,27 @@ defmodule ExDoc.Formatter.HTML.AutolinkTest do
assert Autolink.typespec(quote(do: Foo.t), [], [Foo]) ==
~s[Foo.t]
end
+
+ test "autolink local and remote types inside parameterized types" do
+ assert Autolink.typespec(quote(do: parameterized_t(foo())), [parameterized_t: 1, foo: 0], []) ==
+ ~s[parameterized_t(foo)]
+
+ assert Autolink.typespec(quote(do: Parameterized.t(foo())), [foo: 0], [Parameterized]) ==
+ ~s[Parameterized.t(foo)]
+
+ assert Autolink.typespec(quote(do: parameterized_t(Foo.t())), [parameterized_t: 1], [Foo]) ==
+ ~s[parameterized_t(Foo.t)]
+
+ assert Autolink.typespec(quote(do: Parameterized.t(Foo.t())), [], [Parameterized, Foo]) ==
+ ~s[Parameterized.t(Foo.t)]
+
+ assert Autolink.typespec(quote(do: parameterized_t(foo() | bar())), [parameterized_t: 1, foo: 0, bar: 0], []) ==
+ ~s[parameterized_t(foo | bar)]
+
+ assert Autolink.typespec(quote(do: parameterized_t(parameterized_t(foo()))), [parameterized_t: 1, foo: 0], []) ==
+ ~s[parameterized_t(parameterized_t(foo))]
+
+ assert Autolink.typespec(quote(do: parameterized_t(foo())), [foo: 0], []) ==
+ ~s[parameterized_t(foo)]
+ end
end
diff --git a/test/ex_doc/formatter/html/templates_test.exs b/test/ex_doc/formatter/html/templates_test.exs
index 3296ec57a..a96c40a96 100644
--- a/test/ex_doc/formatter/html/templates_test.exs
+++ b/test/ex_doc/formatter/html/templates_test.exs
@@ -157,7 +157,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]