@@ -169,7 +169,15 @@ defmodule ElixirScript.Translator do
169169 end
170170
171171 defp do_translate ( { :& , _ , [ { :/ , _ , [ { { :. , _ , [ module_name , function_name ] } , _ , [ ] } , arity ] } ] } , env ) do
172- { Capture . make_capture ( module_name , function_name , arity , env ) , env }
172+ module_name = create_module_name2 ( module_name , env )
173+ js_ast = case module_name do
174+ { mod , :local } ->
175+ Capture . make_capture ( mod , function_name , arity , env )
176+ mod ->
177+ Capture . make_extern_capture ( mod , function_name , arity , env )
178+ end
179+
180+ { js_ast , env }
173181 end
174182
175183 defp do_translate ( { :& , _ , [ { :/ , _ , [ { function_name , _ , _ } , arity ] } ] } , env ) do
@@ -236,37 +244,34 @@ defmodule ElixirScript.Translator do
236244 end
237245
238246 defp do_translate ( { { :. , _ , [ function_name ] } , _ , params } , env ) do
239- Call . make_function_call ( function_name , params , env )
247+ Call . make_local_function_call ( function_name , params , env )
240248 end
241249
242- defp do_translate ( { :. , _ , [ module_name , function_name ] } = ast , env ) do
243- expanded_ast = Macro . expand ( ast , env . env )
244-
245- if expanded_ast == ast do
246- module_name = create_module_name ( module_name , env )
247- Call . make_function_or_property_call ( module_name , function_name , env )
248- else
249- translate ( expanded_ast , env )
250- end
250+ defp do_translate ( { :. , _ , [ { :__aliases__ , _ , _ } = module_name , function_name ] } = ast , env ) do
251+ do_translate ( { { :. , [ ] , [ module_name , function_name ] } , [ ] , [ ] } , env )
251252 end
252253
253- defp do_translate ( { { :. , _ , [ module_name , function_name ] } , _ , [ ] } = ast , env ) do
254+ defp do_translate ( { { :. , _ , [ { :__aliases__ , _ , _ } = module_name , function_name ] } , _ , [ ] } = ast , env ) do
254255 expanded_ast = Macro . expand ( ast , env . env )
255256
256257 if expanded_ast == ast do
257- module_name = create_module_name ( module_name , env )
258- Call . make_function_or_property_call ( module_name , function_name , env )
258+ module_name = create_module_name2 ( module_name , env )
259+ case module_name do
260+ { mod , :local } ->
261+ Call . make_module_function_call ( mod , function_name , env )
262+ mod ->
263+ Call . make_extern_function_or_property_call ( mod , function_name , env )
264+ end
259265 else
260266 translate ( expanded_ast , env )
261267 end
262268 end
263269
264- defp do_translate ( { { :. , _ , [ { :__aliases__ , _ , _ } = module_name ] } , _ , params } = ast , env ) do
270+ defp do_translate ( { :. , _ , [ module_name , function_name ] } = ast , env ) do
265271 expanded_ast = Macro . expand ( ast , env . env )
266272
267273 if expanded_ast == ast do
268- module_name = create_module_name ( module_name , env )
269- Call . make_function_call ( module_name , params , env )
274+ Call . make_function_or_property_call ( module_name , function_name , env )
270275 else
271276 translate ( expanded_ast , env )
272277 end
@@ -288,11 +293,36 @@ defmodule ElixirScript.Translator do
288293 JSLib . translate_js_function ( function_name , params , env )
289294 end
290295
296+ defp do_translate ( { { :. , _ , [ { :__aliases__ , _ , _ } = module_name , function_name ] } , _ , params } = ast , env ) do
297+ expanded_ast = Macro . expand ( ast , env . env )
298+
299+ if expanded_ast == ast do
300+ module_name = create_module_name2 ( module_name , env )
301+ case module_name do
302+ { mod , :local } ->
303+ Call . make_module_function_call ( mod , function_name , params , env )
304+ mod ->
305+ Call . make_extern_function_call ( mod , function_name , params , env )
306+ end
307+ else
308+ translate ( expanded_ast , env )
309+ end
310+ end
311+
312+ defp do_translate ( { { :. , _ , [ module_name , function_name ] } , _ , params } = ast , env ) when is_atom ( module_name ) and is_atom ( function_name ) do
313+ expanded_ast = Macro . expand ( ast , env . env )
314+
315+ if expanded_ast == ast do
316+ Call . make_function_call ( module_name , function_name , params , env )
317+ else
318+ translate ( expanded_ast , env )
319+ end
320+ end
321+
291322 defp do_translate ( { { :. , _ , [ module_name , function_name ] } , _ , params } = ast , env ) do
292323 expanded_ast = Macro . expand ( ast , env . env )
293324
294325 if expanded_ast == ast do
295- module_name = create_module_name ( module_name , env )
296326 Call . make_function_call ( module_name , function_name , params , env )
297327 else
298328 translate ( expanded_ast , env )
@@ -304,8 +334,13 @@ defmodule ElixirScript.Translator do
304334 end
305335
306336 defp do_translate ( { :__aliases__ , _ , aliases } = ast , env ) do
307- module_name = create_module_name ( ast , env )
308- Call . make_module_name ( module_name , env )
337+ module_name = create_module_name2 ( ast , env )
338+ case module_name do
339+ { mod , :local } ->
340+ Call . make_module_name ( mod , env )
341+ mod ->
342+ Call . make_extern_module_name ( mod , env )
343+ end
309344 end
310345
311346 defp do_translate ( { :__MODULE__ , _ , _ } , env ) do
@@ -580,12 +615,12 @@ defmodule ElixirScript.Translator do
580615
581616 cond do
582617 name_arity in module . functions or name_arity in module . private_functions ->
583- Call . make_function_call ( name , params , env )
618+ Call . make_local_function_call ( name , params , env )
584619 ElixirScript.Translator.LexicalScope . find_module ( env , name_arity ) ->
585620 imported_module_name = ElixirScript.Translator.LexicalScope . find_module ( env , name_arity )
586- Call . make_function_call ( imported_module_name , name , params , env )
621+ Call . make_module_function_call ( imported_module_name , name , params , env )
587622 true ->
588- Call . make_function_call ( name , params , env )
623+ Call . make_local_function_call ( name , params , env )
589624 end
590625
591626 else
@@ -604,7 +639,7 @@ defmodule ElixirScript.Translator do
604639 Call . make_function_call ( name , [ ] , env )
605640 ElixirScript.Translator.LexicalScope . find_module ( env , { name , 0 } ) ->
606641 imported_module_name = ElixirScript.Translator.LexicalScope . find_module ( env , { name , 0 } )
607- Call . make_function_call ( imported_module_name , name , params , env )
642+ Call . make_module_function_call ( imported_module_name , name , params , env )
608643 true ->
609644 { Identifier . make_identifier ( name ) , env }
610645 end
@@ -645,6 +680,17 @@ defmodule ElixirScript.Translator do
645680 end
646681 end
647682
683+ def create_module_name2 ( module_name , env ) do
684+ module_name = Utils . quoted_to_name ( module_name )
685+ candiate_module_name = ElixirScript.Translator.State . get_module_name ( env . state , module_name )
686+
687+ if ElixirScript.Translator.LexicalScope . get_module_name ( env , candiate_module_name ) in ElixirScript.Translator.State . list_module_names ( env . state ) do
688+ { ElixirScript.Translator.LexicalScope . get_module_name ( env , candiate_module_name ) , :local }
689+ else
690+ module_name
691+ end
692+ end
693+
648694 def has_function? ( module_name , name_arity , env ) do
649695 case ElixirScript.Translator.State . get_module ( env . state , module_name ) do
650696 nil ->
0 commit comments