From 943a794b9308a3998cbdc89cd1f4a61c67377ba7 Mon Sep 17 00:00:00 2001 From: Wojtek Mach Date: Wed, 6 Dec 2017 18:01:18 +0100 Subject: [PATCH 1/2] Autolink Erlang typespecs --- lib/ex_doc/formatter/html/autolink.ex | 17 +++++++++++++---- test/ex_doc/formatter/html/autolink_test.exs | 11 +++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) 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()] From 22048e30da6f34bb893bddc024fcee563961d9ee Mon Sep 17 00:00:00 2001 From: Wojtek Mach Date: Wed, 6 Dec 2017 19:03:55 +0100 Subject: [PATCH 2/2] Update test --- test/ex_doc/formatter/html/templates_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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]