diff options
author | Takafumi Saikawa <tscompor@gmail.com> | 2022-08-29 15:17:50 +0900 |
---|---|---|
committer | Takafumi Saikawa <tscompor@gmail.com> | 2022-12-27 17:06:56 +0900 |
commit | 5c940ca42fb28b9f9bb2af9747a9230baa5772e3 (patch) | |
tree | 2a50b18dd66db2bdf92250b252418683be8aeb7c /toplevel/topdirs.ml | |
parent | 0f5b57f7935d4de193f1267441d0f2fc17037225 (diff) | |
download | ocaml-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.ml | 60 |
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 |