@@ -3,6 +3,7 @@ defmodule ElixirScript.Passes.FindModules do
33 alias ElixirScript.Translator.Utils
44 alias ElixirScript.Translator.State
55
6+ @ spec execute ( map , map ) :: map
67 def execute ( compiler_data , opts ) do
78 data = Enum . reduce ( compiler_data . data , [ ] , fn ( data , list ) ->
89 quoted = update_quoted ( data . ast )
@@ -53,15 +54,22 @@ defmodule ElixirScript.Passes.FindModules do
5354 { ast , state }
5455 end
5556
56- defp do_module_processing ( { :defmodule , context1 , [ { :__aliases__ , _ , name } = the_alias , [ do: body ] ] } , state , opts ) do
57- { body , inner_modules } = make_inner_module_aliases ( name , body )
57+
58+ defp do_module_processing ( { :defmodule , _context1 , [ { :__aliases__ , _ , name } = the_alias , [ do: body ] ] } , state , opts ) do
59+ { body , inner_modules } = make_inner_module_aliases ( body )
5860
5961 aliases = Enum . map ( inner_modules , fn
60- ( { :defmodule , _ , [ { :__aliases__ , _ , inner_module_name } , [ do: inner_module_body ] ] } ) ->
62+ ( { :defmodule , _ , [ { :__aliases__ , _ , inner_module_name } , [ do: _inner_module_body ] ] } ) ->
6163 { :alias , [ ] , [ { :__aliases__ , [ alias: false ] , name ++ inner_module_name } , [ as: { :__aliases__ , [ alias: false ] , inner_module_name } ] ] }
6264 end )
6365
64- state = Enum . reduce ( inner_modules , state , fn
66+ state = do_module_processing_state ( inner_modules , state , name , aliases , opts )
67+
68+ [ % { name: Utils . quoted_to_name ( the_alias ) , type: :module , ast: do_module_processing_body ( body , aliases , opts ) } ] ++ state
69+ end
70+
71+ defp do_module_processing_state ( inner_modules , state , name , aliases , opts ) do
72+ Enum . reduce ( inner_modules , state , fn
6573 ( { :defmodule , context1 , [ { :__aliases__ , context2 , inner_module_name } , [ do: inner_module_body ] ] } , state ) ->
6674
6775 module_name = Utils . quoted_to_name ( { :__aliases__ , [ ] , tl ( name ) ++ inner_module_name } )
@@ -73,39 +81,36 @@ defmodule ElixirScript.Passes.FindModules do
7381 { :defmodule , context1 , [ { :__aliases__ , context2 , name ++ inner_module_name } , [ do: add_aliases_to_body ( inner_module_body , this_module_aliases ) ] ] } ,
7482 state , opts )
7583 end )
84+ end
7685
77- body = case body do
78- { :__block__ , context , list } ->
79- list = Enum . map ( list , fn
80- { :use , _ , [ module , _ ] } = using ->
81- { :use , handle_use_expression ( using , module , opts ) }
82- { :use , _ , [ module ] } = using ->
83- { :use , handle_use_expression ( using , module , opts ) }
84- ast ->
85- { :expanded , ast }
86- end )
87- |> Enum . reduce ( [ ] , fn
88- { :use , ast } , state ->
89- case ast do
90- { :__block__ , _ , list } ->
91- state ++ list
92- _ ->
93- state ++ [ ast ]
94- end
95-
96- { :expanded , ast } , state ->
97- state ++ [ ast ]
98- end )
99-
100- { :__block__ , context , list }
101-
102- _ ->
103- body
104- end
105-
106- body = add_aliases_to_body ( body , aliases )
107-
108- [ % { name: Utils . quoted_to_name ( the_alias ) , type: :module , ast: body } ] ++ state
86+ defp do_module_processing_body ( body , aliases , opts ) do
87+ body
88+ |> case do
89+ { :__block__ , context , list } ->
90+ list =
91+ list
92+ |> Enum . map ( fn
93+ { :use , _ , [ module , _ ] } = using ->
94+ { :use , handle_use_expression ( using , module , opts ) }
95+ { :use , _ , [ module ] } = using ->
96+ { :use , handle_use_expression ( using , module , opts ) }
97+ ast ->
98+ { :expanded , ast }
99+ end )
100+ |> Enum . reduce ( [ ] , fn
101+ { :use , { :__block__ , _ , list } } , state ->
102+ state ++ list
103+ { :use , ast } , state ->
104+ state ++ [ ast ]
105+ { :expanded , ast } , state ->
106+ state ++ [ ast ]
107+ end )
108+
109+ { :__block__ , context , list }
110+ _ ->
111+ body
112+ end
113+ |> add_aliases_to_body ( aliases )
109114 end
110115
111116 defp add_aliases_to_body ( body , aliases ) do
@@ -117,23 +122,21 @@ defmodule ElixirScript.Passes.FindModules do
117122 end
118123 end
119124
120- defp make_inner_module_aliases ( name , body ) do
125+ defp make_inner_module_aliases ( body ) do
121126 case body do
122127 nil ->
123128 { { :__block__ , [ ] , [ ] } , [ ] }
124129
125130 { :__block__ , context , list2 } ->
126- { list2 , inner_modules } = Enum . partition ( list2 , fn ( x ) ->
127- case x do
128- { :defmodule , _ , [ { :__aliases__ , _ , inner_module_name } , [ do: inner_module_body ] ] } ->
131+ { list2 , inner_modules } = Enum . partition ( list2 , fn
132+ { :defmodule , _ , [ { :__aliases__ , _ , _inner_module_name } , [ do: _inner_module_body ] ] } ->
129133 false
130134 _ ->
131135 true
132- end
133136 end )
134137
135138 { { :__block__ , context , list2 } , inner_modules }
136- { :defmodule , _ , [ { :__aliases__ , context , inner_module_name } , [ do: inner_module_body ] ] } = mod ->
139+ { :defmodule , _ , [ { :__aliases__ , context , _inner_module_name } , [ do: _inner_module_body ] ] } = mod ->
137140 { { :__block__ , context , [ ] } , [ mod ] }
138141 _ ->
139142 { body , [ ] }
@@ -162,13 +165,14 @@ defmodule ElixirScript.Passes.FindModules do
162165 defp update_quoted ( quoted ) do
163166 Macro . prewalk ( quoted , fn
164167 ( { name , context , parms } ) ->
165- context = if context [ :import ] == Kernel do
166- context = Keyword . update! ( context , :import , fn ( _ ) -> ElixirScript.Kernel end )
167- else
168- context
169- end
170-
171- { name , context , parms }
168+ context =
169+ if context [ :import ] == Kernel do
170+ Keyword . update! ( context , :import , fn ( _ ) -> ElixirScript.Kernel end )
171+ else
172+ context
173+ end
174+
175+ { name , context , parms }
172176 ( x ) ->
173177 x
174178 end )
0 commit comments