Skip to content

Commit ce52bbf

Browse files
committed
All standard libs are now in the Elixir namespace
Turned all named function defintions from let to const Updated defstruct implementation
1 parent dcaa019 commit ce52bbf

39 files changed

Lines changed: 556 additions & 482 deletions

lib/elixir_script/pattern_matching/match.ex

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,51 @@ defmodule ElixirScript.PatternMatching.Match do
88
alias ElixirScript.Translator.Map
99

1010
@wildcard JS.member_expression(
11-
JS.identifier(:Patterns),
12-
JS.identifier(:wildcard)
11+
JS.identifier("Elixir"),
12+
JS.member_expression(
13+
JS.identifier(:Patterns),
14+
JS.identifier(:wildcard)
15+
)
1316
)
1417

1518
@parameter JS.member_expression(
16-
JS.identifier(:Patterns),
17-
JS.identifier(:variable)
19+
JS.identifier("Elixir"),
20+
JS.member_expression(
21+
JS.identifier(:Patterns),
22+
JS.identifier(:variable)
23+
)
1824
)
1925

2026
@head_tail JS.member_expression(
21-
JS.identifier(:Patterns),
22-
JS.identifier(:headTail)
27+
JS.identifier("Elixir"),
28+
JS.member_expression(
29+
JS.identifier(:Patterns),
30+
JS.identifier(:headTail)
31+
)
2332
)
2433

2534
@starts_with JS.member_expression(
26-
JS.identifier(:Patterns),
27-
JS.identifier(:startsWith)
35+
JS.identifier("Elixir"),
36+
JS.member_expression(
37+
JS.identifier(:Patterns),
38+
JS.identifier(:startsWith)
39+
)
2840
)
2941

3042
@capture JS.member_expression(
31-
JS.identifier(:Patterns),
32-
JS.identifier(:capture)
43+
JS.identifier("Elixir"),
44+
JS.member_expression(
45+
JS.identifier(:Patterns),
46+
JS.identifier(:capture)
47+
)
3348
)
3449

3550
@bound JS.member_expression(
36-
JS.identifier(:Patterns),
37-
JS.identifier(:bound)
51+
JS.identifier("Elixir"),
52+
JS.member_expression(
53+
JS.identifier(:Patterns),
54+
JS.identifier(:bound)
55+
)
3856
)
3957

4058
def wildcard() do

lib/elixir_script/translator.ex

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ defmodule ElixirScript.Translator do
7979

8080
defp do_translate({:%, _, [alias_info, data]}, env) do
8181
{_, _, name} = alias_info
82-
{_, _, data} = data
8382
Struct.make_struct(name, data, env)
8483
end
8584

lib/elixir_script/translator/assignment.ex

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ defmodule ElixirScript.Translator.Assignment do
1212
JS.array_pattern(params),
1313
JS.call_expression(
1414
JS.member_expression(
15-
JS.identifier("Patterns"),
16-
JS.identifier("match")
15+
JS.identifier("Elixir"),
16+
JS.member_expression(
17+
JS.identifier("Patterns"),
18+
JS.identifier("match")
19+
)
1720
),
1821
[hd(patterns), Translator.translate(right, env)]
1922
)

lib/elixir_script/translator/capture.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ defmodule ElixirScript.Translator.Capture do
2929
def make_capture(module_name, function_name, arity, env) do
3030
params = Enum.map(1..arity, fn(x) -> {String.to_atom("__#{x}"), [], ElixirScript.Translator.Capture} end)
3131

32+
if Function.module_in_standard_libs?(module_name) do
33+
module_name = [:Elixir, module_name]
34+
end
35+
3236
{ patterns, params } = Match.build_match(params, env)
3337

3438
body = JS.block_statement([

lib/elixir_script/translator/function.ex

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,32 @@ defmodule ElixirScript.Translator.Function do
77
alias ElixirScript.Preprocess.Variables
88
alias ElixirScript.Translator.Map
99

10+
@standard_libs [
11+
:Patterns, :Kernel, :Atom, :Enum, :Integer, :JS,
12+
:List, :Range, :Tuple, :Agent, :Keyword, :BitString,
13+
:Base, :String, :Bitwise
14+
]
15+
16+
def update_alias({:__aliases__, context, [name | rest]}) when name in @standard_libs do
17+
{:__aliases__, context, [:Elixir, name] ++ rest }
18+
end
19+
20+
def update_alias({:__aliases__, context, [name]}) when name in @standard_libs do
21+
{:__aliases__, context, [:Elixir, name] }
22+
end
23+
24+
def update_alias({{:., context, [module_name, function_name]}, context2, params }) do
25+
{{:., context, [update_alias(module_name), function_name]}, context2, params }
26+
end
27+
28+
def update_alias(ast) do
29+
ast
30+
end
31+
32+
def module_in_standard_libs?(name) do
33+
name in @standard_libs
34+
end
35+
1036

1137
def process_function(name, functions, env) do
1238
result = make_anonymous_function(functions, env)
@@ -16,7 +42,7 @@ defmodule ElixirScript.Translator.Function do
1642
result
1743
)
1844

19-
JS.variable_declaration([declarator], :let)
45+
JS.variable_declaration([declarator], :const)
2046
end
2147

2248
def make_anonymous_function(functions, env) do
@@ -58,8 +84,11 @@ defmodule ElixirScript.Translator.Function do
5884
def make_defmatch(clauses) do
5985
JS.call_expression(
6086
JS.member_expression(
61-
JS.identifier("Patterns"),
62-
JS.identifier("defmatch")
87+
JS.identifier("Elixir"),
88+
JS.member_expression(
89+
JS.identifier("Patterns"),
90+
JS.identifier("defmatch")
91+
)
6392
),
6493
clauses
6594
)
@@ -87,8 +116,11 @@ defmodule ElixirScript.Translator.Function do
87116
def do_make_function_clause(patterns, params, body, guard_body) do
88117
JS.call_expression(
89118
JS.member_expression(
90-
JS.identifier("Patterns"),
91-
JS.identifier("make_case")
119+
JS.identifier("Elixir"),
120+
JS.member_expression(
121+
JS.identifier("Patterns"),
122+
JS.identifier("make_case")
123+
)
92124
),
93125
[
94126
JS.array_expression(patterns),
@@ -101,8 +133,11 @@ defmodule ElixirScript.Translator.Function do
101133
def do_make_function_clause(patterns, params, body) do
102134
JS.call_expression(
103135
JS.member_expression(
104-
JS.identifier("Patterns"),
105-
JS.identifier("make_case")
136+
JS.identifier("Elixir"),
137+
JS.member_expression(
138+
JS.identifier("Patterns"),
139+
JS.identifier("make_case")
140+
)
106141
),
107142
[
108143
JS.array_expression(patterns),
@@ -112,7 +147,7 @@ defmodule ElixirScript.Translator.Function do
112147
end
113148

114149
def make_function_or_property_call(module_name, function_name, env) do
115-
the_name = case module_name do
150+
the_name = case update_alias(module_name) do
116151
{:__aliases__, _, name} ->
117152
name
118153
{name, _, _} when is_atom(name) ->
@@ -130,8 +165,11 @@ defmodule ElixirScript.Translator.Function do
130165

131166
JS.call_expression(
132167
JS.member_expression(
133-
JS.identifier("JS"),
134-
JS.identifier("get_property_or_call_function")
168+
JS.identifier("Elixir"),
169+
JS.member_expression(
170+
JS.identifier("JS"),
171+
JS.identifier("call_property")
172+
)
135173
),
136174
[
137175
Utils.make_module_expression_tree(the_name, false, env),
@@ -149,7 +187,7 @@ defmodule ElixirScript.Translator.Function do
149187
end
150188

151189
def make_function_call(module_name, function_name, params, env) do
152-
the_name = case module_name do
190+
the_name = case update_alias(module_name) do
153191
{:__aliases__, _, name} ->
154192
name
155193
{name, _, _} when is_atom(name) ->

lib/elixir_script/translator/import.ex

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -173,21 +173,12 @@ defmodule ElixirScript.Translator.Import do
173173
end
174174

175175
def create_standard_lib_imports(root, _) do
176-
module_names = [
177-
:Patterns, :Kernel, :Atom, :Enum, :Integer,
178-
:JS, :List, :Range, :Tuple, :Agent, :Keyword,
179-
:BitString, :Base, :String, :Bitwise
180-
]
181-
182-
import_specifiers = Enum.map(module_names, fn(x) ->
183-
JS.import_specifier(
184-
JS.identifier(x),
185-
JS.identifier(x)
186-
)
187-
end)
176+
import_specifier = JS.import_namespace_specifier(
177+
JS.identifier(:Elixir)
178+
)
188179

189180
import_declaration = JS.import_declaration(
190-
import_specifiers,
181+
[import_specifier],
191182
JS.identifier("'#{root(root) <> "elixir"}'")
192183
)
193184

lib/elixir_script/translator/kernel.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ defmodule ElixirScript.Translator.Kernel do
286286
end
287287

288288
defp do_translate({name, _, params}, env) do
289-
Function.make_function_call(:Kernel, name, params, env)
289+
Function.make_function_call({:__aliases__, [], [:Elixir, :Kernel]}, name, params, env)
290290
end
291291

292292
end

lib/elixir_script/translator/primitive.ex

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ defmodule ElixirScript.Translator.Primitive do
77

88
def special_forms() do
99
JS.member_expression(
10-
JS.identifier("Kernel"),
11-
JS.identifier("SpecialForms")
10+
JS.identifier("Elixir"),
11+
JS.member_expression(
12+
JS.identifier("Kernel"),
13+
JS.identifier("SpecialForms")
14+
)
1215
)
1316
end
1417

lib/elixir_script/translator/quote.ex

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,11 @@ defmodule ElixirScript.Translator.Quote do
2626

2727
JS.call_expression(
2828
JS.member_expression(
29-
JS.identifier("Enum"),
30-
JS.identifier("concat")
29+
JS.identifier("Elixir"),
30+
JS.member_expression(
31+
JS.identifier("Enum"),
32+
JS.identifier("concat")
33+
)
3134
),
3235
expr
3336
)

0 commit comments

Comments
 (0)