Skip to content

Commit 6d13754

Browse files
committed
Add accessors for fields of versioned record types.
1 parent c1dd82e commit 6d13754

File tree

6 files changed

+532
-3
lines changed

6 files changed

+532
-3
lines changed

ast/cinaps/gen_versions.ml

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,19 @@ module Signature = struct
6666
Ml.print_labelled_arrow record ~f:string_of_ty
6767
(inst_node "t" ~tvars))))
6868

69+
let declare_accessors decl ~tvars =
70+
let env = Poly_env.uninstantiated tvars in
71+
let string_of_ty ty = Render.string_of_ty ~nodify:true (Poly_env.subst_ty ty ~env) in
72+
match (decl : Astlib.Grammar.decl) with
73+
| Ty _ -> ()
74+
| Record record ->
75+
Print.newline ();
76+
List.iter record ~f:(fun (field, ty) ->
77+
Ml.declare_val
78+
field
79+
(Line (Ml.arrow_type [inst_node "t" ~tvars; string_of_ty ty])))
80+
| Variant _ -> ()
81+
6982
let print decl ~name ~tvars =
7083
Ml.declare_type "t" ~tvars (Line (Ml.poly_type name ~tvars));
7184
Print.newline ();
@@ -90,7 +103,8 @@ module Signature = struct
90103
(inst_node "t" ~tvars)
91104
(inst_node "concrete" ~tvars)));
92105
Print.newline ();
93-
declare_constructors decl ~tvars
106+
declare_constructors decl ~tvars;
107+
declare_accessors decl ~tvars
94108
end
95109

96110
module Structure = struct
@@ -340,6 +354,16 @@ module Structure = struct
340354
Print.println "node = Unversioned.Private.transparent node;");
341355
Print.println "})")))
342356

357+
(* TODO: we can improve runtime performance by only converting the field we need *)
358+
let define_accessors decl =
359+
match (decl : Astlib.Grammar.decl) with
360+
| Ty _ -> ()
361+
| Record record ->
362+
Print.newline ();
363+
List.iter record ~f:(fun (field, _) ->
364+
Print.println "let %s t = (to_concrete t).%s" (Ml.id field) (Ml.id field));
365+
| Variant _ -> ()
366+
343367
let print decl ~node_name ~tvars ~grammar =
344368
Ml.declare_type "t" ~tvars (Line (Ml.poly_type node_name ~tvars));
345369
Print.newline ();
@@ -351,7 +375,8 @@ module Structure = struct
351375
Print.newline ();
352376
define_to_concrete_opt decl ~node_name ~grammar;
353377
Print.newline ();
354-
define_to_concrete ~node_name
378+
define_to_concrete ~node_name;
379+
define_accessors decl
355380
end
356381

357382
module Unversioned = struct

ast/cinaps/ml.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ let declare_type ?(tvars = []) name element =
9292
print_with_element "type %s" (poly_type name ~tvars) ~between:"=" ~element
9393

9494
let declare_val name element =
95-
print_with_element "val %s" name ~between:":" ~element
95+
print_with_element "val %s" (id name) ~between:":" ~element
9696

9797
let print_record_type alist ~f =
9898
List.iteri alist ~f:(fun i (name, x) ->

ast/version_unstable_for_testing.ml

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,11 @@ module Module_binding = struct
210210
node_name = "module_binding";
211211
node = Unversioned.Private.transparent node;
212212
})
213+
214+
let pmb_loc t = (to_concrete t).pmb_loc
215+
let pmb_attributes t = (to_concrete t).pmb_attributes
216+
let pmb_expr t = (to_concrete t).pmb_expr
217+
let pmb_name t = (to_concrete t).pmb_name
213218
end
214219

215220
module Value_binding = struct
@@ -258,6 +263,11 @@ module Value_binding = struct
258263
node_name = "value_binding";
259264
node = Unversioned.Private.transparent node;
260265
})
266+
267+
let pvb_loc t = (to_concrete t).pvb_loc
268+
let pvb_attributes t = (to_concrete t).pvb_attributes
269+
let pvb_expr t = (to_concrete t).pvb_expr
270+
let pvb_pat t = (to_concrete t).pvb_pat
261271
end
262272

263273
module Structure_item_desc = struct
@@ -563,6 +573,9 @@ module Structure_item = struct
563573
node_name = "structure_item";
564574
node = Unversioned.Private.transparent node;
565575
})
576+
577+
let pstr_loc t = (to_concrete t).pstr_loc
578+
let pstr_desc t = (to_concrete t).pstr_desc
566579
end
567580

568581
module Structure = struct
@@ -779,6 +792,10 @@ module Module_expr = struct
779792
node_name = "module_expr";
780793
node = Unversioned.Private.transparent node;
781794
})
795+
796+
let pmod_attributes t = (to_concrete t).pmod_attributes
797+
let pmod_loc t = (to_concrete t).pmod_loc
798+
let pmod_desc t = (to_concrete t).pmod_desc
782799
end
783800

784801
module With_constraint = struct
@@ -978,6 +995,10 @@ module Include_infos = struct
978995
node_name = "include_infos";
979996
node = Unversioned.Private.transparent node;
980997
})
998+
999+
let pincl_attributes t = (to_concrete t).pincl_attributes
1000+
let pincl_loc t = (to_concrete t).pincl_loc
1001+
let pincl_mod t = (to_concrete t).pincl_mod
9811002
end
9821003

9831004
module Open_description = struct
@@ -1026,6 +1047,11 @@ module Open_description = struct
10261047
node_name = "open_description";
10271048
node = Unversioned.Private.transparent node;
10281049
})
1050+
1051+
let popen_attributes t = (to_concrete t).popen_attributes
1052+
let popen_loc t = (to_concrete t).popen_loc
1053+
let popen_override t = (to_concrete t).popen_override
1054+
let popen_lid t = (to_concrete t).popen_lid
10291055
end
10301056

10311057
module Module_type_declaration = struct
@@ -1074,6 +1100,11 @@ module Module_type_declaration = struct
10741100
node_name = "module_type_declaration";
10751101
node = Unversioned.Private.transparent node;
10761102
})
1103+
1104+
let pmtd_loc t = (to_concrete t).pmtd_loc
1105+
let pmtd_attributes t = (to_concrete t).pmtd_attributes
1106+
let pmtd_type t = (to_concrete t).pmtd_type
1107+
let pmtd_name t = (to_concrete t).pmtd_name
10771108
end
10781109

10791110
module Module_declaration = struct
@@ -1122,6 +1153,11 @@ module Module_declaration = struct
11221153
node_name = "module_declaration";
11231154
node = Unversioned.Private.transparent node;
11241155
})
1156+
1157+
let pmd_loc t = (to_concrete t).pmd_loc
1158+
let pmd_attributes t = (to_concrete t).pmd_attributes
1159+
let pmd_type t = (to_concrete t).pmd_type
1160+
let pmd_name t = (to_concrete t).pmd_name
11251161
end
11261162

11271163
module Signature_item_desc = struct
@@ -1393,6 +1429,9 @@ module Signature_item = struct
13931429
node_name = "signature_item";
13941430
node = Unversioned.Private.transparent node;
13951431
})
1432+
1433+
let psig_loc t = (to_concrete t).psig_loc
1434+
let psig_desc t = (to_concrete t).psig_desc
13961435
end
13971436

13981437
module Signature = struct
@@ -1607,6 +1646,10 @@ module Module_type = struct
16071646
node_name = "module_type";
16081647
node = Unversioned.Private.transparent node;
16091648
})
1649+
1650+
let pmty_attributes t = (to_concrete t).pmty_attributes
1651+
let pmty_loc t = (to_concrete t).pmty_loc
1652+
let pmty_desc t = (to_concrete t).pmty_desc
16101653
end
16111654

16121655
module Class_declaration = struct
@@ -1881,6 +1924,10 @@ module Class_field = struct
18811924
node_name = "class_field";
18821925
node = Unversioned.Private.transparent node;
18831926
})
1927+
1928+
let pcf_attributes t = (to_concrete t).pcf_attributes
1929+
let pcf_loc t = (to_concrete t).pcf_loc
1930+
let pcf_desc t = (to_concrete t).pcf_desc
18841931
end
18851932

18861933
module Class_structure = struct
@@ -1923,6 +1970,9 @@ module Class_structure = struct
19231970
node_name = "class_structure";
19241971
node = Unversioned.Private.transparent node;
19251972
})
1973+
1974+
let pcstr_fields t = (to_concrete t).pcstr_fields
1975+
let pcstr_self t = (to_concrete t).pcstr_self
19261976
end
19271977

19281978
module Class_expr_desc = struct
@@ -2138,6 +2188,10 @@ module Class_expr = struct
21382188
node_name = "class_expr";
21392189
node = Unversioned.Private.transparent node;
21402190
})
2191+
2192+
let pcl_attributes t = (to_concrete t).pcl_attributes
2193+
let pcl_loc t = (to_concrete t).pcl_loc
2194+
let pcl_desc t = (to_concrete t).pcl_desc
21412195
end
21422196

21432197
module Class_type_declaration = struct
@@ -2248,6 +2302,13 @@ module Class_infos = struct
22482302
node_name = "class_infos";
22492303
node = Unversioned.Private.transparent node;
22502304
})
2305+
2306+
let pci_attributes t = (to_concrete t).pci_attributes
2307+
let pci_loc t = (to_concrete t).pci_loc
2308+
let pci_expr t = (to_concrete t).pci_expr
2309+
let pci_name t = (to_concrete t).pci_name
2310+
let pci_params t = (to_concrete t).pci_params
2311+
let pci_virt t = (to_concrete t).pci_virt
22512312
end
22522313

22532314
module Class_type_field_desc = struct
@@ -2413,6 +2474,10 @@ module Class_type_field = struct
24132474
node_name = "class_type_field";
24142475
node = Unversioned.Private.transparent node;
24152476
})
2477+
2478+
let pctf_attributes t = (to_concrete t).pctf_attributes
2479+
let pctf_loc t = (to_concrete t).pctf_loc
2480+
let pctf_desc t = (to_concrete t).pctf_desc
24162481
end
24172482

24182483
module Class_signature = struct
@@ -2455,6 +2520,9 @@ module Class_signature = struct
24552520
node_name = "class_signature";
24562521
node = Unversioned.Private.transparent node;
24572522
})
2523+
2524+
let pcsig_fields t = (to_concrete t).pcsig_fields
2525+
let pcsig_self t = (to_concrete t).pcsig_self
24582526
end
24592527

24602528
module Class_type_desc = struct
@@ -2615,6 +2683,10 @@ module Class_type = struct
26152683
node_name = "class_type";
26162684
node = Unversioned.Private.transparent node;
26172685
})
2686+
2687+
let pcty_attributes t = (to_concrete t).pcty_attributes
2688+
let pcty_loc t = (to_concrete t).pcty_loc
2689+
let pcty_desc t = (to_concrete t).pcty_desc
26182690
end
26192691

26202692
module Extension_constructor_kind = struct
@@ -2725,6 +2797,11 @@ module Extension_constructor = struct
27252797
node_name = "extension_constructor";
27262798
node = Unversioned.Private.transparent node;
27272799
})
2800+
2801+
let pext_attributes t = (to_concrete t).pext_attributes
2802+
let pext_loc t = (to_concrete t).pext_loc
2803+
let pext_kind t = (to_concrete t).pext_kind
2804+
let pext_name t = (to_concrete t).pext_name
27282805
end
27292806

27302807
module Type_extension = struct
@@ -2776,6 +2853,12 @@ module Type_extension = struct
27762853
node_name = "type_extension";
27772854
node = Unversioned.Private.transparent node;
27782855
})
2856+
2857+
let ptyext_attributes t = (to_concrete t).ptyext_attributes
2858+
let ptyext_private t = (to_concrete t).ptyext_private
2859+
let ptyext_constructors t = (to_concrete t).ptyext_constructors
2860+
let ptyext_params t = (to_concrete t).ptyext_params
2861+
let ptyext_path t = (to_concrete t).ptyext_path
27792862
end
27802863

27812864
module Constructor_arguments = struct
@@ -2887,6 +2970,12 @@ module Constructor_declaration = struct
28872970
node_name = "constructor_declaration";
28882971
node = Unversioned.Private.transparent node;
28892972
})
2973+
2974+
let pcd_attributes t = (to_concrete t).pcd_attributes
2975+
let pcd_loc t = (to_concrete t).pcd_loc
2976+
let pcd_res t = (to_concrete t).pcd_res
2977+
let pcd_args t = (to_concrete t).pcd_args
2978+
let pcd_name t = (to_concrete t).pcd_name
28902979
end
28912980

28922981
module Label_declaration = struct
@@ -2938,6 +3027,12 @@ module Label_declaration = struct
29383027
node_name = "label_declaration";
29393028
node = Unversioned.Private.transparent node;
29403029
})
3030+
3031+
let pld_attributes t = (to_concrete t).pld_attributes
3032+
let pld_loc t = (to_concrete t).pld_loc
3033+
let pld_type t = (to_concrete t).pld_type
3034+
let pld_mutable t = (to_concrete t).pld_mutable
3035+
let pld_name t = (to_concrete t).pld_name
29413036
end
29423037

29433038
module Type_kind = struct
@@ -3068,6 +3163,15 @@ module Type_declaration = struct
30683163
node_name = "type_declaration";
30693164
node = Unversioned.Private.transparent node;
30703165
})
3166+
3167+
let ptype_loc t = (to_concrete t).ptype_loc
3168+
let ptype_attributes t = (to_concrete t).ptype_attributes
3169+
let ptype_manifest t = (to_concrete t).ptype_manifest
3170+
let ptype_private t = (to_concrete t).ptype_private
3171+
let ptype_kind t = (to_concrete t).ptype_kind
3172+
let ptype_cstrs t = (to_concrete t).ptype_cstrs
3173+
let ptype_params t = (to_concrete t).ptype_params
3174+
let ptype_name t = (to_concrete t).ptype_name
30713175
end
30723176

30733177
module Value_description = struct
@@ -3119,6 +3223,12 @@ module Value_description = struct
31193223
node_name = "value_description";
31203224
node = Unversioned.Private.transparent node;
31213225
})
3226+
3227+
let pval_loc t = (to_concrete t).pval_loc
3228+
let pval_attributes t = (to_concrete t).pval_attributes
3229+
let pval_prim t = (to_concrete t).pval_prim
3230+
let pval_type t = (to_concrete t).pval_type
3231+
let pval_name t = (to_concrete t).pval_name
31223232
end
31233233

31243234
module Case = struct
@@ -3164,6 +3274,10 @@ module Case = struct
31643274
node_name = "case";
31653275
node = Unversioned.Private.transparent node;
31663276
})
3277+
3278+
let pc_rhs t = (to_concrete t).pc_rhs
3279+
let pc_guard t = (to_concrete t).pc_guard
3280+
let pc_lhs t = (to_concrete t).pc_lhs
31673281
end
31683282

31693283
module Expression_desc = struct
@@ -3837,6 +3951,10 @@ module Expression = struct
38373951
node_name = "expression";
38383952
node = Unversioned.Private.transparent node;
38393953
})
3954+
3955+
let pexp_attributes t = (to_concrete t).pexp_attributes
3956+
let pexp_loc t = (to_concrete t).pexp_loc
3957+
let pexp_desc t = (to_concrete t).pexp_desc
38403958
end
38413959

38423960
module Pattern_desc = struct
@@ -4188,6 +4306,10 @@ module Pattern = struct
41884306
node_name = "pattern";
41894307
node = Unversioned.Private.transparent node;
41904308
})
4309+
4310+
let ppat_attributes t = (to_concrete t).ppat_attributes
4311+
let ppat_loc t = (to_concrete t).ppat_loc
4312+
let ppat_desc t = (to_concrete t).ppat_desc
41914313
end
41924314

41934315
module Object_field = struct
@@ -4609,6 +4731,10 @@ module Core_type = struct
46094731
node_name = "core_type";
46104732
node = Unversioned.Private.transparent node;
46114733
})
4734+
4735+
let ptyp_attributes t = (to_concrete t).ptyp_attributes
4736+
let ptyp_loc t = (to_concrete t).ptyp_loc
4737+
let ptyp_desc t = (to_concrete t).ptyp_desc
46124738
end
46134739

46144740
module Payload = struct

0 commit comments

Comments
 (0)