summaryrefslogtreecommitdiff
path: root/toplevel/topdirs.ml
diff options
context:
space:
mode:
authorTakafumi Saikawa <tscompor@gmail.com>2022-08-29 15:17:50 +0900
committerTakafumi Saikawa <tscompor@gmail.com>2022-12-27 17:06:56 +0900
commit5c940ca42fb28b9f9bb2af9747a9230baa5772e3 (patch)
tree2a50b18dd66db2bdf92250b252418683be8aeb7c /toplevel/topdirs.ml
parent0f5b57f7935d4de193f1267441d0f2fc17037225 (diff)
downloadocaml-5c940ca42fb28b9f9bb2af9747a9230baa5772e3.tar.gz
Introduce wrapper functions for level management ([Ctype.wrap_def], etc)
and for type variable scoping ([Typetexp.wrap_type_variable_scope]). The older API ([Ctype.(begin_def,end_def)], [Typetexp.(narrow,widen)], etc.) is now removed. The scope of some level management is refined (in particular for [type_application]).
Diffstat (limited to 'toplevel/topdirs.ml')
-rw-r--r--toplevel/topdirs.ml60
1 files changed, 30 insertions, 30 deletions
diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml
index 1d92cb65dd..4529a1cf00 100644
--- a/toplevel/topdirs.ml
+++ b/toplevel/topdirs.ml
@@ -231,43 +231,43 @@ let match_simple_printer_type desc ~is_old_style =
then Topprinters.printer_type_old
else Topprinters.printer_type_new
in
- Ctype.begin_def();
- let ty_arg = Ctype.newvar() in
- match
- Ctype.unify !toplevel_env
- (make_printer_type ty_arg)
- (Ctype.instance desc.val_type);
- with
- | exception Ctype.Unify _ -> None
- | () ->
- Ctype.end_def();
- Ctype.generalize ty_arg;
- if is_old_style
- then Some (Printer.Old ty_arg)
- else Some (Printer.Simple ty_arg)
+ match
+ Ctype.wrap_def ~post:Ctype.generalize begin fun () ->
+ let ty_arg = Ctype.newvar() in
+ Ctype.unify !toplevel_env
+ (make_printer_type ty_arg)
+ (Ctype.instance desc.val_type);
+ ty_arg
+ end
+ with
+ | exception Ctype.Unify _ -> None
+ | ty_arg ->
+ if is_old_style
+ then Some (Printer.Old ty_arg)
+ else Some (Printer.Simple ty_arg)
let match_generic_printer_type desc ty_path args =
let make_printer_type = Topprinters.printer_type_new in
- Ctype.begin_def();
- let args = List.map (fun _ -> Ctype.newvar ()) args in
- let ty_target = Ctype.newty (Tconstr (ty_path, args, ref Mnil)) in
- let printer_args_ty =
- List.map (fun ty_var -> make_printer_type ty_var) args in
- let ty_expected =
- List.fold_right Topprinters.type_arrow
- printer_args_ty (make_printer_type ty_target) in
match
- Ctype.unify !toplevel_env
+ Ctype.wrap_def ~post:generalize begin fun () ->
+ let args = List.map (fun _ -> Ctype.newvar ()) args in
+ let ty_target = Ctype.newty (Tconstr (ty_path, args, ref Mnil)) in
+ let printer_args_ty =
+ List.map (fun ty_var -> make_printer_type ty_var) args in
+ let ty_expected =
+ List.fold_right Topprinters.type_arrow
+ printer_args_ty (make_printer_type ty_target) in
+ Ctype.unify !toplevel_env
+ ty_expected
+ (Ctype.instance desc.val_type);
ty_expected
- (Ctype.instance desc.val_type);
+ end
with
| exception Ctype.Unify _ -> None
- | _ ->
- Ctype.end_def();
- Ctype.generalize ty_expected;
- if Ctype.all_distinct_vars !toplevel_env args
- then Some ()
- else None
+ | ty_expected ->
+ if Ctype.all_distinct_vars !toplevel_env args
+ then Some ()
+ else None
let match_printer_type desc =
match match_simple_printer_type desc ~is_old_style:false with