Skip to content

Commit ea8eff3

Browse files
author
José Valim
committed
Do not silently prune defmacrop
1 parent 879d67e commit ea8eff3

File tree

2 files changed

+45
-33
lines changed

2 files changed

+45
-33
lines changed

lib/elixir/src/elixir_erl.erl

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -159,33 +159,57 @@ compile(#{module := Module} = Map) ->
159159
end,
160160
load_form(Map, Data, Prefix, Forms, Specs).
161161

162-
% Definitions
162+
dynamic_form(#{module := Module, line := Line, file := File, attributes := Attributes,
163+
definitions := Definitions, unreachable := Unreachable}) ->
164+
{Def, Defmacro, Macros, Exports, Functions} =
165+
split_definition(Definitions, File, Unreachable, [], [], [], [], {[], []}),
166+
167+
Location = {elixir_utils:characters_to_list(elixir_utils:relative_to_cwd(File)), Line},
168+
Prefix = [{attribute, Line, file, Location},
169+
{attribute, Line, module, Module},
170+
{attribute, Line, compile, no_auto_import}],
163171

164-
split_definition([{Tuple, def, Meta, Clauses} | T], File, Unreachable,
165-
Def, Defmacro, Exports, Functions) ->
166-
{_, _, N, A, _} = Function = translate_definition(def, Meta, File, Tuple, Clauses),
167-
split_definition(T, File, Unreachable, [Tuple | Def], Defmacro, [{N, A} | Exports],
168-
add_definition(Meta, Function, Functions));
172+
Forms0 = functions_form(Line, Module, Def, Defmacro, Exports, Functions),
173+
Forms1 = attributes_form(Line, Attributes, Forms0),
174+
{Prefix, Forms1, Macros, Unreachable}.
169175

170-
split_definition([{Tuple, defmacro, Meta, Clauses} | T], File, Unreachable,
171-
Def, Defmacro, Exports, Functions) ->
172-
{_, _, N, A, _} = Function = translate_definition(defmacro, Meta, File, Tuple, Clauses),
173-
split_definition(T, File, Unreachable, Def, [Tuple | Defmacro], [{N, A} | Exports],
174-
add_definition(Meta, Function, Functions));
176+
% Definitions
175177

176178
split_definition([{Tuple, Kind, Meta, Clauses} | T], File, Unreachable,
177-
Def, Defmacro, Exports, Functions) ->
178-
Function = translate_definition(Kind, Meta, File, Tuple, Clauses),
179+
Def, Defmacro, Macros, Exports, Functions) ->
179180
case lists:member(Tuple, Unreachable) of
180181
false ->
181-
split_definition(T, File, Unreachable, Def, Defmacro, Exports,
182-
add_definition(Meta, Function, Functions));
182+
split_definition(Tuple, Kind, Meta, Clauses, T, File, Unreachable,
183+
Def, Defmacro, Macros, Exports, Functions);
183184
true ->
184-
split_definition(T, File, Unreachable, Def, Defmacro, Exports, Functions)
185+
split_definition(T, File, Unreachable, Def, Defmacro, Macros, Exports, Functions)
185186
end;
186-
187-
split_definition([], _File, _Unreachable, Def, Defmacro, Exports, {Head, Tail}) ->
188-
{Def, Defmacro, Exports, Head ++ Tail}.
187+
split_definition([], _File, _Unreachable, Def, Defmacro, Macros, Exports, {Head, Tail}) ->
188+
{Def, Defmacro, Macros, Exports, Head ++ Tail}.
189+
190+
split_definition(Tuple, def, Meta, Clauses, T, File, Unreachable,
191+
Def, Defmacro, Macros, Exports, Functions) ->
192+
{_, _, N, A, _} = Entry = translate_definition(def, Meta, File, Tuple, Clauses),
193+
split_definition(T, File, Unreachable, [Tuple | Def], Defmacro, Macros, [{N, A} | Exports],
194+
add_definition(Meta, Entry, Functions));
195+
196+
split_definition(Tuple, defp, Meta, Clauses, T, File, Unreachable,
197+
Def, Defmacro, Macros, Exports, Functions) ->
198+
Entry = translate_definition(defp, Meta, File, Tuple, Clauses),
199+
split_definition(T, File, Unreachable, Def, Defmacro, Macros, Exports,
200+
add_definition(Meta, Entry, Functions));
201+
202+
split_definition(Tuple, defmacro, Meta, Clauses, T, File, Unreachable,
203+
Def, Defmacro, Macros, Exports, Functions) ->
204+
{_, _, N, A, _} = Entry = translate_definition(defmacro, Meta, File, Tuple, Clauses),
205+
split_definition(T, File, Unreachable, Def, [Tuple | Defmacro], [Tuple | Macros], [{N, A} | Exports],
206+
add_definition(Meta, Entry, Functions));
207+
208+
split_definition(Tuple, defmacrop, Meta, Clauses, T, File, Unreachable,
209+
Def, Defmacro, Macros, Exports, Functions) ->
210+
Entry = translate_definition(defmacro, Meta, File, Tuple, Clauses),
211+
split_definition(T, File, Unreachable, Def, Defmacro, [Tuple | Macros], Exports,
212+
add_definition(Meta, Entry, Functions)).
189213

190214
add_definition(Meta, Body, {Head, Tail}) ->
191215
case lists:keyfind(location, 1, Meta) of
@@ -241,20 +265,6 @@ is_macro(_) -> false.
241265

242266
% Functions
243267

244-
dynamic_form(#{module := Module, line := Line, file := File, attributes := Attributes,
245-
definitions := Definitions, unreachable := Unreachable}) ->
246-
{Def, Defmacro, Exports, Functions} =
247-
split_definition(Definitions, File, Unreachable, [], [], [], {[], []}),
248-
249-
Location = {elixir_utils:characters_to_list(elixir_utils:relative_to_cwd(File)), Line},
250-
Prefix = [{attribute, Line, file, Location},
251-
{attribute, Line, module, Module},
252-
{attribute, Line, compile, no_auto_import}],
253-
254-
Forms0 = functions_form(Line, Module, Def, Defmacro, Exports, Functions),
255-
Forms1 = attributes_form(Line, Attributes, Forms0),
256-
{Prefix, Forms1, Defmacro, Unreachable}.
257-
258268
functions_form(Line, Module, Def, Defmacro, Exports, Body) ->
259269
{Spec, Info} = add_info_function(Line, Module, Def, Defmacro),
260270
[{attribute, Line, export, lists:sort([{'__info__', 1} | Exports])}, Spec, Info | Body].

lib/elixir/test/elixir/kernel/macros_test.exs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ defmodule Kernel.MacrosTest do
1515

1616
Kernel.MacrosTest.Nested = require Kernel.MacrosTest.Nested, as: Nested
1717

18+
@spec my_macro :: Macro.t
1819
defmacro my_macro do
1920
quote do: 1 + 1
2021
end
2122

23+
@spec my_private_macro :: Macro.t
2224
defmacrop my_private_macro do
2325
quote do: 1 + 3
2426
end

0 commit comments

Comments
 (0)