@@ -35,6 +35,8 @@ class type mapper = object
35
35
36
36
method class_decl : Javascript. class_declaration -> Javascript. class_declaration
37
37
38
+ method class_element : Javascript. class_element -> Javascript. class_element
39
+
38
40
method initialiser :
39
41
Javascript. expression * Javascript. location
40
42
-> Javascript. expression * Javascript. location
@@ -108,7 +110,7 @@ class map : mapper =
108
110
; body = List. map x.body ~f: m#class_element
109
111
}
110
112
111
- method private class_element x =
113
+ method class_element x =
112
114
match x with
113
115
| CEMethod (s , n , meth ) -> CEMethod (s, m#class_element_name n, m#method_ meth)
114
116
| CEField (s , n , i ) -> CEField (s, m#class_element_name n, m#initialiser_o i)
@@ -305,6 +307,8 @@ class map : mapper =
305
307
class type iterator = object
306
308
method fun_decl : Javascript. function_declaration -> unit
307
309
310
+ method class_decl : Javascript. class_declaration -> unit
311
+
308
312
method early_error : Javascript. early_error -> unit
309
313
310
314
method expression : Javascript. expression -> unit
@@ -373,7 +377,7 @@ class iter : iterator =
373
377
m#formal_parameter_list params;
374
378
m#function_body body
375
379
376
- method private class_decl x =
380
+ method class_decl x =
377
381
Option. iter x.extends ~f: m#expression;
378
382
List. iter x.body ~f: m#class_element
379
383
@@ -843,14 +847,19 @@ class free =
843
847
m#merge_info tbody;
844
848
EFun (ident, (k, params, body, nid))
845
849
| EClass (ident_o , cl_decl ) ->
850
+ let same_level = level in
851
+ let cbody = {< state_ = empty; level = same_level> } in
846
852
let ident_o =
847
853
Option. map
848
854
~f: (fun id ->
849
- m #def_var id;
850
- m#ident id)
855
+ cbody #def_var id;
856
+ id)
851
857
ident_o
852
858
in
853
- EClass (ident_o, m#class_decl cl_decl)
859
+ let cl_decl = cbody#class_decl cl_decl in
860
+ cbody#record_block Normal ;
861
+ m#merge_block_info cbody;
862
+ EClass (ident_o, cl_decl)
854
863
| _ -> super#expression x
855
864
856
865
method record_block _ = ()
@@ -870,6 +879,16 @@ class free =
870
879
m#merge_block_info tbody;
871
880
b
872
881
882
+ method class_element x =
883
+ match x with
884
+ | CEStaticBLock l ->
885
+ let tbody = {< state_ = empty; level = level + 1 > } in
886
+ let l = tbody#statements l in
887
+ tbody#record_block Normal ;
888
+ m#merge_info tbody;
889
+ CEStaticBLock l
890
+ | _ -> super#class_element x
891
+
873
892
method statement x =
874
893
match x with
875
894
| Function_declaration (id , (k , params , body , nid )) ->
@@ -883,9 +902,56 @@ class free =
883
902
m#merge_info tbody;
884
903
Function_declaration (id, (k, params, body, nid))
885
904
| Class_declaration (id , cl_decl ) ->
905
+ let same_level = level in
906
+ let cbody = {< state_ = empty; level = same_level> } in
907
+ let cl_decl = cbody#class_decl cl_decl in
908
+ cbody#record_block Normal ;
909
+ m#merge_block_info cbody;
886
910
m#def_var id;
887
- Class_declaration (id, m#class_decl cl_decl)
911
+ Class_declaration (id, cl_decl)
888
912
| Block b -> Block (m#block b)
913
+ | For_statement (Right (((Const | Let ) as k ), l ), e1 , e2 , (st , loc )) ->
914
+ let same_level = level in
915
+ let m' = {< state_ = empty; level = same_level> } in
916
+ let l = List. map ~f: (m'#variable_declaration k) l in
917
+ let e1 = Option. map ~f: m'#expression e1 in
918
+ let e2 = Option. map ~f: m'#expression e2 in
919
+ let st = m'#statement st in
920
+ m'#record_block Normal ;
921
+ m#merge_block_info m';
922
+ For_statement (Right (k, l), e1, e2, (st, m#loc loc))
923
+ | ForIn_statement (Right (((Const | Let ) as k ), l ), e2 , (st , loc )) ->
924
+ let same_level = level in
925
+ let m' = {< state_ = empty; level = same_level> } in
926
+ let l = m'#for_binding k l in
927
+ let e2 = m'#expression e2 in
928
+ let st = m'#statement st in
929
+ m'#record_block Normal ;
930
+ m#merge_block_info m';
931
+ ForIn_statement (Right (k, l), e2, (st, m#loc loc))
932
+ | ForOf_statement (Right (((Const | Let ) as k ), l ), e2 , (st , loc )) ->
933
+ let same_level = level in
934
+ let m' = {< state_ = empty; level = same_level> } in
935
+ let l = m'#for_binding k l in
936
+ let e2 = m'#expression e2 in
937
+ let st = m'#statement st in
938
+ m'#record_block Normal ;
939
+ m#merge_block_info m';
940
+ ForOf_statement (Right (k, l), e2, (st, m#loc loc))
941
+ | Switch_statement (e , l , def , l' ) ->
942
+ let same_level = level in
943
+ let m' = {< state_ = empty; level = same_level> } in
944
+ let l = List. map l ~f: (fun (e , s ) -> m'#switch_case e, m'#statements s) in
945
+ let l' = List. map l' ~f: (fun (e , s ) -> m'#switch_case e, m'#statements s) in
946
+ let def =
947
+ match def with
948
+ | None -> None
949
+ | Some l -> Some (m'#statements l)
950
+ in
951
+ let e = m#expression e in
952
+ m'#record_block Normal ;
953
+ m#merge_block_info m';
954
+ Switch_statement (e, l, def, l')
889
955
| Try_statement (b , w , f ) ->
890
956
let same_level = level in
891
957
let b = m#block b in
@@ -958,24 +1024,38 @@ class rename_variable =
958
1024
959
1025
inherit iter as super
960
1026
961
- method expression e =
962
- match e with
963
- | EClass (ido , _ ) ->
964
- Option. iter ido ~f: decl_var;
965
- super#expression e
966
- | _ -> super#expression e
1027
+ method expression _ = ()
967
1028
968
1029
method fun_decl _ = ()
969
1030
1031
+ method class_decl _ = ()
1032
+
970
1033
method statement x =
971
1034
match scope, x with
972
1035
| Fun_block _ , Function_declaration (id , fd ) ->
973
1036
decl_var id;
974
1037
self#fun_decl fd
975
1038
| Lexical_block , Function_declaration (_ , fd ) -> self#fun_decl fd
976
- | (Fun_block _ | Lexical_block ), Class_declaration (id , _ ) ->
1039
+ | (Lexical_block | Fun_block _ ), Class_declaration (id , cl_decl ) ->
977
1040
decl_var id;
978
- super#statement x
1041
+ self#class_decl cl_decl
1042
+ | _ , For_statement (Right (((Const | Let ) as k ), l ), _e1 , _e2 , (st , _loc )) ->
1043
+ let m = {< depth = depth + 1 > } in
1044
+ List. iter ~f: (m#variable_declaration k) l;
1045
+ m#statement st
1046
+ | _ , ForOf_statement (Right (((Const | Let ) as k ), l ), _e2 , (st , _loc )) ->
1047
+ let m = {< depth = depth + 1 > } in
1048
+ m#for_binding k l;
1049
+ m#statement st
1050
+ | _ , ForIn_statement (Right (((Const | Let ) as k ), l ), _e2 , (st , _loc )) ->
1051
+ let m = {< depth = depth + 1 > } in
1052
+ m#for_binding k l;
1053
+ m#statement st
1054
+ | _ , Switch_statement (_ , l , def , l' ) ->
1055
+ let m = {< depth = depth + 1 > } in
1056
+ List. iter l ~f: (fun (_ , s ) -> m#statements s);
1057
+ Option. iter def ~f: (fun l -> m#statements l);
1058
+ List. iter l' ~f: (fun (_ , s ) -> m#statements s)
979
1059
| (Fun_block _ | Lexical_block ), _ -> super#statement x
980
1060
981
1061
method variable_declaration k l =
@@ -1016,7 +1096,7 @@ class rename_variable =
1016
1096
1017
1097
val labels = StringMap. empty
1018
1098
1019
- method private update_state scope params iter_body =
1099
+ method update_state scope params iter_body =
1020
1100
let declared_names = declared scope params iter_body in
1021
1101
{< subst = StringSet. fold
1022
1102
(fun name subst -> StringMap. add name (Code.Var. fresh_n name) subst)
@@ -1030,6 +1110,13 @@ class rename_variable =
1030
1110
| S { name = Utf8 name ; _ } -> (
1031
1111
try V (StringMap. find name subst) with Not_found -> x)
1032
1112
1113
+ method class_element x =
1114
+ match x with
1115
+ | CEStaticBLock l ->
1116
+ let m' = m#update_state (Fun_block None ) [] l in
1117
+ CEStaticBLock (m'#statements l)
1118
+ | _ -> super#class_element x
1119
+
1033
1120
method fun_decl (k , params , body , nid ) =
1034
1121
let ids = bound_idents_of_params params in
1035
1122
let m' = m#update_state (Fun_block None ) ids body in
@@ -1047,6 +1134,9 @@ class rename_variable =
1047
1134
EFun
1048
1135
( Option. map ident ~f: m'#ident
1049
1136
, (k, m'#formal_parameter_list params, m'#function_body body, m#loc nid) )
1137
+ | EClass (Some id , cl_decl ) ->
1138
+ let m' = m#update_state Lexical_block [ id ] [] in
1139
+ EClass (Some (m'#ident id), m'#class_decl cl_decl)
1050
1140
| _ -> super#expression e
1051
1141
1052
1142
method statement s =
@@ -1081,6 +1171,28 @@ class rename_variable =
1081
1171
Function_declaration
1082
1172
( m#ident id
1083
1173
, (k, m'#formal_parameter_list params, m'#function_body body, m#loc nid) )
1174
+ | For_statement (Right (((Const | Let ) as k ), l ), e1 , e2 , (st , loc )) ->
1175
+ let ids = List. concat_map ~f: bound_idents_of_variable_declaration l in
1176
+ let m' = m#update_state Lexical_block ids [] in
1177
+ For_statement
1178
+ ( Right (k, List. map ~f: (m'#variable_declaration k) l)
1179
+ , Option. map ~f: m'#expression e1
1180
+ , Option. map ~f: m'#expression e2
1181
+ , (m'#statement st, m'#loc loc) )
1182
+ | ForOf_statement (Right (((Const | Let ) as k ), l ), e2 , (st , loc )) ->
1183
+ let ids = bound_idents_of_binding l in
1184
+ let m' = m#update_state Lexical_block ids [] in
1185
+ ForOf_statement
1186
+ ( Right (k, m'#for_binding k l)
1187
+ , m'#expression e2
1188
+ , (m'#statement st, m'#loc loc) )
1189
+ | ForIn_statement (Right (((Const | Let ) as k ), l ), e2 , (st , loc )) ->
1190
+ let ids = bound_idents_of_binding l in
1191
+ let m' = m#update_state Lexical_block ids [] in
1192
+ ForOf_statement
1193
+ ( Right (k, m'#for_binding k l)
1194
+ , m'#expression e2
1195
+ , (m'#statement st, m'#loc loc) )
1084
1196
| Block l ->
1085
1197
let m' = m#update_state Lexical_block [] l in
1086
1198
Block (m'#statements l)
@@ -1124,6 +1236,22 @@ class rename_variable =
1124
1236
Some (i, m'#statements catch)
1125
1237
in
1126
1238
Try_statement (block, catch, final)
1239
+ | Switch_statement (e , l , def , l' ) ->
1240
+ let all =
1241
+ let r = ref [] in
1242
+ Option. iter def ~f: (fun l -> r := List. rev_append l ! r);
1243
+ List. iter l ~f: (fun (_ , s ) -> r := List. rev_append s ! r);
1244
+ List. iter l' ~f: (fun (_ , s ) -> r := List. rev_append s ! r);
1245
+ ! r
1246
+ in
1247
+ let m' = m#update_state Lexical_block [] all in
1248
+ Switch_statement
1249
+ ( m#expression e
1250
+ , List. map l ~f: (fun (e , s ) -> m'#switch_case e, m'#statements s)
1251
+ , (match def with
1252
+ | None -> None
1253
+ | Some l -> Some (m'#statements l))
1254
+ , List. map l' ~f: (fun (e , s ) -> m'#switch_case e, m'#statements s) )
1127
1255
| _ -> super#statement s
1128
1256
end
1129
1257
0 commit comments