From a16c95f4ae00496fa457bb6ea5e373c7b75a971f Mon Sep 17 00:00:00 2001 From: Tomasz Marek Sulima Date: Thu, 18 Aug 2022 16:38:03 +0300 Subject: [PATCH 1/3] fix: remove extra term() argument at start of macrocallback spec related: #755 --- lib/ex_doc/language/elixir.ex | 17 ++++++++++++++--- test/ex_doc/retriever/elixir_test.exs | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/ex_doc/language/elixir.ex b/lib/ex_doc/language/elixir.ex index 7807475ed..0498e823b 100644 --- a/lib/ex_doc/language/elixir.ex +++ b/lib/ex_doc/language/elixir.ex @@ -109,11 +109,14 @@ defmodule ExDoc.Language.Elixir do if actual_def in module_data.private.optional_callbacks, do: ["optional"], else: [] specs = - case Map.fetch(module_data.private.callbacks, actual_def) do - {:ok, specs} -> + case {kind, Map.fetch(module_data.private.callbacks, actual_def)} do + {:macrocallback, {:ok, specs}} -> + Enum.map(specs, &remove_callback_term/1) + + {:callback, {:ok, specs}} -> specs - :error -> + {_kind, :error} -> [] end @@ -136,6 +139,14 @@ defmodule ExDoc.Language.Elixir do } end + defp remove_callback_term({:type, num, :bounded_fun, [lhs, rhs]}) do + {:type, num, :bounded_fun, [remove_callback_term(lhs), rhs]} + end + + defp remove_callback_term({:type, num, :fun, [{:type, num, :product, [_ | rest_args]} | rest]}) do + {:type, num, :fun, [{:type, num, :product, rest_args} | rest]} + end + @impl true def type_data(entry, module_data) do {{_kind, name, arity}, _anno, _signature, _doc, _metadata} = entry diff --git a/test/ex_doc/retriever/elixir_test.exs b/test/ex_doc/retriever/elixir_test.exs index 9f7f16e31..51984dca6 100644 --- a/test/ex_doc/retriever/elixir_test.exs +++ b/test/ex_doc/retriever/elixir_test.exs @@ -160,7 +160,7 @@ defmodule ExDoc.Retriever.ElixirTest do assert macrocallback1.group == :Callbacks assert Path.basename(macrocallback1.source_url) == "nofile:9" refute macrocallback1.doc - assert Macro.to_string(macrocallback1.specs) == "[macrocallback1(term()) :: :ok]" + assert Macro.to_string(macrocallback1.specs) == "[macrocallback1() :: :ok]" elixirc(c, ~S""" defmodule Impl do From d62820d3632eb100f872bd76cfb83ee08788de4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Thu, 18 Aug 2022 15:59:34 +0200 Subject: [PATCH 2/3] Update elixir.ex --- lib/ex_doc/language/elixir.ex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ex_doc/language/elixir.ex b/lib/ex_doc/language/elixir.ex index 0498e823b..5b229eb34 100644 --- a/lib/ex_doc/language/elixir.ex +++ b/lib/ex_doc/language/elixir.ex @@ -109,14 +109,14 @@ defmodule ExDoc.Language.Elixir do if actual_def in module_data.private.optional_callbacks, do: ["optional"], else: [] specs = - case {kind, Map.fetch(module_data.private.callbacks, actual_def)} do - {:macrocallback, {:ok, specs}} -> + case module_data.private.callbacks do + %{^actual_def => specs} when kind == :macro_callback -> Enum.map(specs, &remove_callback_term/1) - {:callback, {:ok, specs}} -> + %{^actual_def => specs} -> specs - {_kind, :error} -> + %{} -> [] end From aabdf7600f248abb272ef0b80e131f61fbb47999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Thu, 18 Aug 2022 16:01:28 +0200 Subject: [PATCH 3/3] Update lib/ex_doc/language/elixir.ex --- lib/ex_doc/language/elixir.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ex_doc/language/elixir.ex b/lib/ex_doc/language/elixir.ex index 5b229eb34..521d23526 100644 --- a/lib/ex_doc/language/elixir.ex +++ b/lib/ex_doc/language/elixir.ex @@ -110,7 +110,7 @@ defmodule ExDoc.Language.Elixir do specs = case module_data.private.callbacks do - %{^actual_def => specs} when kind == :macro_callback -> + %{^actual_def => specs} when kind == :macrocallback -> Enum.map(specs, &remove_callback_term/1) %{^actual_def => specs} ->