11defmodule ElixirScript.Translator.Bitstring do
22 @ moduledoc false
3- alias ESTree.Tools.Builder
3+ alias ESTree.Tools.Builder , as: JS
44 alias ElixirScript.Translator
55 alias ElixirScript.Translator.Primitive
66
7-
7+
88 def make_bitstring ( elements , env ) do
9- Builder . call_expression (
10- Builder . member_expression (
9+ JS . call_expression (
10+ JS . member_expression (
1111 Primitive . special_forms ( ) ,
12- Builder . identifier ( "bitstring" )
12+ JS . identifier ( "bitstring" )
1313 ) ,
1414 Enum . map ( elements , & make_bitstring_element ( & 1 , env ) )
1515 )
1616 end
1717
1818 defp make_bitstring_element ( element , env ) when is_number ( element ) do
19- do_make_bitstring_element ( { :integer , Translator . translate ( element , env ) } )
19+ do_make_bitstring_element ( { :integer , Translator . translate ( element , env ) } )
2020 end
2121
2222 defp make_bitstring_element ( element , env ) when is_binary ( element ) do
23- do_make_bitstring_element ( { :binary , Translator . translate ( element , env ) } )
23+ do_make_bitstring_element ( { :binary , Translator . translate ( element , env ) } )
2424 end
2525
2626 defp make_bitstring_element ( { :<<>> , [ ] , elements } , env ) do
2727 make_bitstring ( elements , env )
2828 end
2929
3030 defp make_bitstring_element ( { ::: , _ , [ element , { type , _ , _ } ] } , env ) when type in [ :integer , :float , :bitstring , :bits , :binary , :bytes , :utf8 , :utf16 , :utf32 ] do
31- do_make_bitstring_element ( { type , Translator . translate ( element , env ) } )
31+ do_make_bitstring_element ( { type , Translator . translate ( element , env ) } )
3232 end
3333
3434 defp make_bitstring_element ( { ::: , _ , [ element , { type , _ , params } ] } , env ) when type in [ :size , :unit ] do
35- do_make_bitstring_element ( { type , Translator . translate ( element , env ) , Enum . map ( params , & Translator . translate ( & 1 , env ) ) } )
35+ do_make_bitstring_element ( { type , Translator . translate ( element , env ) , Enum . map ( params , & Translator . translate ( & 1 , env ) ) } )
3636 end
3737
3838 defp make_bitstring_element ( { ::: , _ , [ element , { :* , _ , [ size , unit ] } ] } , env ) do
3939 size_ast = do_make_bitstring_element ( { :size , Translator . translate ( element , env ) , [ Translator . translate ( size , env ) ] } )
40- do_make_bitstring_element ( { :unit , size_ast , [ Translator . translate ( unit , env ) ] } )
40+ do_make_bitstring_element ( { :unit , size_ast , [ Translator . translate ( unit , env ) ] } )
4141 end
4242
4343 defp make_bitstring_element ( { ::: , _ , [ element , { :- , _ , types } ] } , env ) do
44- handle_type_adjectives ( { :- , [ ] , types } , Translator . translate ( element , env ) , env )
44+ handle_type_adjectives ( { :- , [ ] , types } , Translator . translate ( element , env ) , env )
4545 end
4646
4747 defp make_bitstring_element ( { ::: , _ , [ element , size ] } , env ) do
48- do_make_bitstring_element ( { :size , Translator . translate ( element , env ) , [ Translator . translate ( size , env ) ] } )
48+ do_make_bitstring_element ( { :size , Translator . translate ( element , env ) , [ Translator . translate ( size , env ) ] } )
4949 end
5050
5151 defp handle_type_adjectives ( { :- , _ , types } , ast , env ) do
@@ -64,28 +64,38 @@ defmodule ElixirScript.Translator.Bitstring do
6464 end )
6565 end
6666
67+ defp bitstring_class ( ) do
68+ JS . member_expression (
69+ JS . member_expression (
70+ JS . identifier ( "Elixir" ) ,
71+ JS . identifier ( "Core" )
72+ ) ,
73+ JS . identifier ( "BitString" )
74+ )
75+ end
76+
6777 defp do_make_bitstring_element ( { type , ast } ) do
68- Builder . call_expression (
69- Builder . member_expression (
70- Builder . identifier ( "BitString" ) ,
71- Builder . identifier ( type )
78+ JS . call_expression (
79+ JS . member_expression (
80+ bitstring_class ,
81+ JS . identifier ( type )
7282 ) ,
7383 [
7484 ast
7585 ]
76- )
86+ )
7787 end
7888
7989 defp do_make_bitstring_element ( { type , ast , params } ) when is_list ( params ) do
80- Builder . call_expression (
81- Builder . member_expression (
82- Builder . identifier ( "BitString" ) ,
83- Builder . identifier ( type )
90+ JS . call_expression (
91+ JS . member_expression (
92+ bitstring_class ,
93+ JS . identifier ( type )
8494 ) ,
8595 [
8696 ast
8797 ] ++ params
88- )
98+ )
8999 end
90100
91101 def make_interpolated_string ( elements , env ) do
@@ -98,19 +108,19 @@ defmodule ElixirScript.Translator.Bitstring do
98108 end
99109 end )
100110
101- do_make_interpolated_string ( tl ( translated_elements ) , hd ( translated_elements ) , env )
111+ do_make_interpolated_string ( tl ( translated_elements ) , hd ( translated_elements ) , env )
102112 end
103113
104114 def do_make_interpolated_string ( [ ] , ast , _ ) do
105115 ast
106116 end
107117
108118 def do_make_interpolated_string ( elements , ast , env ) do
109- Builder . binary_expression (
119+ JS . binary_expression (
110120 :+ ,
111121 ast ,
112122 do_make_interpolated_string ( tl ( elements ) , hd ( elements ) , env )
113123 )
114124 end
115125
116- end
126+ end
0 commit comments