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]