Skip to content

Commit baf9770

Browse files
committed
Added aliases, requires, and imports to ElixirScript.Module
1 parent 998cd39 commit baf9770

12 files changed

Lines changed: 411 additions & 169 deletions

File tree

lib/elixir_script.ex

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,23 @@ defmodule ElixirScript do
8686

8787
defp create_code(include_path, import_standard_libs?) do
8888

89+
ElixirScript.State.process_imports()
90+
8991
state = ElixirScript.State.get()
9092

9193
current = self
9294

9395
result = state.modules
9496
|> Enum.map(fn(x) ->
95-
result = ElixirScript.Translator.Module.make_module(x.name, x.body, state.env)
96-
|> Enum.map(fn(x) ->
97-
convert_to_code(x, state.root, include_path, state.env, import_standard_libs?)
98-
end)
99-
100-
spawn_link fn -> (send current, { self, result }) end
97+
spawn_link fn ->
98+
Process.put(:current_module, x.name)
99+
100+
result = ElixirScript.Translator.Module.make_module(x.name, x.body, state.env)
101+
|> Enum.map(fn(x) ->
102+
convert_to_code(x, state.root, include_path, state.env, import_standard_libs?)
103+
end)
104+
send current, { self, result }
105+
end
101106
end)
102107
|> Enum.map(fn (pid) ->
103108
receive do { ^pid, x } -> x end

lib/elixir_script/env.ex

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
defmodule ElixirScript.Env do
22
@moduledoc false
3-
4-
defstruct env: __ENV__, modules: HashSet.new, root: "", protocols: HashDict.new
5-
end
3+
4+
defstruct env: __ENV__, modules: HashSet.new, root: "", protocols: HashDict.new
5+
6+
end

lib/elixir_script/module.ex

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,41 @@
11
defmodule ElixirScript.Module do
22
@moduledoc false
3-
4-
defstruct name: nil, functions: [], macros: [], body: nil
5-
end
3+
4+
defstruct name: nil, functions: Keyword.new, macros: Keyword.new, body: nil,
5+
aliases: [], requires: [], imports: [], js_imports: []
6+
7+
def functions(module) do
8+
Keyword.keys(module.functions) |> Enum.uniq
9+
end
10+
11+
def macros(module) do
12+
Keyword.keys(module.macros) |> Enum.uniq
13+
end
14+
15+
def aliases(module) do
16+
module.aliases
17+
end
18+
19+
def requires(module) do
20+
module.requires
21+
end
22+
23+
def imports(module) do
24+
module.imports
25+
end
26+
27+
def has_alias?(module, name) do
28+
List.keymember?(Set.to_list(module.aliases), name, 0)
29+
end
30+
31+
def imported?(module, function_name) do
32+
imports = Enum.find(module.imports, fn({_, functions}) ->
33+
Enum.member?(functions, function_name)
34+
end)
35+
36+
if imports do
37+
elem(imports, 0)
38+
end
39+
end
40+
41+
end

lib/elixir_script/preprocess/aliases.ex

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,50 +13,44 @@ defmodule ElixirScript.Preprocess.Aliases do
1313
1414
#the "Hello.World" would be placed in a set and later used for building an alias
1515
"""
16-
def process(ast, env) do
17-
18-
state = %{ add: HashSet.new, defined: HashSet.new }
19-
20-
{new_ast, state } = Macro.prewalk(ast, state, fn(x, acc) ->
21-
process_aliases(x, acc, env)
16+
def process(module_name_list, ast, env) do
17+
new_ast = Macro.prewalk(ast, fn(x) ->
18+
process_aliases(x, env, module_name_list)
2219
end)
2320

24-
{ new_ast, state.add }
25-
end
26-
27-
def process_aliases({:alias, _, [{:__aliases__, _, _name}, [as: {:__aliases__, _, alias_name}]]} = ast, state, _) do
28-
{ ast, %{state | defined: HashSet.put(state.defined, List.last(alias_name)) } }
29-
end
21+
module = ElixirScript.State.get_module(module_name_list)
3022

31-
def process_aliases({:alias, _, [{:__aliases__, _, name}]} = ast, state, _) do
32-
{ ast, %{state | defined: HashSet.put(state.defined, List.last(name)) } }
23+
if module do
24+
{ new_ast, ElixirScript.Module.aliases(module) }
25+
else
26+
{ new_ast, [] }
27+
end
3328
end
3429

35-
def process_aliases({{:., meta1, [{:__aliases__, meta2, aliases}, function]}, meta3, params} = ast, state, env) when aliases in [[:Collectable], [:Enumerable], [:Inspect], [:List, :Chars], [:String, :Chars]] do
30+
def process_aliases({{:., meta1, [{:__aliases__, meta2, aliases}, function]}, meta3, params}, _, module_name_list) when aliases in [[:Collectable], [:Enumerable], [:Inspect], [:List, :Chars], [:String, :Chars]] do
3631
new_ast = {{:., meta1, [{:__aliases__, meta2, List.last(aliases) |> List.wrap }, function]}, meta3, params}
37-
38-
new_state = %{ state | add: HashSet.put(state.add, [:Elixir] ++ aliases) }
39-
{ new_ast, new_state }
32+
ElixirScript.State.add_alias(module_name_list, {:__aliases__, meta2, [:Elixir] ++ aliases})
33+
new_ast
4034
end
4135

4236

43-
def process_aliases({{:., meta1, [{:__aliases__, meta2, aliases}, function]}, meta3, params} = ast, state, env) do
37+
def process_aliases({{:., meta1, [{:__aliases__, meta2, aliases}, function]}, meta3, params} = ast, _, module_name_list) do
4438
if ElixirScript.State.module_listed?(aliases) do
4539
new_ast = {{:., meta1, [{:__aliases__, meta2, List.last(aliases) |> List.wrap }, function]}, meta3, params}
4640

47-
new_state = if !HashSet.member?(state.defined, List.last(aliases)) do
48-
%{ state | add: HashSet.put(state.add, aliases) }
49-
else
50-
state
41+
module = ElixirScript.State.get_module(module_name_list)
42+
43+
if !ElixirScript.Module.has_alias?(module, {:__aliases__, meta2, List.last(aliases) |> List.wrap }) do
44+
ElixirScript.State.add_alias(module_name_list, {:__aliases__, meta2, aliases})
5145
end
5246

53-
{ new_ast, new_state }
47+
new_ast
5448
else
55-
{ ast, state }
49+
ast
5650
end
5751
end
5852

59-
def process_aliases(ast, state, _) do
60-
{ast, state}
53+
def process_aliases(ast, _, _) do
54+
ast
6155
end
62-
end
56+
end

0 commit comments

Comments
 (0)