@@ -711,16 +711,20 @@ let rec push_negation (e : t) : t option =
711
711
712
712
Type check optimizations:
713
713
- [(typeof x === "boolean") && (x === true/false)] -> [x === true/false]
714
- - [(typeof x ==="boolean" | "string" | "number") && (x === boolean/null/undefined)] -> [false]
715
- - [(Array.isArray(x)) && (x === boolean/null/undefined)] -> [false]
714
+ - [(typeof x === "string") && (x === "abc")] -> [x === "abc"]
715
+ - [(typeof x === "number") && (x === 123)] -> [x === 123]
716
+ - [(typeof x === "boolean" | "string" | "number") && (x === boolean/null/undefined/123/"hello")] -> [false]
717
+ - [(Array.isArray(x)) && (x === boolean/null/undefined/123/"hello")] -> [false]
716
718
717
719
- [(typeof x === "boolean") && (x !== true/false)] -> unchanged
718
- - [(typeof x === "boolean" | "string" | "number") && (x !== boolean/null/undefined)] -> [typeof x === ...]
719
- - [(Array.isArray(x)) && (x !== boolean/null/undefined)] -> [Array.isArray(x)]
720
+ - [(typeof x === "string") && (x !== "abc")] -> unchanged
721
+ - [(typeof x === "number") && (x !== 123)] -> unchanged
722
+ - [(typeof x === "boolean" | "string" | "number") && (x !== boolean/null/undefined/123/"hello")] -> [typeof x === ...]
723
+ - [(Array.isArray(x)) && (x !== boolean/null/undefined/123/"hello")] -> [Array.isArray(x)]
720
724
721
725
Equality optimizations:
722
726
- [e && e] -> [e]
723
- - [(x === boolean/null/undefined) && (x === boolean/null/undefined)] -> [false] (when not equal)
727
+ - [(x === boolean/null/undefined/123/"hello" ) && (x === boolean/null/undefined/123/"hello" )] -> [false] (when not equal)
724
728
725
729
Note: The function preserves the semantics of the original expression while
726
730
attempting to reduce it to a simpler form. If no simplification is possible,
@@ -778,24 +782,51 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
778
782
{expression_desc = Str {txt = " boolean" }} ) )
779
783
when Js_op_util. same_vident ia ib ->
780
784
Some {expression_desc = b; comment = None }
785
+ | ( Bin
786
+ ( EqEqEq ,
787
+ {expression_desc = Typeof {expression_desc = Var ia}},
788
+ {expression_desc = Str {txt = " string" }} ),
789
+ (Bin (EqEqEq , {expression_desc = Var ib}, {expression_desc = Str _}) as s)
790
+ )
791
+ | ( (Bin (EqEqEq , {expression_desc = Var ib}, {expression_desc = Str _}) as s),
792
+ Bin
793
+ ( EqEqEq ,
794
+ {expression_desc = Typeof {expression_desc = Var ia}},
795
+ {expression_desc = Str {txt = " string" }} ) )
796
+ when Js_op_util. same_vident ia ib ->
797
+ Some {expression_desc = s; comment = None }
798
+ | ( Bin
799
+ ( EqEqEq ,
800
+ {expression_desc = Typeof {expression_desc = Var ia}},
801
+ {expression_desc = Str {txt = " number" }} ),
802
+ (Bin (EqEqEq , {expression_desc = Var ib}, {expression_desc = Number _}) as
803
+ i) )
804
+ | ( (Bin (EqEqEq , {expression_desc = Var ib}, {expression_desc = Number _}) as
805
+ i),
806
+ Bin
807
+ ( EqEqEq ,
808
+ {expression_desc = Typeof {expression_desc = Var ia}},
809
+ {expression_desc = Str {txt = " number" }} ) )
810
+ when Js_op_util. same_vident ia ib ->
811
+ Some {expression_desc = i; comment = None }
781
812
| ( Bin
782
813
( EqEqEq ,
783
814
{expression_desc = Typeof {expression_desc = Var ia}},
784
815
{expression_desc = Str {txt = " boolean" | " string" | " number" }} ),
785
816
Bin
786
817
( EqEqEq ,
787
818
{expression_desc = Var ib},
788
- {expression_desc = Bool _ | Null | Undefined _} ) )
819
+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ) )
789
820
| ( Bin
790
821
( EqEqEq ,
791
822
{expression_desc = Var ib},
792
- {expression_desc = Bool _ | Null | Undefined _} ),
823
+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ),
793
824
Bin
794
825
( EqEqEq ,
795
826
{expression_desc = Typeof {expression_desc = Var ia}},
796
827
{expression_desc = Str {txt = " boolean" | " string" | " number" }} ) )
797
828
when Js_op_util. same_vident ia ib ->
798
- (* Note: case boolean / Bool _ is handled above *)
829
+ (* Note: cases boolean / Bool _, number / Number _, string / Str _ are handled above *)
799
830
Some false_
800
831
| ( Call
801
832
( {expression_desc = Str {txt = " Array.isArray" }},
@@ -804,11 +835,11 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
804
835
Bin
805
836
( EqEqEq ,
806
837
{expression_desc = Var ib},
807
- {expression_desc = Bool _ | Null | Undefined _} ) )
838
+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ) )
808
839
| ( Bin
809
840
( EqEqEq ,
810
841
{expression_desc = Var ib},
811
- {expression_desc = Bool _ | Null | Undefined _} ),
842
+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ),
812
843
Call
813
844
( {expression_desc = Str {txt = " Array.isArray" }},
814
845
[{expression_desc = Var ia}],
@@ -827,6 +858,30 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
827
858
{expression_desc = Str {txt = " boolean" }} ) )
828
859
when Js_op_util. same_vident ia ib ->
829
860
None
861
+ | ( Bin
862
+ ( EqEqEq ,
863
+ {expression_desc = Typeof {expression_desc = Var ia}},
864
+ {expression_desc = Str {txt = " string" }} ),
865
+ Bin (NotEqEq , {expression_desc = Var ib}, {expression_desc = Str _}) )
866
+ | ( Bin (NotEqEq , {expression_desc = Var ib}, {expression_desc = Str _}),
867
+ Bin
868
+ ( EqEqEq ,
869
+ {expression_desc = Typeof {expression_desc = Var ia}},
870
+ {expression_desc = Str {txt = " string" }} ) )
871
+ when Js_op_util. same_vident ia ib ->
872
+ None
873
+ | ( Bin
874
+ ( EqEqEq ,
875
+ {expression_desc = Typeof {expression_desc = Var ia}},
876
+ {expression_desc = Str {txt = " number" }} ),
877
+ Bin (NotEqEq , {expression_desc = Var ib}, {expression_desc = Number _}) )
878
+ | ( Bin (NotEqEq , {expression_desc = Var ib}, {expression_desc = Number _}),
879
+ Bin
880
+ ( EqEqEq ,
881
+ {expression_desc = Typeof {expression_desc = Var ia}},
882
+ {expression_desc = Str {txt = " number" }} ) )
883
+ when Js_op_util. same_vident ia ib ->
884
+ None
830
885
| ( (Bin
831
886
( EqEqEq ,
832
887
{expression_desc = Typeof {expression_desc = Var ia}},
@@ -835,7 +890,7 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
835
890
Bin
836
891
( NotEqEq ,
837
892
{expression_desc = Var ib},
838
- {expression_desc = Bool _ | Null | Undefined _} ) )
893
+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ) )
839
894
| ( Bin
840
895
( NotEqEq ,
841
896
{expression_desc = Var ib},
@@ -846,7 +901,7 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
846
901
{expression_desc = Str {txt = " boolean" | " string" | " number" }} ) as
847
902
typeof) )
848
903
when Js_op_util. same_vident ia ib ->
849
- (* Note: case boolean / Bool _ is handled above *)
904
+ (* Note: cases boolean / Bool _, number / Number _, string / Str _ are handled above *)
850
905
Some {expression_desc = typeof; comment = None }
851
906
| ( (Call
852
907
( {expression_desc = Str {txt = " Array.isArray" }},
@@ -855,11 +910,11 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
855
910
Bin
856
911
( NotEqEq ,
857
912
{expression_desc = Var ib},
858
- {expression_desc = Bool _ | Null | Undefined _} ) )
913
+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ) )
859
914
| ( Bin
860
915
( NotEqEq ,
861
916
{expression_desc = Var ib},
862
- {expression_desc = Bool _ | Null | Undefined _} ),
917
+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ),
863
918
(Call
864
919
( {expression_desc = Str {txt = " Array.isArray" }},
865
920
[{expression_desc = Var ia}],
@@ -870,11 +925,11 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
870
925
| ( Bin
871
926
( EqEqEq ,
872
927
{expression_desc = Var ia},
873
- {expression_desc = Bool _ | Null | Undefined _} ),
928
+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ),
874
929
Bin
875
930
( EqEqEq ,
876
931
{expression_desc = Var ib},
877
- {expression_desc = Bool _ | Null | Undefined _} ) )
932
+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ) )
878
933
when Js_op_util. same_vident ia ib ->
879
934
(* Note: case x = y is handled above *)
880
935
Some false_
0 commit comments