Skip to content

Commit

Permalink
Properly set link in types with parameter (#694)
Browse files Browse the repository at this point in the history
Closes  #657
  • Loading branch information
ymtszw authored and josevalim committed Mar 25, 2017
1 parent 52e3571 commit d294125
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 11 deletions.
13 changes: 11 additions & 2 deletions lib/ex_doc/formatter/html/autolink.ex
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,8 @@ defmodule ExDoc.Formatter.HTML.Autolink do
arity = length(args)
if {name, arity} in typespecs do
n = enc_h("#{name}")
~s[<a href="#t:#{n}/#{arity}">#{h(string)}</a>]
{string_to_link, string_with_parens} = split_string_to_link(string)
~s[<a href="#t:#{n}/#{arity}">#{h(string_to_link)}</a>#{string_with_parens}]
else
string
end
Expand All @@ -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[<a href="#{source}#{enc_h(inspect alias)}.html#t:#{n}/#{length(args)}">#{h(string)}</a>]
{string_to_link, string_with_parens} = split_string_to_link(string)
~s[<a href="#{source}#{enc_h(inspect alias)}.html#t:#{n}/#{length(args)}">#{h(string_to_link)}</a>#{string_with_parens}]
else
string
end
Expand All @@ -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
Expand Down
39 changes: 31 additions & 8 deletions test/ex_doc/formatter/html/autolink_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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[<a href="#t:foo/1">foo(1)</a>]
~s[<a href="#t:foo/1">foo</a>(1)]

assert Autolink.typespec(quote(do: bar(foo(1))), [foo: 1], []) ==
~s[bar(<a href="#t:foo/1">foo(1)</a>)]
~s[bar(<a href="#t:foo/1">foo</a>(1))]

assert Autolink.typespec(quote(do: (bar(foo(1)) when bat: foo(1))), [foo: 1], []) ==
~s[bar(<a href="#t:foo/1">foo(1)</a>) when bat: <a href=\"#t:foo/1\">foo(1)</a>]
~s[bar(<a href="#t:foo/1">foo</a>(1)) when bat: <a href=\"#t:foo/1\">foo</a>(1)]

assert Autolink.typespec(quote(do: bar(foo(1))), [], []) ==
~s[bar(foo(1))]
Expand All @@ -211,19 +211,19 @@ defmodule ExDoc.Formatter.HTML.AutolinkTest do
~s[foo() :: <a href="#t:foo/0">foo</a>]

assert Autolink.typespec(quote(do: foo(1) :: foo(1)), [foo: 1], [], []) ==
~s[foo(1) :: <a href="#t:foo/1">foo(1)</a>]
~s[foo(1) :: <a href="#t:foo/1">foo</a>(1)]

assert Autolink.typespec(quote(do: (foo(1) :: foo(1) when bat: foo(1))), [foo: 1], [], []) ==
~s[foo(1) :: <a href=\"#t:foo/1\">foo(1)</a> when bat: <a href=\"#t:foo/1\">foo(1)</a>]
~s[foo(1) :: <a href=\"#t:foo/1\">foo</a>(1) when bat: <a href=\"#t:foo/1\">foo</a>(1)]

assert Autolink.typespec(quote(do: bar(foo(1)) :: foo(1)), [foo: 1], [], []) ==
~s[bar(<a href=\"#t:foo/1\">foo(1)</a>) :: <a href=\"#t:foo/1\">foo(1)</a>]
~s[bar(<a href=\"#t:foo/1\">foo</a>(1)) :: <a href=\"#t:foo/1\">foo</a>(1)]

assert Autolink.typespec(quote(do: (bar(foo(1)) :: foo(1) when bat: foo(1))), [foo: 1], [], []) ==
~s[bar(<a href=\"#t:foo/1\">foo(1)</a>) :: <a href=\"#t:foo/1\">foo(1)</a> when bat: <a href=\"#t:foo/1\">foo(1)</a>]
~s[bar(<a href=\"#t:foo/1\">foo</a>(1)) :: <a href=\"#t:foo/1\">foo</a>(1) when bat: <a href=\"#t:foo/1\">foo</a>(1)]

assert Autolink.typespec(quote(do: bar(foo :: foo(1)) :: foo(1)), [foo: 1], [], []) ==
~s[bar(foo :: <a href=\"#t:foo/1\">foo(1)</a>) :: <a href=\"#t:foo/1\">foo(1)</a>]
~s[bar(foo :: <a href=\"#t:foo/1\">foo</a>(1)) :: <a href=\"#t:foo/1\">foo</a>(1)]
end

test "add new lines on |" do
Expand Down Expand Up @@ -252,4 +252,27 @@ defmodule ExDoc.Formatter.HTML.AutolinkTest do
assert Autolink.typespec(quote(do: Foo.t), [], [Foo]) ==
~s[<a href="Foo.html#t:t/0">Foo.t</a>]
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[<a href="#t:parameterized_t/1">parameterized_t</a>(<a href="#t:foo/0">foo</a>)]

assert Autolink.typespec(quote(do: Parameterized.t(foo())), [foo: 0], [Parameterized]) ==
~s[<a href="Parameterized.html#t:t/1">Parameterized.t</a>(<a href="#t:foo/0">foo</a>)]

assert Autolink.typespec(quote(do: parameterized_t(Foo.t())), [parameterized_t: 1], [Foo]) ==
~s[<a href="#t:parameterized_t/1">parameterized_t</a>(<a href="Foo.html#t:t/0">Foo.t</a>)]

assert Autolink.typespec(quote(do: Parameterized.t(Foo.t())), [], [Parameterized, Foo]) ==
~s[<a href="Parameterized.html#t:t/1">Parameterized.t</a>(<a href="Foo.html#t:t/0">Foo.t</a>)]

assert Autolink.typespec(quote(do: parameterized_t(foo() | bar())), [parameterized_t: 1, foo: 0, bar: 0], []) ==
~s[<a href="#t:parameterized_t/1">parameterized_t</a>(<a href="#t:foo/0">foo</a> | <a href="#t:bar/0">bar</a>)]

assert Autolink.typespec(quote(do: parameterized_t(parameterized_t(foo()))), [parameterized_t: 1, foo: 0], []) ==
~s[<a href="#t:parameterized_t/1">parameterized_t</a>(<a href="#t:parameterized_t/1">parameterized_t</a>(<a href="#t:foo/0">foo</a>))]

assert Autolink.typespec(quote(do: parameterized_t(foo())), [foo: 0], []) ==
~s[parameterized_t(<a href="#t:foo/0">foo</a>)]
end
end
2 changes: 1 addition & 1 deletion test/ex_doc/formatter/html/templates_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ defmodule ExDoc.Formatter.HTML.TemplatesTest do
~S[<a href="TypesAndSpecs.Sub.html#t:t/0">TypesAndSpecs.Sub.t</a>, ] <>
~S[<a href="#t:opaque/0">opaque</a>, :ok | :error}]

ref_html = ~S[ref() :: {:binary.part, <a href="#t:public/1">public(any)</a>}]
ref_html = ~S[ref() :: {:binary.part, <a href="#t:public/1">public</a>(any)}]

assert content =~ ~s[<a href="#t:public/1">public(t)</a>]
refute content =~ ~s[<a href="#t:private/0">private</a>]
Expand Down

0 comments on commit d294125

Please sign in to comment.