@@ -20,10 +20,23 @@ defmodule ElixirScript.Translator.PatternMatching do
2020 Utils . make_throw_statement ( "MatchError" , "no match of right hand side value" )
2121 )
2222 _ ->
23- declarator = Builder . variable_declarator (
24- Translator . translate ( left ) ,
25- Translator . translate ( right )
26- )
23+ declarator = case is_list ( left ) do
24+ true ->
25+ array = left
26+ |> Enum . map ( & Translator . translate ( & 1 ) )
27+ |> Builder . array_expression
28+
29+ Builder . variable_declarator (
30+ array ,
31+ Translator . translate ( right )
32+ )
33+
34+ false ->
35+ Builder . variable_declarator (
36+ Translator . translate ( left ) ,
37+ Translator . translate ( right )
38+ )
39+ end
2740
2841 Builder . variable_declaration ( [ declarator ] , :let )
2942 end
@@ -114,6 +127,8 @@ defmodule ElixirScript.Translator.PatternMatching do
114127 case Translator . translate ( value ) do
115128 % ESTree.Identifier { } ->
116129 true
130+ % ESTree.CallExpression { callee: % ESTree.Identifier { name: "List" } } ->
131+ false
117132 % ESTree.CallExpression { } ->
118133 true
119134 _ ->
@@ -133,6 +148,8 @@ defmodule ElixirScript.Translator.PatternMatching do
133148 case Translator . translate ( value ) do
134149 % ESTree.Identifier { } ->
135150 { key , { :__aliases__ , [ ] , [ :undefined ] } }
151+ % ESTree.CallExpression { callee: % ESTree.Identifier { name: "List" } } ->
152+ { key , value }
136153 % ESTree.CallExpression { } ->
137154 { key , hd ( process_pattern ( value ) ) }
138155 _ ->
@@ -251,18 +268,8 @@ defmodule ElixirScript.Translator.PatternMatching do
251268 { :identifier , item } ->
252269
253270
254- declarator = case type do
255- :list ->
256- Builder . variable_declarator (
257- Builder . identifier ( item ) ,
258- Builder . member_expression (
259- identifier_fn . ( index ) ,
260- Builder . literal ( current_state . state_index ) ,
261- true
262- )
263- )
264- :tuple ->
265- Builder . variable_declarator (
271+
272+ declarator = Builder . variable_declarator (
266273 Builder . identifier ( item ) ,
267274 Builder . call_expression (
268275 Builder . member_expression (
@@ -272,30 +279,19 @@ defmodule ElixirScript.Translator.PatternMatching do
272279 [ Builder . literal ( current_state . state_index ) ]
273280 )
274281 )
275- end
276-
277282 declaration = Builder . variable_declaration ( [ declarator ] , :let )
278283
279284 { declaration , % { current_state | body: current_state . body , state_index: current_state . state_index + 1 } }
280285 params ->
281286 { new_body , _params } = build_pattern_matched_body ( current_state . body , [ params ] ,
282287 fn ( new_index ) ->
283- case type do
284- :list ->
285- Builder . member_expression (
286- identifier_fn . ( index ) ,
287- Builder . literal ( current_state . state_index + new_index ) ,
288- true
289- )
290- :tuple ->
291- Builder . call_expression (
292- Builder . member_expression (
293- identifier_fn . ( index ) ,
294- Builder . identifier ( :get )
295- ) ,
296- [ Builder . literal ( current_state . state_index + new_index ) ]
297- )
298- end
288+ Builder . call_expression (
289+ Builder . member_expression (
290+ identifier_fn . ( index ) ,
291+ Builder . identifier ( :get )
292+ ) ,
293+ [ Builder . literal ( current_state . state_index + new_index ) ]
294+ )
299295 end , nil )
300296
301297 { nil , % { current_state | body: new_body , state_index: current_state . state_index + 1 } }
@@ -459,7 +455,7 @@ defmodule ElixirScript.Translator.PatternMatching do
459455 build_member_expression_tree ( keys , identifier )
460456 )
461457
462- Builder . variable_declaration ( [ declarator ] , :let )
458+ Builder . variable_declaration ( [ declarator ] , :let )
463459 { key , { :identifier , value } } ->
464460 declarator = Builder . variable_declarator (
465461 Builder . identifier ( value ) ,
0 commit comments