Skip to content

Commit baf5fcf

Browse files
author
José Valim
committed
Ensure nested modules are properly defined, closes #1057
1 parent e18c160 commit baf5fcf

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

lib/elixir/src/elixir_macros.erl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,17 +325,24 @@ rewrite_case_clauses([{do,[{in,_,[{'_',_,_},[false,nil]]}],False},{do,[{'_',_,_}
325325
rewrite_case_clauses(Clauses) ->
326326
Clauses.
327327

328+
%% defmodule :foo
328329
expand_module(Raw, Module, #elixir_scope{module=Nesting}) when is_atom(Raw); Nesting == nil ->
329330
Module;
330331

331-
expand_module({ '__aliases__', _, List } = Alias, Module, S) when List /= ['Elixir'] ->
332+
%% defmodule Hello
333+
expand_module({ '__aliases__', _, [H] }, _Module, S) ->
334+
elixir_aliases:concat([S#elixir_scope.module, H]);
335+
336+
%% defmodule Hello.World
337+
expand_module({ '__aliases__', _, _ } = Alias, Module, S) ->
332338
case elixir_aliases:expand(Alias, S#elixir_scope.aliases, S#elixir_scope.macro_aliases) of
333339
Atom when is_atom(Atom) ->
334340
Module;
335341
Aliases when is_list(Aliases) ->
336342
elixir_aliases:concat([S#elixir_scope.module, Module])
337343
end;
338344

345+
%% defmodule Elixir.Hello.World
339346
expand_module(_Raw, Module, S) ->
340347
elixir_aliases:concat([S#elixir_scope.module, Module]).
341348

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Code.require_file "../test_helper.exs", __DIR__
2+
3+
# If it compiles, we are good.
4+
defmodule Kernel.NestedModuleTest do
5+
defrecord State, a: nil
6+
7+
defmodule B do
8+
defrecord State, b: nil
9+
def get(State[b: b]), do: b
10+
end
11+
12+
def get(State[a: a]), do: a
13+
end

lib/elixir/test/elixir/record_test.exs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ Code.require_file "test_helper.exs", __DIR__
33
defrecord RecordTest.FileInfo,
44
Record.extract(:file_info, from_lib: "kernel/include/file.hrl")
55

6+
defrecord RecordTest.SomeRecord, a: 0, b: 1
7+
defrecord RecordTest.WithNoField, []
8+
9+
## Record import
10+
611
defmodule RecordTest.FileInfo.Helper do
712
Record.import RecordTest.FileInfo, as: :file_info
813

@@ -13,8 +18,7 @@ defmodule RecordTest.FileInfo.Helper do
1318
def size(file_info(size: size)), do: size
1419
end
1520

16-
defrecord RecordTest.SomeRecord, a: 0, b: 1
17-
defrecord RecordTest.WithNoField, []
21+
## Dynamic names and overridable
1822

1923
name = RecordTest.DynamicName
2024
defrecord name, a: 0, b: 1 do

0 commit comments

Comments
 (0)