@@ -2,12 +2,15 @@ defmodule ElixirScript.Experimental.Module do
22 alias ESTree.Tools.Builder , as: J
33 alias ElixirScript.Experimental.Function
44 alias ElixirScript.Translator.Identifier
5+ alias ElixirScript.Experimental.ModuleState
56
67 @ moduledoc """
78 Upper level module that handles compilation
89 """
910
1011 def compile ( _line , _file , module , attrs , defs , unreachable , opts ) do
12+ ModuleState . start_link ( module )
13+
1114 reachable_defs = Enum . filter ( defs , fn
1215 { name , _ , _ , _ } -> not ( name in unreachable )
1316 { _ , type , _ , _ } when type in [ :defmacro , :defmacrop ] -> false
@@ -17,9 +20,10 @@ defmodule ElixirScript.Experimental.Module do
1720 compiled_functions = reachable_defs
1821 |> Enum . map ( & Function . compile ( & 1 ) )
1922
20- imports = make_imports ( reachable_defs )
23+ imports = make_imports ( )
2124 exports = make_exports ( reachable_defs )
2225
26+ ModuleState . stop ( )
2327 J . program ( imports ++ compiled_functions ++ [ J . export_default_declaration ( exports ) ] )
2428 end
2529
@@ -35,39 +39,8 @@ defmodule ElixirScript.Experimental.Module do
3539 J . object_expression ( exports )
3640 end
3741
38- defp make_imports ( reachable_defs ) do
39- imports = Enum . reduce ( reachable_defs , [ ] , fn
40- { { name , arity } , type , _ , clauses } , list when type in [ :def , :defp ] ->
41- imports = search_for_imports ( clauses )
42- list ++ imports
43- _ , list ->
44- list
45- end )
46-
47- imports
48- end
49-
50- defp search_for_imports ( clauses ) do
51- imports = Enum . map ( clauses , fn ( clause ) ->
52-
53- # Walk the AST and try to find module references
54- # We will turn these into imports
55- { ast , list } = Macro . postwalk ( clause , [ ] , fn
56- { _ , _ , _ , { { :. , _ , [ module , _ ] } , _ , _ } } = ast , list ->
57- if is_elixir_module ( module ) do
58- { ast , list ++ [ module_to_import ( module ) ] }
59- else
60- { ast , list }
61- end
62- ast , list ->
63- { ast , list }
64- end )
65-
66- list
67-
68- end )
69-
70- List . flatten ( imports ) |> Enum . uniq
42+ defp make_imports ( ) do
43+ Enum . map ( ModuleState . get_module_refs ( ) , fn ( x ) -> module_to_import ( x ) end )
7144 end
7245
7346 defp module_to_import ( module ) do
@@ -94,4 +67,8 @@ defmodule ElixirScript.Experimental.Module do
9467 false
9568 end
9669
70+ def is_js_module ( module ) do
71+ is_elixir_module ( module ) and hd ( Module . split ( module ) ) == "JS"
72+ end
73+
9774end
0 commit comments