Skip to content

Commit da37f48

Browse files
committed
Merge pull request #411 from bloomberg/use_attribute_instead
[feature] provide class type xx = object[@uncurry] end support
2 parents e0ecf15 + 0023b96 commit da37f48

File tree

4 files changed

+79
-173
lines changed

4 files changed

+79
-173
lines changed

jscomp/ppx_entry.ml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ let handle_typ
377377
ptyp_desc = Ptyp_object ( methods, closed_flag) ;
378378
ptyp_attributes ;
379379
ptyp_loc = loc
380-
} ->
380+
} ->
381381
let methods = List.map (fun (label, ptyp_attrs, core_type ) ->
382382
match find_uncurry_attrs_and_remove ptyp_attrs with
383383
| None, _ -> label, ptyp_attrs , self.typ self core_type
@@ -400,6 +400,24 @@ let handle_typ
400400
end
401401
| _ -> super.typ self ty
402402

403+
let handle_ctyp
404+
(super : Ast_mapper.mapper)
405+
(self : Ast_mapper.mapper)
406+
(ty : Parsetree.class_type) =
407+
match ty with
408+
| {pcty_attributes ;
409+
pcty_desc ; (* we won't have [ class type v = u -> object[@uncurry] ]*)
410+
pcty_loc = loc
411+
} ->
412+
begin match find_uncurry_attrs_and_remove pcty_attributes with
413+
| Some _, pcty_attributes' ->
414+
Ext_ref.protect uncurry true begin fun () ->
415+
self.class_type self {ty with pcty_attributes = pcty_attributes'}
416+
end
417+
| None, _ -> super.class_type self ty
418+
end
419+
420+
403421
let handle_debugger loc payload =
404422
match payload with
405423
| Parsetree.PStr ( [])
@@ -732,6 +750,7 @@ let rec unsafe_mapper : Ast_mapper.mapper =
732750
| _ -> Ast_mapper.default_mapper.expr mapper e
733751
);
734752
typ = (fun self typ -> handle_typ Ast_mapper.default_mapper self typ);
753+
class_type = (fun self ctyp -> handle_ctyp Ast_mapper.default_mapper self ctyp);
735754
structure_item = (fun mapper (str : Parsetree.structure_item) ->
736755
begin match str.pstr_desc with
737756
| Pstr_extension ( ({txt = "bs.raw"; loc}, payload), _attrs)

jscomp/test/attr_test.ml

Lines changed: 2 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -10,78 +10,15 @@ type number = float
1010
class type date =
1111
object [@uncurry]
1212
method toDateString : unit -> string
13-
method toTimeString : unit -> string
14-
method toLocaleString : unit -> string
15-
method toLocaleDateString : unit -> string
16-
method toLocaleTimeString : unit -> string
17-
method valueOf : unit -> number
1813
method getTime : unit -> number
19-
method getFullYear : unit -> number
20-
method getUTCFullYear : unit -> number
21-
method getMonth : unit -> number
22-
method getUTCMonth : unit -> number
23-
method getDate : unit -> number
24-
method getUTCDate : unit -> number
25-
method getDay : unit -> number
26-
method getUTCDay : unit -> number
27-
method getHours : unit -> number
28-
method getUTCHours : unit -> number
29-
method getMinutes : unit -> number
30-
method getUTCMinutes : unit -> number
31-
method getSeconds : unit -> number
32-
method getUTCSeconds : unit -> number
33-
method getMilliseconds : unit -> number
34-
method getUTCMilliseconds : unit -> number
35-
method getTimezoneOffset : unit -> number
36-
method setTime : number -> number
37-
3814
method setMilliseconds : number -> number
39-
method setUTCMilliseconds : number -> number
40-
4115
method setSeconds : number -> number
4216
method setSeconds__2 : number * number -> number
43-
44-
method setUTCSeconds : number -> number
45-
method setUTCSeconds__2 : number * number -> number
46-
47-
method setMinutes : number -> number
48-
method setMinutes__2 : number * number -> number
49-
method setMinutes__3 : number * number * number -> number
50-
51-
method setUTCMinutes : number -> number
52-
method setUTCMinutes__2 : number * number -> number
53-
method setUTCMinutes__3 : number * number * number -> number
54-
55-
method setHours : number -> number
56-
method setHours__2 : number * number -> number
57-
method setHours__3 : number * number * number -> number
58-
method setHours__4 : number * number * number * number -> number
59-
60-
method setUTCHours : number -> number
61-
method setUTCHours__2 : number * number -> number
62-
method setUTCHours__3 : number * number * number -> number
63-
method setUTCHours__4 : number * number * number * number -> number
64-
65-
66-
67-
method setDate : number -> number
68-
method setUTCDate : number -> number
69-
method setMonth : number -> number
70-
method setMonth__2 : number * number -> number
71-
method setUTCMonth : number * number
72-
method setUTCMonth__2 : number * number -> number
73-
74-
75-
method setFullYear : number -> number
76-
method setFullYear__2 : number * number -> number
77-
method setFullYear__3 : number * number * number -> number
78-
79-
method setUTCFullYear : number -> number
80-
method setUTCFullYear__2 : number * number -> number
8117
method setUTCFullYear__3 : number * number * number -> number
82-
8318
method toUTCString : unit -> string
8419
method toISOString : unit -> string
8520
method toJSON__ : unit -> string
8621
method toJSON__1 : 'a -> string
8722
end
23+
24+

jscomp/test/demo.ml

Lines changed: 39 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
(* open Ui_defs *)
1+
22

33
class type widget =
4-
object
5-
method on : string * (event -> unit [@uncurry]) -> unit [@uncurry]
4+
object [@uncurry]
5+
method on : string * (event -> unit ) -> unit
66
end
77
and event =
88
object
@@ -12,57 +12,55 @@ and event =
1212

1313

1414
class type title =
15-
object
16-
method title__set : string -> unit [@uncurry]
15+
object [@uncurry]
16+
method title__set : string -> unit
1717
method title : string
1818
end
1919

2020
class type text =
21-
object
22-
method text__set : string -> unit [@uncurry]
21+
object [@uncurry]
22+
method text__set : string -> unit
2323
method text : string
2424
end
2525
class type measure =
26-
object
27-
method minHeight__set : int -> unit [@uncurry]
26+
object [@uncurry]
27+
method minHeight__set : int -> unit
2828
method minHeight : int
29-
method minWidth__set : int -> unit [@uncurry]
29+
method minWidth__set : int -> unit
3030
method minWidth : int
31-
method maxHeight__set : int -> unit [@uncurry]
32-
method maxHeight : int [@uncurry]
33-
method maxWidth__set : int -> unit [@uncurry]
31+
method maxHeight__set : int -> unit
32+
method maxHeight : int
33+
method maxWidth__set : int -> unit
3434
method maxWidth : int
35-
3635
end
3736

3837
class type layout =
39-
object
40-
method orientation__set : string -> unit [@uncurry]
38+
object [@uncurry]
39+
method orientation__set : string -> unit
4140
method orientation : string
4241
end
4342

4443
class type applicationContext =
45-
object
46-
method exit : int -> unit [@uncurry]
47-
(* exit'overloading : int -> string -> unit *)
44+
object [@uncurry]
45+
method exit : int -> unit
4846
end
4947
class type contentable =
50-
object
51-
method content__set : #widget Js.t -> unit [@uncurry]
52-
method content : #widget Js.t [@uncurry]
48+
object[@uncurry]
49+
method content__set : #widget Js.t -> unit
50+
method content : #widget Js.t
5351
method contentWidth : int
54-
method contentWidth__set : int -> unit [@uncurry]
52+
method contentWidth__set : int -> unit
5553
end
5654

5755
class type hostedWindow =
58-
object
56+
object [@uncurry]
5957
inherit widget
6058
inherit title
6159
inherit contentable
62-
method show : unit -> unit [@uncurry]
63-
method hide : unit -> unit [@uncurry]
64-
method focus : unit -> unit [@uncurry]
65-
method appContext__set : applicationContext -> unit [@uncurry]
60+
method show : unit -> unit
61+
method hide : unit -> unit
62+
method focus : unit -> unit
63+
method appContext__set : applicationContext -> unit
6664
end
6765

6866
class type hostedContent =
@@ -73,51 +71,31 @@ class type hostedContent =
7371

7472

7573
class type stackPanel =
76-
object
74+
object [@uncurry]
7775
inherit measure
7876
inherit layout
7977
inherit widget
8078

81-
method addChild : #widget Js.t -> unit [@uncurry]
79+
method addChild : #widget Js.t -> unit
8280

8381
end
8482

85-
(* class type columns = *)
86-
(* object *)
87-
(* method width : int *)
88-
(* end *)
89-
class type any =
90-
object
91-
end
92-
93-
type column
94-
type titleRow
95-
96-
97-
98-
99-
external mk_text : text: 'b -> <text : 'b> = "" [@@bs.obj]
100-
external mk_label : label : 'a -> <label: 'a > = "" [@@bs.obj]
101-
external mk_width : width : 'a -> <width: 'a> = "" [@@bs.obj]
102-
external mk_column : width: int -> unit -> column = "" [@@bs.obj]
103-
external mk_titleRow : title: string -> unit -> titleRow = "" [@@bs.obj]
104-
10583
class type grid =
106-
object
84+
object [@uncurry]
10785
inherit widget
10886
inherit measure
109-
method columns__set : <width : int; .. > array -> unit [@uncurry]
87+
method columns__set : <width : int; .. > Js.t array -> unit
11088
method titleRows__set :
111-
<label : <text : string; .. > ; ..> array -> unit [@uncurry]
89+
<label : <text : string; .. > Js.t ; ..> Js.t array -> unit
11290
method dataSource__set :
113-
<label : <text : string; .. > ; ..> array array -> unit [@uncurry]
91+
<label : <text : string; .. > Js.t ; ..> Js.t array array -> unit
11492
end
11593

116-
external set_interval : (unit -> unit [@uncurry]) -> float -> unit = ""
117-
[@@bs.call "setInterval"] [@@bs.module "@runtime" "Runtime"]
118-
external set_grid_columns : grid -> column array -> unit = "" [@@bs.call "set"]
119-
external set_grid_titleRows : grid -> string array -> unit = "" [@@bs.call "set"]
120-
external to_fixed : float -> int -> string = ""[@@bs.send "toFixed"]
94+
external set_interval : (unit -> unit [@uncurry]) -> float -> unit = "setInterval"
95+
[@@bs.call] [@@bs.module "@runtime" "Runtime"]
96+
97+
98+
external to_fixed : float -> int -> string = "toFixed" [@@bs.send ]
12199

122100
class type button =
123101
object
@@ -209,8 +187,8 @@ let ui_layout
209187
stackPanel##addChild inputCode;
210188
stackPanel##addChild button;
211189

212-
let mk_titleRow = fun text -> (mk_label ~label:(mk_text ~text )) in
213-
let u = mk_width 200 in
190+
let mk_titleRow text = {label = {text } [@bs.obj] }[@bs.obj] in
191+
let u = {width = 200} [@bs.obj] in
214192
grid##minHeight__set 300;
215193
grid##titleRows__set
216194
[| mk_titleRow "Ticker";

lib/js/test/demo.js

Lines changed: 18 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
// GENERATED CODE BY BUCKLESCRIPT VERSION 0.5.0 , PLEASE EDIT WITH CARE
22
'use strict';
33

4-
var Runtime = require("@runtime");
54
var UI = require("@ui");
6-
var Curry = require("../curry");
5+
var Runtime = require("@runtime");
76
var BUI = require("@blp/ui");
7+
var Curry = require("../curry");
88

99
var data = /* array */[
1010
/* record */[
@@ -45,31 +45,22 @@ function ui_layout(compile, lookup, appContext) {
4545
stackPanel.addChild(grid);
4646
stackPanel.addChild(inputCode);
4747
stackPanel.addChild(button);
48+
var mk_titleRow = function (text) {
49+
return {
50+
"label": {
51+
"text": text
52+
}
53+
};
54+
};
4855
var u = {
4956
"width": 200
5057
};
5158
grid.minHeight = 300;
5259
grid.titleRows = /* array */[
53-
{
54-
"label": {
55-
"text": "Ticker"
56-
}
57-
},
58-
{
59-
"label": {
60-
"text": "Bid"
61-
}
62-
},
63-
{
64-
"label": {
65-
"text": "Ask"
66-
}
67-
},
68-
{
69-
"label": {
70-
"text": "Result"
71-
}
72-
}
60+
mk_titleRow("Ticker"),
61+
mk_titleRow("Bid"),
62+
mk_titleRow("Ask"),
63+
mk_titleRow("Result")
7364
];
7465
grid.columns = /* array */[
7566
u,
@@ -104,30 +95,11 @@ function ui_layout(compile, lookup, appContext) {
10495
"bid": bid,
10596
"ask": ask
10697
});
107-
var text = bid.toFixed(2);
108-
var text$1 = ask.toFixed(2);
109-
var text$2 = result.toFixed(2);
11098
return /* array */[
111-
{
112-
"label": {
113-
"text": param[/* ticker */0]
114-
}
115-
},
116-
{
117-
"label": {
118-
"text": text
119-
}
120-
},
121-
{
122-
"label": {
123-
"text": text$1
124-
}
125-
},
126-
{
127-
"label": {
128-
"text": text$2
129-
}
130-
}
99+
mk_titleRow(param[/* ticker */0]),
100+
mk_titleRow(bid.toFixed(2)),
101+
mk_titleRow(ask.toFixed(2)),
102+
mk_titleRow(result.toFixed(2))
131103
];
132104
});
133105
}, 100);
@@ -136,4 +108,4 @@ function ui_layout(compile, lookup, appContext) {
136108

137109
exports.data = data;
138110
exports.ui_layout = ui_layout;
139-
/* @runtime Not a pure module */
111+
/* @ui Not a pure module */

0 commit comments

Comments
 (0)