@@ -45,92 +45,104 @@ module Oak = struct
4545 | Rpresent _ -> Ident " row_field.Rpresent"
4646 | Reither _ -> Ident " row_field.Reither"
4747 | Rabsent -> Ident " row_field.Rabsent"
48- let rec mk_type_desc (desc : Types.type_desc ) : oak =
48+
49+ let rec mk_type_desc_cps (desc : Types.type_desc ) (continuation : oak -> oak )
50+ : oak =
4951 match desc with
50- | Tvar var -> (
51- match var with
52- | None -> Application {name = " type_desc.Tvar" ; argument = Ident " None" }
53- | Some s -> Application {name = " type_desc.Tvar" ; argument = Ident s})
52+ | Tvar var ->
53+ continuation
54+ (Application {name = " type_desc.Tvar" ; argument = mk_string_option var})
5455 | Tarrow (_ , t1 , t2 , _ ) ->
55- Application
56- {
57- name = " type_desc.Tarrow" ;
58- argument =
59- Tuple
60- [
61- {name = " t1" ; value = mk_type_desc t1.desc};
62- {name = " t2" ; value = mk_type_desc t2.desc};
63- ];
64- }
65- | Ttuple _ -> Ident " type_desc.Ttuple"
56+ mk_type_desc_cps t1.desc (fun t1_result ->
57+ mk_type_desc_cps t2.desc (fun t2_result ->
58+ continuation
59+ (Application
60+ {
61+ name = " type_desc.Tarrow" ;
62+ argument =
63+ Tuple
64+ [
65+ {name = " t1" ; value = t1_result};
66+ {name = " t2" ; value = t2_result};
67+ ];
68+ })))
69+ | Ttuple _ -> continuation (Ident " type_desc.Ttuple" )
6670 | Tconstr (path , ts , _ ) ->
6771 let ts =
68- ts |> List. map (fun (t : Types.type_expr ) -> mk_type_desc t.desc)
72+ List. map
73+ (fun (t : Types.type_expr ) -> mk_type_desc_cps t.desc (fun t -> t))
74+ ts
6975 in
70- Application
71- {
72- name = " type_desc.Tconstr" ;
73- argument =
74- Tuple
75- [
76- {name = " path" ; value = Ident (path_to_string path)};
77- {name = " ts" ; value = List ts};
78- ];
79- }
80- | Tobject _ -> Ident " type_desc.Tobject"
81- | Tfield _ -> Ident " type_desc.Tfield"
82- | Tnil -> Ident " type_desc.Tnil"
76+ continuation
77+ (Application
78+ {
79+ name = " type_desc.Tconstr" ;
80+ argument =
81+ Tuple
82+ [
83+ {name = " path" ; value = Ident (path_to_string path)};
84+ {name = " ts" ; value = List ts};
85+ ];
86+ })
87+ | Tobject _ -> continuation (Ident " type_desc.Tobject" )
88+ | Tfield _ -> continuation (Ident " type_desc.Tfield" )
89+ | Tnil -> continuation (Ident " type_desc.Tnil" )
8390 | Tlink {desc} ->
84- Application {name = " type_desc.Tlink" ; argument = mk_type_desc desc}
85- | Tsubst _ -> Ident " type_desc.Tsubst"
91+ mk_type_desc_cps desc (fun result ->
92+ continuation
93+ (Application {name = " type_desc.Tlink" ; argument = result}))
94+ | Tsubst _ -> continuation (Ident " type_desc.Tsubst" )
8695 | Tvariant row_descr ->
87- Application
88- {name = " type_desc.Tvariant" ; argument = mk_row_desc row_descr}
89- | Tunivar _ -> Ident " type_desc.Tunivar"
90- | Tpoly _ -> Ident " type_desc.Tpoly"
91- | Tpackage _ -> Ident " type_desc.Tpackage"
92-
93- and mk_row_desc (row_desc : Types.row_desc ) : oak =
94- let fields =
95- [
96- {
97- name = " row_fields" ;
98- value =
99- ( row_desc.row_fields
100- |> List. map (fun (label , row_field ) ->
101- Tuple
102- [
103- {name = " label" ; value = Ident label};
104- {name = " row_field" ; value = mk_row_field row_field};
105- ])
106- |> fun ts -> List ts );
107- };
108- {name = " row_more" ; value = mk_type_desc row_desc.row_more.desc};
109- {name = " row_closed" ; value = mk_bool row_desc.row_closed};
110- {name = " row_fixed" ; value = mk_bool row_desc.row_fixed};
111- ]
112- in
113- match row_desc.row_name with
114- | None -> Record fields
115- | Some (path , ts ) ->
116- Record
117- ({
118- name = " row_name" ;
96+ continuation
97+ (Application {name = " type_desc.Tvariant" ; argument = Ident " row_descr" })
98+ | Tunivar _ -> continuation (Ident " type_desc.Tunivar" )
99+ | Tpoly _ -> continuation (Ident " type_desc.Tpoly" )
100+ | Tpackage _ -> continuation (Ident " type_desc.Tpackage" )
101+
102+ let mk_type_desc (desc : Types.type_desc ) : oak =
103+ mk_type_desc_cps desc (fun result -> result)
104+
105+ (* and mk_row_desc (row_desc : Types.row_desc) : oak =
106+ let fields =
107+ [
108+ {
109+ name = "row_fields";
119110 value =
120- Tuple
121- [
122- {name = " Path.t" ; value = Ident (path_to_string path)};
123- {
124- name = " fields" ;
125- value =
126- List
127- (ts
128- |> List. map (fun (t : Types.type_expr ) ->
129- mk_type_desc t.desc));
130- };
131- ];
132- }
133- :: fields)
111+ ( row_desc.row_fields
112+ |> List.map (fun (label, row_field) ->
113+ Tuple
114+ [
115+ {name = "label"; value = Ident label};
116+ {name = "row_field"; value = mk_row_field row_field};
117+ ])
118+ |> fun ts -> List ts );
119+ };
120+ {name = "row_more"; value = mk_type_desc row_desc.row_more.desc};
121+ {name = "row_closed"; value = mk_bool row_desc.row_closed};
122+ {name = "row_fixed"; value = mk_bool row_desc.row_fixed};
123+ ]
124+ in
125+ match row_desc.row_name with
126+ | None -> Record fields
127+ | Some (path, ts) ->
128+ Record
129+ ({
130+ name = "row_name";
131+ value =
132+ Tuple
133+ [
134+ {name = "Path.t"; value = Ident (path_to_string path)};
135+ {
136+ name = "fields";
137+ value =
138+ List
139+ (ts
140+ |> List.map (fun (t : Types.type_expr) ->
141+ mk_type_desc t.desc));
142+ };
143+ ];
144+ }
145+ :: fields) *)
134146
135147 let mk_package (package : SharedTypes.package ) : oak =
136148 Record
0 commit comments