Skip to content

Commit 6495401

Browse files
fertapricmichalmuskala
authored andcommitted
Format optional macrocallbacks in IEx.Helpers.b/1 (#8529)
Macrocallbacks are internally stored prefixing them with "MACRO-". However, that prefix should be removed when presenting the callback information to the user. Before: ```elixir @optional_callbacks ["MACRO-foo": 3] ``` After: ```elixir @optional_callbacks [foo: 3] ```
1 parent dadb412 commit 6495401

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

lib/iex/lib/iex/introspection.ex

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -565,9 +565,9 @@ defmodule IEx.Introspection do
565565
end
566566
end
567567

568-
defp translate_callback({{name, arity}, specs}) do
569-
case Atom.to_string(name) do
570-
"MACRO-" <> macro_name ->
568+
defp translate_callback({name_arity, specs}) do
569+
case translate_callback_name_arity(name_arity) do
570+
{:macrocallback, _, _} = kind_name_arity ->
571571
# The typespec of a macrocallback differs from the one expressed
572572
# via @macrocallback:
573573
#
@@ -580,10 +580,17 @@ defmodule IEx.Introspection do
580580
{:type, line1, :fun, [{:type, line2, :product, args}, spec]}
581581
end)
582582

583-
{{:macrocallback, String.to_atom(macro_name), arity - 1}, specs}
583+
{kind_name_arity, specs}
584584

585-
_ ->
586-
{{:callback, name, arity}, specs}
585+
kind_name_arity ->
586+
{kind_name_arity, specs}
587+
end
588+
end
589+
590+
defp translate_callback_name_arity({name, arity}) do
591+
case Atom.to_string(name) do
592+
"MACRO-" <> macro_name -> {:macrocallback, String.to_atom(macro_name), arity - 1}
593+
_ -> {:callback, name, arity}
587594
end
588595
end
589596

@@ -599,6 +606,11 @@ defmodule IEx.Introspection do
599606
optional_callbacks =
600607
if Code.ensure_loaded?(mod) and function_exported?(mod, :behaviour_info, 1) do
601608
mod.behaviour_info(:optional_callbacks)
609+
|> Enum.map(fn name_arity ->
610+
{_kind, name, arity} = translate_callback_name_arity(name_arity)
611+
{name, arity}
612+
end)
613+
|> Enum.sort()
602614
else
603615
[]
604616
end

lib/iex/test/iex/helpers_test.exs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -725,18 +725,21 @@ defmodule IEx.HelpersTest do
725725
content = """
726726
defmodule OptionalCallbacks do
727727
@doc "callback"
728-
@callback optional_1(:foo) :: integer
729-
@optional_callbacks optional_1: 1
728+
@callback optional_callback(:foo) :: integer
729+
@macrocallback optional_macrocallback(:bar) :: atom
730+
@optional_callbacks optional_callback: 1, optional_macrocallback: 1
730731
end
731732
"""
732733

733734
with_file(filename, content, fn ->
734735
assert c(filename, ".") == [OptionalCallbacks]
735736

736737
assert capture_io(fn -> b(OptionalCallbacks) end) =~ """
737-
@callback optional_1(:foo) :: integer()
738+
@callback optional_callback(:foo) :: integer()
738739
739-
@optional_callbacks [optional_1: 1]
740+
@macrocallback optional_macrocallback(:bar) :: atom()
741+
742+
@optional_callbacks [optional_callback: 1, optional_macrocallback: 1]
740743
741744
"""
742745
end)

0 commit comments

Comments
 (0)