@@ -10,46 +10,58 @@ defmodule ElixirScript.Translator.Try do
1010
1111 def make_try ( blocks , env ) do
1212 try_block = Dict . get ( blocks , :do )
13- rescue_block = Dict . get ( blocks , :rescue )
14- catch_block = Dict . get ( blocks , :catch )
15- after_block = Dict . get ( blocks , :after )
16- else_block = Dict . get ( blocks , :else )
13+ rescue_block = Dict . get ( blocks , :rescue , nil )
14+ catch_block = Dict . get ( blocks , :catch , nil )
15+ after_block = Dict . get ( blocks , :after , nil )
16+ else_block = Dict . get ( blocks , :else , nil )
17+
18+ translated_body = Function . prepare_function_body ( try_block , env ) |> JS . block_statement
19+ try_block = JS . function_expression ( [ ] , [ ] , translated_body )
20+
21+ if rescue_block do
22+ rescue_block = process_rescue_block ( rescue_block , env )
23+ else
24+ rescue_block = JS . identifier ( :null )
25+ end
1726
18- if ( else_block != nil ) do
19- raise ElixirScript.UnsupportedError , "try with else block"
27+ if catch_block do
28+ catch_block = process_catch_block ( catch_block , env )
29+ else
30+ catch_block = JS . identifier ( :null )
2031 end
2132
22- processed_rescue_and_catch_blocks = process_rescue_and_catch (
23- process_rescue_block ( rescue_block ) ,
24- process_catch_block ( catch_block ) ,
25- env
26- )
33+ if after_block do
34+ after_block = process_after_block ( after_block , env )
35+ else
36+ after_block = JS . identifier ( :null )
37+ end
2738
28- the_catch = case processed_rescue_and_catch_blocks do
29- nil ->
30- nil
31- blocks ->
32- JS . catch_clause ( @ error_identifier ,
33- JS . block_statement ( List . wrap ( blocks ) )
34- )
39+ if else_block do
40+ else_block = Function . make_anonymous_function ( else_block , env )
41+ else
42+ else_block = JS . identifier ( :null )
3543 end
3644
37- Utils . wrap_in_function_closure (
38- JS . try_statement (
39- Function . return_last_expression (
40- JS . block_statement ( List . wrap ( Translator . translate ( try_block , env ) ) )
45+ JS . call_expression (
46+ JS . member_expression (
47+ JS . member_expression (
48+ JS . identifier ( "Kernel" ) ,
49+ JS . identifier ( "SpecialForms" )
4150 ) ,
42- the_catch ,
43- Function . return_last_expression ( process_after_block ( after_block , env ) )
44- )
51+ JS . identifier ( "_try" )
52+ ) ,
53+ [
54+ try_block ,
55+ rescue_block ,
56+ catch_block ,
57+ else_block ,
58+ after_block
59+ ]
4560 )
46- end
4761
48- defp process_rescue_block ( nil ) do
49- [ ]
5062 end
5163
52- defp process_rescue_block ( rescue_block ) do
64+ defp process_rescue_block ( rescue_block , env ) do
5365 Enum . map ( rescue_block , fn ( x ) ->
5466 case x do
5567 { :-> , _ , [ [ { value , _ , module } ] , block ] } when not is_list ( module ) ->
@@ -69,34 +81,17 @@ defmodule ElixirScript.Translator.Try do
6981 end
7082 end )
7183 |> List . flatten
84+ |> Function . make_anonymous_function ( env )
7285 end
7386
74- defp process_after_block ( nil , _ ) do
75- nil
76- end
77-
78- defp process_after_block ( after_block , env ) do
79- JS . block_statement ( List . wrap (
80- Translator . translate ( after_block , env )
81- ) )
82- end
83-
84- defp process_catch_block ( nil ) do
85- [ ]
86- end
87-
88- defp process_catch_block ( catch_block ) do
87+ defp process_catch_block ( catch_block , env ) do
8988 catch_block
89+ |> Function . make_anonymous_function ( env )
9090 end
9191
92- def process_rescue_and_catch ( [ ] , [ ] , _ ) do
93- nil
94- end
95-
96- def process_rescue_and_catch ( processed_rescue_block , processed_catch_block , env ) do
97- processed_clauses = processed_catch_block ++ processed_rescue_block
98- processed_clauses = processed_clauses ++ [ { :-> , [ ] , [ [ ] , [ quote do: throw ( e ) ] ] } ]
99- Case . make_case ( { :e , [ ] , __MODULE__ } , processed_clauses , env )
92+ defp process_after_block ( after_block , env ) do
93+ translated_body = Function . prepare_function_body ( after_block , env ) |> JS . block_statement
94+ JS . function_expression ( [ ] , [ ] , translated_body )
10095 end
10196
10297 defp convert_to_struct ( [ module ] ) do
0 commit comments