Skip to content

Commit 9e56691

Browse files
author
José Valim
committed
Ensure aliases from macros are properly expanded, closes #1123
1 parent 3cd6e54 commit 9e56691

File tree

4 files changed

+23
-7
lines changed

4 files changed

+23
-7
lines changed

lib/elixir/lib/macro.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ defmodule Macro do
444444
end
445445

446446
defp expand({ :__aliases__, _, _ } = original, env, cache) do
447-
case :elixir_aliases.expand(original, env.aliases, []) do
447+
case :elixir_aliases.expand(original, env.aliases, env.macro_aliases) do
448448
atom when is_atom(atom) -> atom
449449
aliases ->
450450
aliases = lc alias inlist aliases, do: expand(alias, env, cache)

lib/elixir/lib/macro/env.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ defmodule Macro.Env do
2020
* `functions` - a list of functions imported from each module
2121
* `macros` - a list of macros imported from each module
2222
* `context_modules` - a list of modules defined in the current context
23+
* `macro_aliases` - a list of aliases defined inside the current macro
2324
"""
2425

2526
@type name_arity :: { atom, non_neg_integer }
@@ -33,11 +34,12 @@ defmodule Macro.Env do
3334
@type context_modules :: [module]
3435

3536
fields = [:module, :file, :line, :function, :aliases, :context, :requires,
36-
:functions, :macros, :context_modules]
37+
:functions, :macros, :context_modules, :macro_aliases]
3738

3839
types = quote do: [module: module, file: file, line: line,
3940
function: name_arity, aliases: aliases, requires: requires,
40-
functions: functions, macros: macros, context_modules: context_modules]
41+
functions: functions, macros: macros, context_modules: context_modules,
42+
macro_aliases: aliases]
4143

4244
Record.deffunctions(fields, __MODULE__)
4345
Record.deftypes(fields, types, __MODULE__)

lib/elixir/src/elixir_scope.erl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,18 +76,18 @@ build_ex_var(Line, Key, Name, S) when is_integer(Line) ->
7676
% Handle Macro.Env conversion
7777

7878
to_erl_env({ 'Elixir.Macro.Env', Module, File, _Line, Function, Aliases, Context,
79-
Requires, Functions, Macros, FileModules }) ->
79+
Requires, Functions, Macros, ContextModules, MacroAliases }) ->
8080
#elixir_scope{module=Module,file=File,
8181
function=Function,aliases=Aliases,context=Context,
8282
requires=Requires,macros=Macros,functions=Functions,
83-
context_modules=FileModules}.
83+
context_modules=ContextModules,macro_aliases=MacroAliases}.
8484

8585
to_ex_env({ Line, #elixir_scope{module=Module,file=File,
8686
function=Function,aliases=Aliases,context=Context,
8787
requires=Requires,macros=Macros,functions=Functions,
88-
context_modules=FileModules} }) when is_integer(Line) ->
88+
context_modules=ContextModules,macro_aliases=MacroAliases} }) when is_integer(Line) ->
8989
{ 'Elixir.Macro.Env', Module, File, Line, Function, Aliases,
90-
Context, Requires, Functions, Macros, FileModules }.
90+
Context, Requires, Functions, Macros, ContextModules, MacroAliases }.
9191

9292
% Provides a tuple with only the scope information we want to serialize.
9393

lib/elixir/test/elixir/record_test.exs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@ end
5252
defmodule RecordTest.Macros do
5353
defrecordp :_user, name: "José", age: 25
5454

55+
defmacro gen do
56+
quote do
57+
alias RecordTest.Macros.Nested
58+
59+
def this_works, do: RecordTest.Macros.Nested[]
60+
def this_should_too, do: Nested[]
61+
end
62+
end
63+
5564
defrecord Nested do
5665
def nested_record_alias?(Nested[]) do
5766
true
@@ -96,6 +105,11 @@ end
96105
defmodule RecordTest do
97106
use ExUnit.Case, async: true
98107

108+
# Check the access from the generated macro works
109+
# as expected. If it compiles, we are good to go.
110+
require RecordTest.Macros
111+
RecordTest.Macros.gen
112+
99113
test :record_access_with_nil_keyword do
100114
record = RecordTest.DynamicName.new(a: nil)
101115
record_access = RecordTest.DynamicName[a: nil]

0 commit comments

Comments
 (0)