@@ -711,16 +711,20 @@ let rec push_negation (e : t) : t option =
711711
712712 Type check optimizations:
713713 - [(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]
716718
717719 - [(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)]
720724
721725 Equality optimizations:
722726 - [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)
724728
725729 Note: The function preserves the semantics of the original expression while
726730 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 =
778782 {expression_desc = Str {txt = " boolean" }} ) )
779783 when Js_op_util. same_vident ia ib ->
780784 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 }
781812 | ( Bin
782813 ( EqEqEq ,
783814 {expression_desc = Typeof {expression_desc = Var ia}},
784815 {expression_desc = Str {txt = " boolean" | " string" | " number" }} ),
785816 Bin
786817 ( EqEqEq ,
787818 {expression_desc = Var ib},
788- {expression_desc = Bool _ | Null | Undefined _} ) )
819+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ) )
789820 | ( Bin
790821 ( EqEqEq ,
791822 {expression_desc = Var ib},
792- {expression_desc = Bool _ | Null | Undefined _} ),
823+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ),
793824 Bin
794825 ( EqEqEq ,
795826 {expression_desc = Typeof {expression_desc = Var ia}},
796827 {expression_desc = Str {txt = " boolean" | " string" | " number" }} ) )
797828 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 *)
799830 Some false_
800831 | ( Call
801832 ( {expression_desc = Str {txt = " Array.isArray" }},
@@ -804,11 +835,11 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
804835 Bin
805836 ( EqEqEq ,
806837 {expression_desc = Var ib},
807- {expression_desc = Bool _ | Null | Undefined _} ) )
838+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ) )
808839 | ( Bin
809840 ( EqEqEq ,
810841 {expression_desc = Var ib},
811- {expression_desc = Bool _ | Null | Undefined _} ),
842+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ),
812843 Call
813844 ( {expression_desc = Str {txt = " Array.isArray" }},
814845 [{expression_desc = Var ia}],
@@ -827,6 +858,30 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
827858 {expression_desc = Str {txt = " boolean" }} ) )
828859 when Js_op_util. same_vident ia ib ->
829860 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
830885 | ( (Bin
831886 ( EqEqEq ,
832887 {expression_desc = Typeof {expression_desc = Var ia}},
@@ -835,7 +890,7 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
835890 Bin
836891 ( NotEqEq ,
837892 {expression_desc = Var ib},
838- {expression_desc = Bool _ | Null | Undefined _} ) )
893+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ) )
839894 | ( Bin
840895 ( NotEqEq ,
841896 {expression_desc = Var ib},
@@ -846,7 +901,7 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
846901 {expression_desc = Str {txt = " boolean" | " string" | " number" }} ) as
847902 typeof) )
848903 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 *)
850905 Some {expression_desc = typeof; comment = None }
851906 | ( (Call
852907 ( {expression_desc = Str {txt = " Array.isArray" }},
@@ -855,11 +910,11 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
855910 Bin
856911 ( NotEqEq ,
857912 {expression_desc = Var ib},
858- {expression_desc = Bool _ | Null | Undefined _} ) )
913+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ) )
859914 | ( Bin
860915 ( NotEqEq ,
861916 {expression_desc = Var ib},
862- {expression_desc = Bool _ | Null | Undefined _} ),
917+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ),
863918 (Call
864919 ( {expression_desc = Str {txt = " Array.isArray" }},
865920 [{expression_desc = Var ia}],
@@ -870,11 +925,11 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
870925 | ( Bin
871926 ( EqEqEq ,
872927 {expression_desc = Var ia},
873- {expression_desc = Bool _ | Null | Undefined _} ),
928+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ),
874929 Bin
875930 ( EqEqEq ,
876931 {expression_desc = Var ib},
877- {expression_desc = Bool _ | Null | Undefined _} ) )
932+ {expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _ } ) )
878933 when Js_op_util. same_vident ia ib ->
879934 (* Note: case x = y is handled above *)
880935 Some false_
0 commit comments