Skip to content

Commit 281640f

Browse files
committed
Add umd module rename ES6 module to ES
1 parent 24cd7df commit 281640f

File tree

16 files changed

+180
-181
lines changed

16 files changed

+180
-181
lines changed

lib/elixir_script.ex

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,22 @@ defmodule ElixirScript do
214214
|> Map.put(:full_build, false)
215215
|> Map.put(:output, nil)
216216
|> Map.put(:app, :app)
217+
|> Map.put(:format, :es)
217218

218-
Map.merge(default_options, opts)
219+
options = Map.merge(default_options, opts)
220+
Map.put(options, :module_formatter, get_module_formatter(options[:format]))
221+
end
222+
223+
defp get_module_formatter(:umd) do
224+
ElixirScript.ModuleSystems.UMD
225+
end
226+
227+
defp get_module_formatter(:common) do
228+
ElixirScript.ModuleSystems.Common
229+
end
230+
231+
defp get_module_formatter(_) do
232+
ElixirScript.ModuleSystems.ES
219233
end
220234

221235
@doc """

lib/elixir_script/module_systems.ex

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
defmodule ElixirScript.ModuleSystems.ES do
2+
@moduledoc false
3+
alias ESTree.Tools.Builder, as: JS
4+
alias ElixirScript.Translator
5+
alias ElixirScript.Translator.State
6+
alias ElixirScript.Translator.Utils
7+
8+
def build(body, exports, env) do
9+
js_module_refs = State.get_javascript_module_references(env.state, env.module)
10+
std_import = make_std_lib_import(env)
11+
module_refs = State.get_module_references(env.state, env.module) -- [env.module]
12+
|> module_imports_to_js_imports(env)
13+
app_name = State.get_module(env.state, env.module).app
14+
15+
imports = js_module_refs ++ std_import
16+
|> Enum.map(fn
17+
{module, path, true} -> import_module(module, path, env)
18+
{module, path, false} -> import_namespace_module(module, path, env)
19+
end)
20+
21+
imports = Enum.uniq(imports ++ module_refs)
22+
23+
export = export_module(exports)
24+
imports ++ body ++ [export]
25+
end
26+
27+
defp module_imports_to_js_imports(module_refs, env) do
28+
Enum.map(module_refs, fn(x) ->
29+
module_name = Utils.name_to_js_name(x)
30+
app_name = State.get_module(env.state, x).app
31+
path = Utils.make_local_file_path(app_name, Utils.name_to_js_file_name(x), env)
32+
import_module(module_name, path)
33+
end)
34+
end
35+
36+
defp make_std_lib_import(env) do
37+
compiler_opts = State.get(env.state).compiler_opts
38+
case compiler_opts.import_standard_libs do
39+
true ->
40+
[{:Elixir, Utils.make_local_file_path(:elixir, compiler_opts.core_path, env), true }]
41+
false ->
42+
[]
43+
end
44+
end
45+
46+
def import_namespace_module(module_name, from, env) do
47+
import_specifier = JS.import_namespace_specifier(
48+
Translator.translate!(module_name, env),
49+
Translator.translate!(module_name, env)
50+
)
51+
52+
do_import_module([import_specifier], from)
53+
end
54+
55+
def import_module(module_name, from, env) do
56+
import_specifier = JS.import_default_specifier(
57+
Translator.translate!(module_name, env),
58+
Translator.translate!(module_name, env)
59+
)
60+
61+
do_import_module([import_specifier], from)
62+
end
63+
64+
def import_module(import_name, from) do
65+
import_specifier = JS.import_default_specifier(
66+
JS.identifier(import_name)
67+
)
68+
69+
do_import_module([import_specifier], from)
70+
end
71+
72+
defp do_import_module(import_specifiers, file_path) do
73+
JS.import_declaration(
74+
import_specifiers,
75+
JS.literal(file_path)
76+
)
77+
end
78+
79+
def export_module(exported_object) do
80+
JS.export_default_declaration(exported_object)
81+
end
82+
83+
end

lib/elixir_script/module_systems/es6.ex

Lines changed: 0 additions & 43 deletions
This file was deleted.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
defmodule ElixirScript.ModuleSystems.UMD do
2+
end

lib/elixir_script/passes/consolidate_protocols.ex

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ defmodule ElixirScript.Passes.ConsolidateProtocols do
22
@moduledoc false
33
alias ESTree.Tools.Builder, as: JS
44
alias ElixirScript.Translator.Utils
5-
alias ElixirScript.ModuleSystems
65
alias ElixirScript.Translator.State
76
require Logger
87

@@ -55,8 +54,6 @@ defmodule ElixirScript.Passes.ConsolidateProtocols do
5554
end
5655

5756
defp make_defimpl(name, { _, protocol }, implementations, compiler_opts) do
58-
imports = [ModuleSystems.import_module(:Elixir, Utils.make_local_file_path(:elixir, compiler_opts.core_path, compiler_opts.root, nil))]
59-
6057
declarator = JS.variable_declarator(
6158
JS.identifier("impls"),
6259
JS.array_expression([])
@@ -70,22 +67,30 @@ defmodule ElixirScript.Passes.ConsolidateProtocols do
7067

7168
app_name = protocol.app
7269

73-
body = Enum.flat_map(implementations, fn({_, impl_data}) ->
70+
imports = [compiler_opts.module_formatter.import_module(:Elixir, Utils.make_local_file_path(:elixir, compiler_opts.core_path, compiler_opts.root, nil))]
71+
72+
defimpl_imports = Enum.map(implementations, fn({_, impl_data}) ->
7473
x = Atom.to_string(Utils.quoted_to_name(impl_data.for))
7574
x = String.to_atom(protocol_name <> ".DefImpl." <> x)
7675
name = Utils.name_to_js_name(x)
77-
imports = ModuleSystems.import_module(name, Utils.make_local_file_path(impl_data.app, Utils.name_to_js_file_name(x), compiler_opts.root, nil))
78-
call = JS.call_expression(
76+
compiler_opts.module_formatter.import_module(name, Utils.make_local_file_path(impl_data.app, Utils.name_to_js_file_name(x), compiler_opts.root, nil))
77+
end)
78+
79+
body = Enum.map(implementations, fn({_, impl_data}) ->
80+
x = Atom.to_string(Utils.quoted_to_name(impl_data.for))
81+
x = String.to_atom(protocol_name <> ".DefImpl." <> x)
82+
name = Utils.name_to_js_name(x)
83+
JS.call_expression(
7984
JS.member_expression(
8085
JS.identifier("impls"),
8186
JS.identifier("push")
8287
),
8388
[JS.identifier(name)]
8489
)
85-
86-
[imports, call]
8790
end)
8891

92+
imports = imports ++ defimpl_imports
93+
8994
module_name = String.to_atom(protocol_name <> ".DefImpl")
9095
module_data = %{
9196
module: String.to_atom(protocol_name <> ".DefImpl"),

lib/elixir_script/passes/java_script_ast.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ defmodule ElixirScript.Passes.JavaScriptAST do
3636

3737
defp compile(module_data, opts, state) do
3838

39-
env = ElixirScript.Translator.LexicalScope.module_scope(module_data.name, Utils.name_to_js_file_name(module_data.name) <> ".js", opts.env, state)
39+
env = ElixirScript.Translator.LexicalScope.module_scope(module_data.name, Utils.name_to_js_file_name(module_data.name) <> ".js", opts.env, state, opts)
4040

4141
module = case module_data.type do
4242
:module ->

lib/elixir_script/translator/kernel/defmodule.ex

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ defmodule ElixirScript.Translator.Defmodule do
66
alias ElixirScript.Translator.Utils
77
alias ElixirScript.Translator.Group
88
alias ElixirScript.Translator.Def
9-
alias ElixirScript.ModuleSystems
109
alias ElixirScript.Translator.Identifier
1110

1211
def make_module(ElixirScript.Temp, body, env) do
@@ -25,15 +24,10 @@ defmodule ElixirScript.Translator.Defmodule do
2524

2625
{ exported_functions, private_functions } = process_functions(functions, env)
2726

28-
module_refs = ElixirScript.Translator.State.get_module_references(env.state, module) -- [env.module]
29-
30-
{imports, body} = extract_imports_from_body(body)
3127
{structs, body} = extract_structs_from_body(body, env)
3228

3329
app_name = State.get_module(env.state, module).app
3430

35-
imports = imports ++ make_std_lib_import(env) ++ make_imports(app_name, module_refs, env)
36-
3731
#Collect all the functions so that we can process their arity
3832
body = Enum.map(body, fn(x) ->
3933
case x do
@@ -56,11 +50,12 @@ defmodule ElixirScript.Translator.Defmodule do
5650
exported_functions = Enum.map(exported_functions, fn({_key, value}) -> value end)
5751
private_functions = Enum.map(private_functions, fn({_key, value}) -> value end)
5852

59-
default = ModuleSystems.export_module(exported_object)
53+
body = structs ++ private_functions ++ exported_functions ++ body
54+
body = env.module_formatter.build(body, exported_object, env)
6055

6156
result = %{
6257
name: Utils.quoted_to_name({:__aliases__, [], module }),
63-
body: imports ++ structs ++ private_functions ++ exported_functions ++ body ++ [default],
58+
body: body,
6459
app_name: app_name
6560
}
6661

@@ -176,16 +171,6 @@ defmodule ElixirScript.Translator.Defmodule do
176171
end
177172
end
178173

179-
def make_std_lib_import(env) do
180-
compiler_opts = ElixirScript.Translator.State.get(env.state).compiler_opts
181-
case compiler_opts.import_standard_libs do
182-
true ->
183-
[ModuleSystems.import_module(:Elixir, Utils.make_local_file_path(:elixir, compiler_opts.core_path, env))]
184-
false ->
185-
[]
186-
end
187-
end
188-
189174
def process_functions(%{ exported: exported, private: private, exported_generators: exported_generators, private_generators: private_generators }, env) do
190175
exported_functions = Enum.map(Dict.keys(exported), fn(key) ->
191176
functions = Dict.get(exported, key)
@@ -225,13 +210,4 @@ defmodule ElixirScript.Translator.Defmodule do
225210
JS.variable_declaration([declarator], :const)
226211
end
227212

228-
def make_imports(current_app_name, enum, env) do
229-
Enum.map(enum, fn(x) ->
230-
module_name = Utils.name_to_js_name(x)
231-
app_name = State.get_module(env.state, x).app
232-
path = Utils.make_local_file_path(app_name, Utils.name_to_js_file_name(x), env)
233-
ModuleSystems.import_module(module_name, path)
234-
end)
235-
end
236-
237213
end

0 commit comments

Comments
 (0)