Skip to content

Commit

Permalink
[feature] provide class type xx = object[@uncurry] end support
Browse files Browse the repository at this point in the history
  • Loading branch information
Hongbo Zhang committed May 24, 2016
1 parent e0ecf15 commit 0023b96
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 173 deletions.
21 changes: 20 additions & 1 deletion jscomp/ppx_entry.ml
Expand Up @@ -377,7 +377,7 @@ let handle_typ
ptyp_desc = Ptyp_object ( methods, closed_flag) ;
ptyp_attributes ;
ptyp_loc = loc
} ->
} ->
let methods = List.map (fun (label, ptyp_attrs, core_type ) ->
match find_uncurry_attrs_and_remove ptyp_attrs with
| None, _ -> label, ptyp_attrs , self.typ self core_type
Expand All @@ -400,6 +400,24 @@ let handle_typ
end
| _ -> super.typ self ty

let handle_ctyp
(super : Ast_mapper.mapper)
(self : Ast_mapper.mapper)
(ty : Parsetree.class_type) =
match ty with
| {pcty_attributes ;
pcty_desc ; (* we won't have [ class type v = u -> object[@uncurry] ]*)
pcty_loc = loc
} ->
begin match find_uncurry_attrs_and_remove pcty_attributes with
| Some _, pcty_attributes' ->
Ext_ref.protect uncurry true begin fun () ->
self.class_type self {ty with pcty_attributes = pcty_attributes'}
end
| None, _ -> super.class_type self ty
end


let handle_debugger loc payload =
match payload with
| Parsetree.PStr ( [])
Expand Down Expand Up @@ -732,6 +750,7 @@ let rec unsafe_mapper : Ast_mapper.mapper =
| _ -> Ast_mapper.default_mapper.expr mapper e
);
typ = (fun self typ -> handle_typ Ast_mapper.default_mapper self typ);
class_type = (fun self ctyp -> handle_ctyp Ast_mapper.default_mapper self ctyp);
structure_item = (fun mapper (str : Parsetree.structure_item) ->
begin match str.pstr_desc with
| Pstr_extension ( ({txt = "bs.raw"; loc}, payload), _attrs)
Expand Down
67 changes: 2 additions & 65 deletions jscomp/test/attr_test.ml
Expand Up @@ -10,78 +10,15 @@ type number = float
class type date =
object [@uncurry]
method toDateString : unit -> string
method toTimeString : unit -> string
method toLocaleString : unit -> string
method toLocaleDateString : unit -> string
method toLocaleTimeString : unit -> string
method valueOf : unit -> number
method getTime : unit -> number
method getFullYear : unit -> number
method getUTCFullYear : unit -> number
method getMonth : unit -> number
method getUTCMonth : unit -> number
method getDate : unit -> number
method getUTCDate : unit -> number
method getDay : unit -> number
method getUTCDay : unit -> number
method getHours : unit -> number
method getUTCHours : unit -> number
method getMinutes : unit -> number
method getUTCMinutes : unit -> number
method getSeconds : unit -> number
method getUTCSeconds : unit -> number
method getMilliseconds : unit -> number
method getUTCMilliseconds : unit -> number
method getTimezoneOffset : unit -> number
method setTime : number -> number

method setMilliseconds : number -> number
method setUTCMilliseconds : number -> number

method setSeconds : number -> number
method setSeconds__2 : number * number -> number

method setUTCSeconds : number -> number
method setUTCSeconds__2 : number * number -> number

method setMinutes : number -> number
method setMinutes__2 : number * number -> number
method setMinutes__3 : number * number * number -> number

method setUTCMinutes : number -> number
method setUTCMinutes__2 : number * number -> number
method setUTCMinutes__3 : number * number * number -> number

method setHours : number -> number
method setHours__2 : number * number -> number
method setHours__3 : number * number * number -> number
method setHours__4 : number * number * number * number -> number

method setUTCHours : number -> number
method setUTCHours__2 : number * number -> number
method setUTCHours__3 : number * number * number -> number
method setUTCHours__4 : number * number * number * number -> number



method setDate : number -> number
method setUTCDate : number -> number
method setMonth : number -> number
method setMonth__2 : number * number -> number
method setUTCMonth : number * number
method setUTCMonth__2 : number * number -> number


method setFullYear : number -> number
method setFullYear__2 : number * number -> number
method setFullYear__3 : number * number * number -> number

method setUTCFullYear : number -> number
method setUTCFullYear__2 : number * number -> number
method setUTCFullYear__3 : number * number * number -> number

method toUTCString : unit -> string
method toISOString : unit -> string
method toJSON__ : unit -> string
method toJSON__1 : 'a -> string
end


100 changes: 39 additions & 61 deletions jscomp/test/demo.ml
@@ -1,8 +1,8 @@
(* open Ui_defs *)


class type widget =
object
method on : string * (event -> unit [@uncurry]) -> unit [@uncurry]
object [@uncurry]
method on : string * (event -> unit ) -> unit
end
and event =
object
Expand All @@ -12,57 +12,55 @@ and event =


class type title =
object
method title__set : string -> unit [@uncurry]
object [@uncurry]
method title__set : string -> unit
method title : string
end

class type text =
object
method text__set : string -> unit [@uncurry]
object [@uncurry]
method text__set : string -> unit
method text : string
end
class type measure =
object
method minHeight__set : int -> unit [@uncurry]
object [@uncurry]
method minHeight__set : int -> unit
method minHeight : int
method minWidth__set : int -> unit [@uncurry]
method minWidth__set : int -> unit
method minWidth : int
method maxHeight__set : int -> unit [@uncurry]
method maxHeight : int [@uncurry]
method maxWidth__set : int -> unit [@uncurry]
method maxHeight__set : int -> unit
method maxHeight : int
method maxWidth__set : int -> unit
method maxWidth : int

end

class type layout =
object
method orientation__set : string -> unit [@uncurry]
object [@uncurry]
method orientation__set : string -> unit
method orientation : string
end

class type applicationContext =
object
method exit : int -> unit [@uncurry]
(* exit'overloading : int -> string -> unit *)
object [@uncurry]
method exit : int -> unit
end
class type contentable =
object
method content__set : #widget Js.t -> unit [@uncurry]
method content : #widget Js.t [@uncurry]
object[@uncurry]
method content__set : #widget Js.t -> unit
method content : #widget Js.t
method contentWidth : int
method contentWidth__set : int -> unit [@uncurry]
method contentWidth__set : int -> unit
end

class type hostedWindow =
object
object [@uncurry]
inherit widget
inherit title
inherit contentable
method show : unit -> unit [@uncurry]
method hide : unit -> unit [@uncurry]
method focus : unit -> unit [@uncurry]
method appContext__set : applicationContext -> unit [@uncurry]
method show : unit -> unit
method hide : unit -> unit
method focus : unit -> unit
method appContext__set : applicationContext -> unit
end

class type hostedContent =
Expand All @@ -73,51 +71,31 @@ class type hostedContent =


class type stackPanel =
object
object [@uncurry]
inherit measure
inherit layout
inherit widget

method addChild : #widget Js.t -> unit [@uncurry]
method addChild : #widget Js.t -> unit

end

(* class type columns = *)
(* object *)
(* method width : int *)
(* end *)
class type any =
object
end

type column
type titleRow




external mk_text : text: 'b -> <text : 'b> = "" [@@bs.obj]
external mk_label : label : 'a -> <label: 'a > = "" [@@bs.obj]
external mk_width : width : 'a -> <width: 'a> = "" [@@bs.obj]
external mk_column : width: int -> unit -> column = "" [@@bs.obj]
external mk_titleRow : title: string -> unit -> titleRow = "" [@@bs.obj]

class type grid =
object
object [@uncurry]
inherit widget
inherit measure
method columns__set : <width : int; .. > array -> unit [@uncurry]
method columns__set : <width : int; .. > Js.t array -> unit
method titleRows__set :
<label : <text : string; .. > ; ..> array -> unit [@uncurry]
<label : <text : string; .. > Js.t ; ..> Js.t array -> unit
method dataSource__set :
<label : <text : string; .. > ; ..> array array -> unit [@uncurry]
<label : <text : string; .. > Js.t ; ..> Js.t array array -> unit
end

external set_interval : (unit -> unit [@uncurry]) -> float -> unit = ""
[@@bs.call "setInterval"] [@@bs.module "@runtime" "Runtime"]
external set_grid_columns : grid -> column array -> unit = "" [@@bs.call "set"]
external set_grid_titleRows : grid -> string array -> unit = "" [@@bs.call "set"]
external to_fixed : float -> int -> string = ""[@@bs.send "toFixed"]
external set_interval : (unit -> unit [@uncurry]) -> float -> unit = "setInterval"
[@@bs.call] [@@bs.module "@runtime" "Runtime"]


external to_fixed : float -> int -> string = "toFixed" [@@bs.send ]

class type button =
object
Expand Down Expand Up @@ -209,8 +187,8 @@ let ui_layout
stackPanel##addChild inputCode;
stackPanel##addChild button;

let mk_titleRow = fun text -> (mk_label ~label:(mk_text ~text )) in
let u = mk_width 200 in
let mk_titleRow text = {label = {text } [@bs.obj] }[@bs.obj] in
let u = {width = 200} [@bs.obj] in
grid##minHeight__set 300;
grid##titleRows__set
[| mk_titleRow "Ticker";
Expand Down
64 changes: 18 additions & 46 deletions lib/js/test/demo.js
@@ -1,10 +1,10 @@
// GENERATED CODE BY BUCKLESCRIPT VERSION 0.5.0 , PLEASE EDIT WITH CARE
'use strict';

var Runtime = require("@runtime");
var UI = require("@ui");
var Curry = require("../curry");
var Runtime = require("@runtime");
var BUI = require("@blp/ui");
var Curry = require("../curry");

var data = /* array */[
/* record */[
Expand Down Expand Up @@ -45,31 +45,22 @@ function ui_layout(compile, lookup, appContext) {
stackPanel.addChild(grid);
stackPanel.addChild(inputCode);
stackPanel.addChild(button);
var mk_titleRow = function (text) {
return {
"label": {
"text": text
}
};
};
var u = {
"width": 200
};
grid.minHeight = 300;
grid.titleRows = /* array */[
{
"label": {
"text": "Ticker"
}
},
{
"label": {
"text": "Bid"
}
},
{
"label": {
"text": "Ask"
}
},
{
"label": {
"text": "Result"
}
}
mk_titleRow("Ticker"),
mk_titleRow("Bid"),
mk_titleRow("Ask"),
mk_titleRow("Result")
];
grid.columns = /* array */[
u,
Expand Down Expand Up @@ -104,30 +95,11 @@ function ui_layout(compile, lookup, appContext) {
"bid": bid,
"ask": ask
});
var text = bid.toFixed(2);
var text$1 = ask.toFixed(2);
var text$2 = result.toFixed(2);
return /* array */[
{
"label": {
"text": param[/* ticker */0]
}
},
{
"label": {
"text": text
}
},
{
"label": {
"text": text$1
}
},
{
"label": {
"text": text$2
}
}
mk_titleRow(param[/* ticker */0]),
mk_titleRow(bid.toFixed(2)),
mk_titleRow(ask.toFixed(2)),
mk_titleRow(result.toFixed(2))
];
});
}, 100);
Expand All @@ -136,4 +108,4 @@ function ui_layout(compile, lookup, appContext) {

exports.data = data;
exports.ui_layout = ui_layout;
/* @runtime Not a pure module */
/* @ui Not a pure module */

0 comments on commit 0023b96

Please sign in to comment.