Skip to content

Commit ce3102f

Browse files
DZakhfhammerschmidt
authored andcommitted
Improve output of Dict.has to use inlined JS' in operator (#7342)
1 parent 36048b6 commit ce3102f

29 files changed

+239
-166
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
- Remove `Stdlib_Char` module for now. https://github.com/rescript-lang/rescript/pull/7367
2626
- Convert internal JavaScript codebase into ESM, ReScript package itself is now ESM (`"type": "module"`). https://github.com/rescript-lang/rescript/pull/6899
27+
- Add built-in support for the JavaScript `in` operator. https://github.com/rescript-lang/rescript/pull/7342
2728

2829
#### :nail_care: Polish
2930

compiler/core/j.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ and expression_desc =
8686
[typeof] is an operator
8787
*)
8888
| Typeof of expression
89+
| In of expression * expression (* prop in obj *)
8990
| Js_not of expression (* !v *)
9091
(* TODO: Add some primitives so that [js inliner] can do a better job *)
9192
| Seq of expression * expression

compiler/core/js_analyzer.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ let rec no_side_effect_expression_desc (x : J.expression_desc) =
111111
&& Ext_list.for_all strings no_side_effect
112112
&& Ext_list.for_all values no_side_effect
113113
| Js_not e -> no_side_effect e
114+
| In (prop, obj) -> no_side_effect prop && no_side_effect obj
114115
| Cond (a, b, c) -> no_side_effect a && no_side_effect b && no_side_effect c
115116
| Call ({expression_desc = Str {txt = "Array.isArray"}}, [e], _) ->
116117
no_side_effect e
@@ -227,7 +228,7 @@ let rec eq_expression ({expression_desc = x0} : J.expression)
227228
eq_expression_list ls0 ls1 && flag0 = flag1 && eq_expression tag0 tag1
228229
| _ -> false)
229230
| Length _ | Is_null_or_undefined _ | String_append _ | Typeof _ | Js_not _
230-
| Cond _ | FlatCall _ | New _ | Fun _ | Raw_js_code _ | Array _
231+
| In _ | Cond _ | FlatCall _ | New _ | Fun _ | Raw_js_code _ | Array _
231232
| Caml_block_tag _ | Object _ | Tagged_template _ | Await _ ->
232233
false
233234
| Spread _ -> false

compiler/core/js_dump.ml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,8 @@ let rec exp_need_paren ?(arrow = false) (e : J.expression) =
166166
| Length _ | Call _ | Caml_block_tag _ | Seq _ | Static_index _ | Cond _
167167
| Bin _ | Is_null_or_undefined _ | String_index _ | Array_index _
168168
| String_append _ | Var _ | Undefined _ | Null | Str _ | Array _
169-
| Caml_block _ | FlatCall _ | Typeof _ | Number _ | Js_not _ | Bool _ | New _
170-
->
169+
| Caml_block _ | FlatCall _ | Typeof _ | Number _ | Js_not _ | In _ | Bool _
170+
| New _ ->
171171
false
172172
| Await _ -> false
173173
| Spread _ -> false
@@ -677,6 +677,11 @@ and expression_desc cxt ~(level : int) f x : cxt =
677677
P.cond_paren_group f (level > 13) (fun _ ->
678678
P.string f "!";
679679
expression ~level:13 cxt f e)
680+
| In (prop, obj) ->
681+
P.cond_paren_group f (level > 12) (fun _ ->
682+
let cxt = expression ~level:0 cxt f prop in
683+
P.string f " in ";
684+
expression ~level:0 cxt f obj)
680685
| Typeof e ->
681686
P.string f "typeof";
682687
P.space f;

compiler/core/js_exp_make.ml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,9 @@ let or_ ?comment (e1 : t) (e2 : t) =
11281128
| Some e -> e
11291129
| None -> {expression_desc = Bin (Or, e1, e2); comment})
11301130

1131+
let in_ (prop : t) (obj : t) : t =
1132+
{expression_desc = In (prop, obj); comment = None}
1133+
11311134
let not (e : t) : t =
11321135
match e.expression_desc with
11331136
| Number (Int {i; _}) -> bool (i = 0l)

compiler/core/js_exp_make.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,8 @@ val and_ : ?comment:string -> t -> t -> t
356356

357357
val or_ : ?comment:string -> t -> t -> t
358358

359+
val in_ : t -> t -> t
360+
359361
(** we don't expose a general interface, since a general interface is generally not safe *)
360362

361363
val dummy_obj : ?comment:string -> Lam_tag_info.t -> t

compiler/core/js_fold.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ class fold =
103103
| Js_not _x0 ->
104104
let _self = _self#expression _x0 in
105105
_self
106+
| In (_x0, _x1) ->
107+
let _self = _self#expression _x0 in
108+
let _self = _self#expression _x1 in
109+
_self
106110
| Seq (_x0, _x1) ->
107111
let _self = _self#expression _x0 in
108112
let _self = _self#expression _x1 in

compiler/core/js_record_fold.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ let expression_desc : 'a. ('a, expression_desc) fn =
109109
| Js_not _x0 ->
110110
let st = _self.expression _self st _x0 in
111111
st
112+
| In (_x0, _x1) ->
113+
let st = _self.expression _self st _x0 in
114+
let st = _self.expression _self st _x1 in
115+
st
112116
| Seq (_x0, _x1) ->
113117
let st = _self.expression _self st _x0 in
114118
let st = _self.expression _self st _x1 in

compiler/core/js_record_iter.ml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ let expression_desc : expression_desc fn =
9191
| Bool _ -> ()
9292
| Typeof _x0 -> _self.expression _self _x0
9393
| Js_not _x0 -> _self.expression _self _x0
94+
| In (_x0, _x1) ->
95+
_self.expression _self _x0;
96+
_self.expression _self _x1
9497
| Seq (_x0, _x1) ->
9598
_self.expression _self _x0;
9699
_self.expression _self _x1

compiler/core/js_record_map.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ let expression_desc : expression_desc fn =
109109
| Js_not _x0 ->
110110
let _x0 = _self.expression _self _x0 in
111111
Js_not _x0
112+
| In (_x0, _x1) ->
113+
let _x0 = _self.expression _self _x0 in
114+
let _x1 = _self.expression _self _x1 in
115+
In (_x0, _x1)
112116
| Seq (_x0, _x1) ->
113117
let _x0 = _self.expression _self _x0 in
114118
let _x1 = _self.expression _self _x1 in

0 commit comments

Comments
 (0)