From 27c1f957d85659b6651a557651d42288c35a0281 Mon Sep 17 00:00:00 2001 From: Fernando Tapia Rico Date: Sat, 15 Dec 2018 11:14:58 +0100 Subject: [PATCH] Format optional macrocallbacks in IEx.Helpers.b/1 Macrocallbacks are internally stored prefixing them with "MACRO-". However, that prefix should be removed when presenting the callback information to the user. --- lib/iex/lib/iex/introspection.ex | 24 ++++++++++++++++++------ lib/iex/test/iex/helpers_test.exs | 11 +++++++---- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/iex/lib/iex/introspection.ex b/lib/iex/lib/iex/introspection.ex index bd5e2f0a8d8..0413916cb9f 100644 --- a/lib/iex/lib/iex/introspection.ex +++ b/lib/iex/lib/iex/introspection.ex @@ -565,9 +565,9 @@ defmodule IEx.Introspection do end end - defp translate_callback({{name, arity}, specs}) do - case Atom.to_string(name) do - "MACRO-" <> macro_name -> + defp translate_callback({name_arity, specs}) do + case translate_callback_name_arity(name_arity) do + {:macrocallback, _, _} = kind_name_arity -> # The typespec of a macrocallback differs from the one expressed # via @macrocallback: # @@ -580,10 +580,17 @@ defmodule IEx.Introspection do {:type, line1, :fun, [{:type, line2, :product, args}, spec]} end) - {{:macrocallback, String.to_atom(macro_name), arity - 1}, specs} + {kind_name_arity, specs} - _ -> - {{:callback, name, arity}, specs} + kind_name_arity -> + {kind_name_arity, specs} + end + end + + defp translate_callback_name_arity({name, arity}) do + case Atom.to_string(name) do + "MACRO-" <> macro_name -> {:macrocallback, String.to_atom(macro_name), arity - 1} + _ -> {:callback, name, arity} end end @@ -599,6 +606,11 @@ defmodule IEx.Introspection do optional_callbacks = if Code.ensure_loaded?(mod) and function_exported?(mod, :behaviour_info, 1) do mod.behaviour_info(:optional_callbacks) + |> Enum.map(fn name_arity -> + {_kind, name, arity} = translate_callback_name_arity(name_arity) + {name, arity} + end) + |> Enum.sort() else [] end diff --git a/lib/iex/test/iex/helpers_test.exs b/lib/iex/test/iex/helpers_test.exs index 07828b49e25..49d470a3384 100644 --- a/lib/iex/test/iex/helpers_test.exs +++ b/lib/iex/test/iex/helpers_test.exs @@ -725,8 +725,9 @@ defmodule IEx.HelpersTest do content = """ defmodule OptionalCallbacks do @doc "callback" - @callback optional_1(:foo) :: integer - @optional_callbacks optional_1: 1 + @callback optional_callback(:foo) :: integer + @macrocallback optional_macrocallback(:bar) :: atom + @optional_callbacks optional_callback: 1, optional_macrocallback: 1 end """ @@ -734,9 +735,11 @@ defmodule IEx.HelpersTest do assert c(filename, ".") == [OptionalCallbacks] assert capture_io(fn -> b(OptionalCallbacks) end) =~ """ - @callback optional_1(:foo) :: integer() + @callback optional_callback(:foo) :: integer() - @optional_callbacks [optional_1: 1] + @macrocallback optional_macrocallback(:bar) :: atom() + + @optional_callbacks [optional_callback: 1, optional_macrocallback: 1] """ end)