diff --git a/src/core/dterm.ml b/src/core/dterm.ml index 6f31768fe8226322a2a022b5aaa56e072a2d77a2..e8b156c3899c788f990df5ebb4bd4f1eafe08c43 100644 --- a/src/core/dterm.ml +++ b/src/core/dterm.ml @@ -124,16 +124,17 @@ let rec print_dty ht pri fmt = function Format.fprintf fmt "(%a)" (Pp.print_list Pp.comma (print_dty ht 0)) dl | Dapp (ts,[]) -> - Pretty.print_ts fmt ts + Pretty.print_ts_qualified fmt ts | Dapp (ts,dl) -> Format.fprintf fmt (protect_on (pri > 1) "%a@ %a") - Pretty.print_ts ts (Pp.print_list Pp.space (print_dty ht 2)) dl + Pretty.print_ts_qualified ts + (Pp.print_list Pp.space (print_dty ht 2)) dl | Duty ({ty_node = Tyapp (ts,(_::_))} as ty) when (pri > 1 && not (is_ts_tuple ts)) || (pri = 1 && ts_equal ts Ty.ts_func) -> - Format.fprintf fmt "(%a)" Pretty.print_ty ty + Format.fprintf fmt "(%a)" Pretty.print_ty_qualified ty | Duty ty -> - Pretty.print_ty fmt ty + Pretty.print_ty_qualified fmt ty let print_dty = let ht = Hint.create 3 in fun fmt dty -> print_dty ht 0 fmt dty diff --git a/src/core/pretty.ml b/src/core/pretty.ml index a1371ce3e286b5e6bafd86fa729f73086becec9c..e71ead90f2e1430beae2056d7462a3168043a531 100644 --- a/src/core/pretty.ml +++ b/src/core/pretty.ml @@ -53,6 +53,13 @@ module type Printer = sig val print_ty : formatter -> ty -> unit (* type *) val print_vsty : formatter -> vsymbol -> unit (* variable : type *) + val print_ts_qualified : formatter -> tysymbol -> unit + val print_ls_qualified : formatter -> lsymbol -> unit + val print_cs_qualified : formatter -> lsymbol -> unit + val print_pr_qualified : formatter -> prsymbol -> unit + val print_th_qualified : formatter -> theory -> unit + val print_ty_qualified : formatter -> ty -> unit + val print_quant : formatter -> quant -> unit (* quantifier *) val print_binop : asym:bool -> formatter -> binop -> unit (* binary operator *) val print_pat : formatter -> pattern -> unit (* pattern *) @@ -86,9 +93,7 @@ module type Printer = sig end -let debug_print_attrs = - Debug.register_info_flag - "print_attributes" +let debug_print_attrs = Debug.register_info_flag "print_attributes" ~desc:"Print@ attributes@ of@ identifiers@ and@ expressions." let debug_print_locs = Debug.register_info_flag "print_locs" @@ -97,6 +102,10 @@ let debug_print_locs = Debug.register_info_flag "print_locs" let debug_print_coercions = Debug.register_info_flag "print_coercions" ~desc:"Print@ coercions@ in@ logical@ formulas." +(* always print qualified? +let debug_print_qualifs = Debug.register_info_flag "print_qualifs" + ~desc:"Print@ qualifiers@ of@ identifiers@ in@ error@ messages."*) + let create sprinter aprinter tprinter pprinter do_forget_all = (module (struct @@ -154,31 +163,102 @@ let print_ls fmt ls = let print_pr fmt pr = Ident.print_decoded fmt (id_unique pprinter pr.pr_name) +let print_library_path fmt lp = + let str fmt s = + if String.contains s ' ' || String.contains s '.' then begin + pp_print_char fmt '"'; pp_print_string fmt s; pp_print_char fmt '"' + end else pp_print_string fmt s in + let dot fmt () = + pp_print_char fmt '.'; pp_print_cut fmt () in + if lp <> [] then begin + print_list dot str fmt lp; dot fmt () + end + +let print_qualified_name fmt qn = + let dot fmt () = + pp_print_char fmt '.'; pp_print_cut fmt () in + if qn <> [] then begin + dot fmt (); print_list dot pp_print_string fmt qn + end + +let print_decoded_name fmt qn = + match List.rev qn with + | sn::qn -> + print_qualified_name fmt (List.rev qn); + pp_print_char fmt '.'; pp_print_cut fmt (); + Ident.print_decoded fmt sn + | [] -> () + +let print_th_qualified fmt th = +(* if Debug.test_flag debug_print_qualifs then begin *) + try + let lp,tn,_ = Theory.restore_path th.th_name in + fprintf fmt "%a%s" print_library_path lp tn + with Not_found -> print_th fmt th +(* end else print_th fmt th *) + +let print_ts_qualified fmt ts = + if ts_equal ts ts_func then pp_print_string fmt "(->)" else +(* if Debug.test_flag debug_print_qualifs then begin *) + try + let lp,tn,qn = Theory.restore_path ts.ts_name in + fprintf fmt "%a%s%a" print_library_path lp tn print_qualified_name qn + with Not_found -> print_ts fmt ts +(* end else print_ts fmt ts *) + +let print_cs_qualified fmt ls = +(* if Debug.test_flag debug_print_qualifs then begin *) + try + let lp,tn,qn = Theory.restore_path ls.ls_name in + fprintf fmt "%a%s%a" print_library_path lp tn print_qualified_name qn + with Not_found -> print_cs fmt ls +(* end else print_cs fmt ls *) + +let print_ls_qualified fmt ls = +(* if Debug.test_flag debug_print_qualifs then begin *) + try + let lp,tn,qn = Theory.restore_path ls.ls_name in + fprintf fmt "%a%s%a" print_library_path lp tn print_decoded_name qn + with Not_found -> print_ls fmt ls +(* end else print_ls fmt ls *) + +let print_pr_qualified fmt pr = +(* if Debug.test_flag debug_print_qualifs then begin *) + try + let lp,tn,qn = Theory.restore_path pr.pr_name in + fprintf fmt "%a%s%a" print_library_path lp tn print_decoded_name qn + with Not_found -> print_pr fmt pr +(* end else print_pr fmt pr *) + (** Types *) let protect_on x s = if x then "(" ^^ s ^^ ")" else s -let rec print_ty_node pri fmt ty = match ty.ty_node with +let rec print_ty_node q pri fmt ty = match ty.ty_node with | Tyvar v -> print_tv fmt v | Tyapp (ts, [t1;t2]) when ts_equal ts Ty.ts_func -> fprintf fmt (protect_on (pri > 0) "%a@ ->@ %a") - (print_ty_node 1) t1 (print_ty_node 0) t2 + (print_ty_node q 1) t1 (print_ty_node q 0) t2 | Tyapp (ts, []) when is_ts_tuple ts -> fprintf fmt "unit" | Tyapp (ts, tl) when is_ts_tuple ts -> - fprintf fmt "(%a)" (print_list comma (print_ty_node 0)) tl - | Tyapp (ts, []) -> print_ts fmt ts + fprintf fmt "(%a)" (print_list comma (print_ty_node q 0)) tl + | Tyapp (ts, []) -> + if q then print_ts_qualified fmt ts else print_ts fmt ts | Tyapp (ts, tl) -> fprintf fmt (protect_on (pri > 1) "%a@ %a") - print_ts ts (print_list space (print_ty_node 2)) tl + (if q then print_ts_qualified else print_ts) ts + (print_list space (print_ty_node q 2)) tl + +let print_ty fmt ty = print_ty_node false 0 fmt ty -let print_ty fmt ty = print_ty_node 0 fmt ty +let print_ty_qualified fmt ty = print_ty_node true 0 fmt ty let print_vsty fmt v = fprintf fmt "%a%a:@,%a" print_vs v print_id_attrs v.vs_name print_ty v.vs_ty let print_tv_arg fmt tv = fprintf fmt "@ %a" print_tv tv -let print_ty_arg fmt ty = fprintf fmt "@ %a" (print_ty_node 2) ty +let print_ty_arg fmt ty = fprintf fmt "@ %a" (print_ty_node false 2) ty let print_vs_arg fmt vs = fprintf fmt "@ (%a)" print_vsty vs (* can the type of a value be derived from the type of the arguments? *) @@ -654,7 +734,7 @@ let () = Exn_printer.register begin fun fmt exn -> match exn with | Ty.TypeMismatch (t1,t2) -> fprintf fmt "Type mismatch between %a and %a" - print_ty t1 print_ty t2 + print_ty_qualified t1 print_ty_qualified t2 | Ty.BadTypeArity ({ts_args = []} as ts, _) -> fprintf fmt "Type symbol %a expects no arguments" print_ts ts | Ty.BadTypeArity (ts, app_arg) -> diff --git a/src/core/pretty.mli b/src/core/pretty.mli index ab4622ce6cffc750a6704744b88bac9519b001d6..870dc5d29f17e7234daeed28304fa697c204029d 100644 --- a/src/core/pretty.mli +++ b/src/core/pretty.mli @@ -48,6 +48,13 @@ module type Printer = sig val print_ty : formatter -> ty -> unit (* type *) val print_vsty : formatter -> vsymbol -> unit (* variable : type *) + val print_ts_qualified : formatter -> tysymbol -> unit + val print_ls_qualified : formatter -> lsymbol -> unit + val print_cs_qualified : formatter -> lsymbol -> unit + val print_pr_qualified : formatter -> prsymbol -> unit + val print_th_qualified : formatter -> theory -> unit + val print_ty_qualified : formatter -> ty -> unit + val print_quant : formatter -> quant -> unit (* quantifier *) val print_binop : asym:bool -> formatter -> binop -> unit (* binary operator *) val print_pat : formatter -> pattern -> unit (* pattern *) diff --git a/src/mlw/dexpr.ml b/src/mlw/dexpr.ml index bfc7822d278d8f3a394332548860d91428a208b8..26e4f20caf53d4249230354449d6faa3959ddaec 100644 --- a/src/mlw/dexpr.ml +++ b/src/mlw/dexpr.ml @@ -263,7 +263,7 @@ let rec print_dity pur pri fmt = function | Durg (Dapp (s,tl,rl),{reg_name = id}) -> Format.fprintf fmt (protect_on (pri > 1 && (tl <> [] || rl <> [])) "%a%a%a@ @@%s") - Pretty.print_ts s.its_ts (print_args (print_dity pur 2)) tl + Pretty.print_ts_qualified s.its_ts (print_args (print_dity pur 2)) tl (print_regs (print_dity pur 0)) rl (Ident.id_unique rprinter id) | Dvar {contents = Dreg _} | Durg _ -> assert false | Dapp (s,[t1;t2],[]) when its_equal s its_func -> @@ -273,16 +273,16 @@ let rec print_dity pur pri fmt = function Format.fprintf fmt "(%a)" (Pp.print_list Pp.comma (print_dity pur 0)) tl | Dapp (s,tl,_) when pur -> Format.fprintf fmt (protect_on (pri > 1 && tl <> []) "%a%a") - Pretty.print_ts s.its_ts (print_args (print_dity pur 2)) tl + Pretty.print_ts_qualified s.its_ts (print_args (print_dity pur 2)) tl | Dapp (s,tl,rl) when not s.its_mutable -> Format.fprintf fmt (protect_on (pri > 1 && (tl <> [] || rl <> [])) "%a%a%a") - Pretty.print_ts s.its_ts (print_args (print_dity pur 2)) tl + Pretty.print_ts_qualified s.its_ts (print_args (print_dity pur 2)) tl (print_regs (print_dity pur 0)) rl | Dapp (s,tl,rl) -> Format.fprintf fmt (protect_on (pri > 1 && (tl <> [] || rl <> [])) "{%a}%a%a") - Pretty.print_ts s.its_ts (print_args (print_dity pur 2)) tl + Pretty.print_ts_qualified s.its_ts (print_args (print_dity pur 2)) tl (print_regs (print_dity pur 0)) rl let print_dity fmt d = print_dity false 0 fmt d