aboutsummaryrefslogtreecommitdiffhomepage
path: root/printing
diff options
context:
space:
mode:
authorGravatar Pierre-Marie Pédrot <pierre-marie.pedrot@inria.fr>2016-05-08 17:59:03 +0200
committerGravatar Pierre-Marie Pédrot <pierre-marie.pedrot@inria.fr>2016-05-08 21:52:54 +0200
commitd865cdb55e4cd4334e4eff165cd7b69474a28fe1 (patch)
tree9ede42f49502ad91209ab359fdbe371347753489 /printing
parentf8cfdd5c18441381bd8afbb43c5a32a269e2a30c (diff)
Actually using the symbol information to print Tactic Notations properly.
Diffstat (limited to 'printing')
-rw-r--r--printing/pptactic.ml126
1 files changed, 75 insertions, 51 deletions
diff --git a/printing/pptactic.ml b/printing/pptactic.ml
index 5cc52d203..44c832bd7 100644
--- a/printing/pptactic.ml
+++ b/printing/pptactic.ml
@@ -340,40 +340,22 @@ module Make
with Not_found -> Genprint.generic_glb_print (in_gen (glbwit wit) x)
let rec tacarg_using_rule_token pr_gen = function
- | TacTerm s :: l, al -> keyword s :: tacarg_using_rule_token pr_gen (l,al)
- | TacNonTerm _ :: l, a :: al ->
- let r = tacarg_using_rule_token pr_gen (l,al) in
- pr_gen a :: r
- | [], [] -> []
- | _ -> failwith "Inconsistent arguments of extended tactic"
-
- let rec argument_of_symbol = function
- | Extend.Ulist1 s | Extend.Ulist0 s
- | Extend.Ulist1sep (s, _) | Extend.Ulist0sep (s, _) ->
- let ArgumentType t = argument_of_symbol s in
- ArgumentType (ListArg t)
- | Extend.Uopt s ->
- let ArgumentType t = argument_of_symbol s in
- ArgumentType (OptArg t)
- | Extend.Uentry s | Extend.Uentryl (s, _) ->
- let ArgT.Any tag = s in
- ArgumentType (ExtraArg tag)
-
- let filter_arg = function
- | TacTerm _ -> None
- | TacNonTerm (_, s, _) -> Some (argument_of_symbol s)
+ | [] -> []
+ | TacTerm s :: l -> keyword s :: tacarg_using_rule_token pr_gen l
+ | TacNonTerm (_, (symb, arg), _) :: l ->
+ pr_gen symb arg :: tacarg_using_rule_token pr_gen l
let pr_tacarg_using_rule pr_gen l =
let l = match l with
- | (TacTerm s :: l, al) ->
+ | TacTerm s :: l ->
(** First terminal token should be considered as the name of the tactic,
so we tag it differently than the other terminal tokens. *)
- primitive s :: (tacarg_using_rule_token pr_gen (l, al))
+ primitive s :: tacarg_using_rule_token pr_gen l
| _ -> tacarg_using_rule_token pr_gen l
in
pr_sequence (fun x -> x) l
- let pr_extend_gen check pr_gen lev { mltac_name = s; mltac_index = i } l =
+ let pr_extend_gen pr_gen lev { mltac_name = s; mltac_index = i } l =
let name =
str s.mltac_plugin ++ str "::" ++ str s.mltac_tactic ++
str "@" ++ int i
@@ -384,31 +366,82 @@ module Make
in
str "<" ++ name ++ str ">" ++ args
- let pr_alias_gen check pr_gen lev key l =
+ let pr_alias_gen pr_gen lev key l =
try
let pp = KNmap.find key !prnotation_tab in
- let args = List.map_filter filter_arg pp.pptac_prods in
- let () = if not (List.for_all2eq check args l) then raise Not_found in
- let p = pr_tacarg_using_rule pr_gen (pp.pptac_prods, l) in
+ let rec pack prods args = match prods, args with
+ | [], [] -> []
+ | TacTerm s :: prods, args -> TacTerm s :: pack prods args
+ | TacNonTerm (loc, symb, id) :: prods, arg :: args ->
+ TacNonTerm (loc, (symb, arg), id) :: pack prods args
+ | _ -> raise Not_found
+ in
+ let prods = pack pp.pptac_prods l in
+ let p = pr_tacarg_using_rule pr_gen prods in
if pp.pptac_level > lev then surround p else p
with Not_found ->
- KerName.print key ++ spc() ++ pr_sequence pr_gen l ++ str" (* Generic printer *)"
-
- let check_type t arg = match arg with
- | TacGeneric arg -> argument_type_eq t (genarg_tag arg)
- | _ -> argument_type_eq t (ArgumentType wit_tactic)
+ let pr arg = str "_" in
+ KerName.print key ++ spc() ++ pr_sequence pr l ++ str" (* Generic printer *)"
let pr_farg prtac arg = prtac (1, Any) (TacArg (Loc.ghost, arg))
+ let is_genarg tag wit =
+ let ArgT.Any tag = tag in
+ argument_type_eq (ArgumentType (ExtraArg tag)) wit
+
+ let get_list : type l. l generic_argument -> l generic_argument list option =
+ function (GenArg (wit, arg)) -> match wit with
+ | Rawwit (ListArg wit) -> Some (List.map (in_gen (rawwit wit)) arg)
+ | Glbwit (ListArg wit) -> Some (List.map (in_gen (glbwit wit)) arg)
+ | _ -> None
+
+ let get_opt : type l. l generic_argument -> l generic_argument option option =
+ function (GenArg (wit, arg)) -> match wit with
+ | Rawwit (OptArg wit) -> Some (Option.map (in_gen (rawwit wit)) arg)
+ | Glbwit (OptArg wit) -> Some (Option.map (in_gen (glbwit wit)) arg)
+ | _ -> None
+
+ let rec pr_any_arg : type l. (_ -> l generic_argument -> std_ppcmds) -> _ -> l generic_argument -> std_ppcmds =
+ fun prtac symb arg -> match symb with
+ | Extend.Uentry tag when is_genarg tag (genarg_tag arg) -> prtac (1, Any) arg
+ | Extend.Ulist1 s | Extend.Ulist0 s ->
+ begin match get_list arg with
+ | None -> str "ltac:(" ++ prtac (1, Any) arg ++ str ")"
+ | Some l -> pr_sequence (pr_any_arg prtac s) l
+ end
+ | Extend.Ulist1sep (s, sep) | Extend.Ulist0sep (s, sep) ->
+ begin match get_list arg with
+ | None -> str "ltac:(" ++ prtac (1, Any) arg ++ str ")"
+ | Some l -> prlist_with_sep (fun () -> str sep) (pr_any_arg prtac s) l
+ end
+ | Extend.Uopt s ->
+ begin match get_opt arg with
+ | None -> str "ltac:(" ++ prtac (1, Any) arg ++ str ")"
+ | Some l -> pr_opt (pr_any_arg prtac s) l
+ end
+ | Extend.Uentry _ | Extend.Uentryl _ ->
+ str "ltac:(" ++ prtac (1, Any) arg ++ str ")"
+
+ let rec pr_targ prtac symb arg = match symb with
+ | Extend.Uentry tag when is_genarg tag (ArgumentType wit_tactic) ->
+ prtac (1, Any) arg
+ | Extend.Uentryl (_, l) -> prtac (l, Any) arg
+ | _ ->
+ match arg with
+ | TacGeneric arg ->
+ let pr l arg = prtac l (TacGeneric arg) in
+ pr_any_arg pr symb arg
+ | _ -> str "ltac:(" ++ prtac (1, Any) arg ++ str ")"
+
let pr_raw_extend_rec prc prlc prtac prpat =
- pr_extend_gen check_type (pr_farg prtac)
+ pr_extend_gen (pr_farg prtac)
let pr_glob_extend_rec prc prlc prtac prpat =
- pr_extend_gen check_type (pr_farg prtac)
+ pr_extend_gen (pr_farg prtac)
- let pr_raw_alias prc prlc prtac prpat =
- pr_alias_gen check_type (pr_farg prtac)
- let pr_glob_alias prc prlc prtac prpat =
- pr_alias_gen check_type (pr_farg prtac)
+ let pr_raw_alias prc prlc prtac prpat lev key args =
+ pr_alias_gen (pr_targ (fun l a -> prtac l (TacArg (Loc.ghost, a)))) lev key args
+ let pr_glob_alias prc prlc prtac prpat lev key args =
+ pr_alias_gen (pr_targ (fun l a -> prtac l (TacArg (Loc.ghost, a)))) lev key args
(**********************************************************************)
(* The tactic printer *)
@@ -1279,20 +1312,11 @@ module Make
(pr_and_constr_expr (pr_glob_constr_env env)) (pr_and_constr_expr (pr_lglob_constr_env env))
(pr_glob_tactic_level env) (pr_pat_and_constr_expr (pr_glob_constr_env env))
- let check_val_type t arg =
- let ArgumentType t = t in
-(* let t = Genarg.val_tag (Obj.magic t) in *)
-(* let Val.Dyn (t', _) = arg in *)
-(* match Genarg.Val.eq t t' with *)
-(* | None -> false *)
-(* | Some _ -> true *)
- true (** FIXME *)
-
let pr_alias pr lev key args =
- pr_alias_gen check_val_type pr lev key args
+ pr_alias_gen (fun _ arg -> pr arg) lev key args
let pr_extend pr lev ml args =
- pr_extend_gen check_val_type pr lev ml args
+ pr_extend_gen pr lev ml args
let pr_atomic_tactic env = pr_atomic_tactic_level env ltop