11defmodule ElixirScript.Translate.Form do
22 alias ESTree.Tools.Builder , as: J
3- alias ElixirScript.Translate.Forms . { Bitstring , Match , Try , For , Struct , Receive , Remote }
3+ alias ElixirScript.Translate.Forms . { Bitstring , Match , Try , For , Struct , Receive , Remote , Pattern }
44 alias ElixirScript.Translate.Functions . { Erlang , Lists , Maps }
55 alias ElixirScript.Translator.Identifier
66 alias ElixirScript.Translate.Clause
@@ -62,7 +62,7 @@ defmodule ElixirScript.Translate.Form do
6262 ) ,
6363 J . identifier ( "Tuple" )
6464 ) ,
65- Enum . map ( elements , & compile! ( & 1 , state ) )
65+ Enum . map ( elements , & compile! ( & 1 , state ) ) |> List . flatten
6666 )
6767
6868 { ast , state }
@@ -94,7 +94,7 @@ defmodule ElixirScript.Translate.Form do
9494 ElixirScript.Translate.Function . patterns_ast ( ) ,
9595 J . identifier ( "defmatch" )
9696 ) ,
97- Enum . map ( clauses , fn x -> Clause . compile ( x , state ) |> elem ( 0 ) end )
97+ Enum . map ( clauses , fn x -> Clause . compile ( x , state ) |> elem ( 0 ) end ) |> List . flatten
9898 )
9999
100100 ast = J . call_expression (
@@ -109,10 +109,13 @@ defmodule ElixirScript.Translate.Form do
109109 processed_clauses = Enum . map ( clauses , fn ( { :-> , _ , [ clause , clause_body ] } ) ->
110110 { translated_body , state } = Enum . map_reduce ( List . wrap ( clause_body ) , state , & compile ( & 1 , & 2 ) )
111111
112- translated_body = Clause . return_last_statement ( translated_body )
112+ translated_body = translated_body
113+ |> List . flatten
114+ |> Clause . return_last_statement
115+
113116 translated_body = J . arrow_function_expression ( [ ] , [ ] , J . block_statement ( translated_body ) )
114117
115- translated_clause = compile ( hd ( clause ) , state )
118+ { translated_clause , _ } = compile ( hd ( clause ) , state )
116119
117120
118121 J . array_expression ( [ translated_clause , translated_body ] )
@@ -172,7 +175,16 @@ defmodule ElixirScript.Translate.Form do
172175
173176 ast = J . call_expression (
174177 ElixirScript.Translator.Identifier . make_function_name ( function_name ) ,
175- Enum . map ( params , & compile! ( & 1 , state ) )
178+ Enum . map ( params , & compile! ( & 1 , state ) ) |> List . flatten
179+ )
180+
181+ { ast , state }
182+ end
183+
184+ def compile ( { var , _ , params } , state ) when is_list ( params ) and is_atom ( var ) do
185+ ast = J . call_expression (
186+ ElixirScript.Translator.Identifier . make_function_name ( var ) ,
187+ Enum . map ( params , & compile! ( & 1 , state ) ) |> List . flatten
176188 )
177189
178190 { ast , state }
@@ -181,13 +193,14 @@ defmodule ElixirScript.Translate.Form do
181193 def compile ( { function , _ , params } , state ) when is_list ( params ) do
182194 ast = J . call_expression (
183195 compile! ( function , state ) ,
184- Enum . map ( params , & compile! ( & 1 , state ) )
196+ Enum . map ( params , & compile! ( & 1 , state ) ) |> List . flatten
185197 )
186198
187199 { ast , state }
188200 end
189201
190202 def compile ( { var , _ , _ } , state ) do
203+ var = Pattern . get_variable_name ( to_string ( var ) , state )
191204 { ElixirScript.Translator.Identifier . make_identifier ( var ) , state }
192205 end
193206
0 commit comments