aboutsummaryrefslogtreecommitdiff
path: root/src/tac2entries.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/tac2entries.ml')
-rw-r--r--src/tac2entries.ml94
1 files changed, 46 insertions, 48 deletions
diff --git a/src/tac2entries.ml b/src/tac2entries.ml
index 1631880c71..e4bddf439b 100644
--- a/src/tac2entries.ml
+++ b/src/tac2entries.ml
@@ -8,6 +8,7 @@
open Pp
open Util
+open CAst
open CErrors
open Names
open Libnames
@@ -277,62 +278,61 @@ let fresh_var avoid x =
in
Namegen.next_ident_away_from (Id.of_string x) bad
-let extract_pattern_type (loc, p as pat) = match p with
+let extract_pattern_type ({loc;v=p} as pat) = match p with
| CPatCnv (pat, ty) -> pat, Some ty
| CPatVar _ | CPatRef _ -> pat, None
(** Mangle recursive tactics *)
let inline_rec_tactic tactics =
- let avoid = List.fold_left (fun accu ((_, id), _) -> Id.Set.add id accu) Id.Set.empty tactics in
- let map (id, e) = match snd e with
+ let avoid = List.fold_left (fun accu ({v=id}, _) -> Id.Set.add id accu) Id.Set.empty tactics in
+ let map (id, e) = match e.v with
| CTacFun (pat, _) -> (id, List.map extract_pattern_type pat, e)
| _ ->
- let loc, _ = id in
- user_err ?loc (str "Recursive tactic definitions must be functions")
+ user_err ?loc:id.loc (str "Recursive tactic definitions must be functions")
in
let tactics = List.map map tactics in
let map (id, pat, e) =
let fold_var (avoid, ans) (pat, _) =
let id = fresh_var avoid "x" in
- let loc = loc_of_patexpr pat in
- (Id.Set.add id avoid, Loc.tag ?loc id :: ans)
+ let loc = pat.loc in
+ (Id.Set.add id avoid, CAst.make ?loc id :: ans)
in
(** Fresh variables to abstract over the function patterns *)
let _, vars = List.fold_left fold_var (avoid, []) pat in
- let map_body ((loc, id), _, e) = (Loc.tag ?loc @@ CPatVar (Name id)), e in
+ let map_body ({loc;v=id}, _, e) = CAst.(make ?loc @@ CPatVar (Name id)), e in
let bnd = List.map map_body tactics in
- let pat_of_id (loc, id) = (Loc.tag ?loc @@ CPatVar (Name id)) in
- let var_of_id (loc, id) =
- let qid = (loc, qualid_of_ident id) in
- Loc.tag ?loc @@ CTacRef (RelId qid)
+ let pat_of_id {loc;v=id} = CAst.make ?loc @@ CPatVar (Name id) in
+ let var_of_id {loc;v=id} =
+ let qid = CAst.make ?loc @@ qualid_of_ident id in
+ CAst.make ?loc @@ CTacRef (RelId qid)
in
- let loc0 = loc_of_tacexpr e in
+ let loc0 = e.loc in
let vpat = List.map pat_of_id vars in
let varg = List.map var_of_id vars in
- let e = Loc.tag ?loc:loc0 @@ CTacLet (true, bnd, Loc.tag ?loc:loc0 @@ CTacApp (var_of_id id, varg)) in
- (id, Loc.tag ?loc:loc0 @@ CTacFun (vpat, e))
+ let e = CAst.make ?loc:loc0 @@ CTacLet (true, bnd, CAst.make ?loc:loc0 @@ CTacApp (var_of_id id, varg)) in
+ (id, CAst.make ?loc:loc0 @@ CTacFun (vpat, e))
in
List.map map tactics
-let check_lowercase (loc, id) =
+let check_lowercase {loc;v=id} =
if Tac2env.is_constructor (Libnames.qualid_of_ident id) then
user_err ?loc (str "The identifier " ++ Id.print id ++ str " must be lowercase")
let register_ltac ?(local = false) ?(mut = false) isrec tactics =
- let map ((loc, na), e) =
+ let map ({loc;v=na}, e) =
let id = match na with
| Anonymous ->
user_err ?loc (str "Tactic definition must have a name")
| Name id -> id
in
- let () = check_lowercase (loc, id) in
- ((loc, id), e)
+ let () = check_lowercase CAst.(make ?loc id) in
+ (CAst.(make ?loc id), e)
in
let tactics = List.map map tactics in
let tactics =
if isrec then inline_rec_tactic tactics else tactics
in
- let map ((loc, id), e) =
+ let map ({loc;v=id}, e) =
let (e, t) = intern ~strict:true e in
let () =
if not (is_value e) then
@@ -360,23 +360,23 @@ let register_ltac ?(local = false) ?(mut = false) isrec tactics =
in
List.iter iter defs
-let qualid_to_ident (loc, qid) =
+let qualid_to_ident {loc;v=qid} =
let (dp, id) = Libnames.repr_qualid qid in
- if DirPath.is_empty dp then (loc, id)
+ if DirPath.is_empty dp then CAst.make ?loc id
else user_err ?loc (str "Identifier expected")
let register_typedef ?(local = false) isrec types =
- let same_name ((_, id1), _) ((_, id2), _) = Id.equal id1 id2 in
+ let same_name ({v=id1}, _) ({v=id2}, _) = Id.equal id1 id2 in
let () = match List.duplicates same_name types with
| [] -> ()
- | ((loc, id), _) :: _ ->
+ | ({loc;v=id}, _) :: _ ->
user_err ?loc (str "Multiple definition of the type name " ++ Id.print id)
in
- let check ((loc, id), (params, def)) =
- let same_name (_, id1) (_, id2) = Id.equal id1 id2 in
+ let check ({loc;v=id}, (params, def)) =
+ let same_name {v=id1} {v=id2} = Id.equal id1 id2 in
let () = match List.duplicates same_name params with
| [] -> ()
- | (loc, id) :: _ ->
+ | {loc;v=id} :: _ ->
user_err ?loc (str "The type parameter " ++ Id.print id ++
str " occurs several times")
in
@@ -409,13 +409,13 @@ let register_typedef ?(local = false) isrec types =
let () = List.iter check types in
let self =
if isrec then
- let fold accu ((_, id), (params, _)) =
+ let fold accu ({v=id}, (params, _)) =
Id.Map.add id (Lib.make_kn id, List.length params) accu
in
List.fold_left fold Id.Map.empty types
else Id.Map.empty
in
- let map ((_, id), def) =
+ let map ({v=id}, def) =
let typdef = {
typdef_local = local;
typdef_expr = intern_typedef self def;
@@ -426,7 +426,7 @@ let register_typedef ?(local = false) isrec types =
let iter (id, def) = ignore (Lib.add_leaf id (inTypDef def)) in
List.iter iter types
-let register_primitive ?(local = false) (loc, id) t ml =
+let register_primitive ?(local = false) {loc;v=id} t ml =
let t = intern_open_type t in
let rec count_arrow = function
| GTypArrow (_, t) -> 1 + count_arrow t
@@ -453,7 +453,7 @@ let register_primitive ?(local = false) (loc, id) t ml =
} in
ignore (Lib.add_leaf id (inTacDef def))
-let register_open ?(local = false) (loc, qid) (params, def) =
+let register_open ?(local = false) {loc;v=qid} (params, def) =
let kn =
try Tac2env.locate_type qid
with Not_found ->
@@ -496,14 +496,13 @@ let register_open ?(local = false) (loc, qid) (params, def) =
let register_type ?local isrec types = match types with
| [qid, true, def] ->
- let (loc, _) = qid in
+ let {loc} = qid in
let () = if isrec then user_err ?loc (str "Extensions cannot be recursive") in
register_open ?local qid def
| _ ->
let map (qid, redef, def) =
- let (loc, _) = qid in
let () = if redef then
- user_err ?loc (str "Types can only be extended one by one")
+ user_err ?loc:qid.loc (str "Types can only be extended one by one")
in
(qualid_to_ident qid, def)
in
@@ -530,26 +529,26 @@ module ParseToken =
struct
let loc_of_token = function
-| SexprStr (loc, _) -> loc
-| SexprInt (loc, _) -> loc
+| SexprStr {loc} -> loc
+| SexprInt {loc} -> loc
| SexprRec (loc, _, _) -> Some loc
let parse_scope = function
-| SexprRec (_, (loc, Some id), toks) ->
+| SexprRec (_, {loc;v=Some id}, toks) ->
if Id.Map.mem id !scope_table then
Id.Map.find id !scope_table toks
else
CErrors.user_err ?loc (str "Unknown scope" ++ spc () ++ Names.Id.print id)
-| SexprStr (_, str) ->
- let v_unit = Loc.tag @@ CTacCst (AbsKn (Tuple 0)) in
+| SexprStr {v=str} ->
+ let v_unit = CAst.make @@ CTacCst (AbsKn (Tuple 0)) in
ScopeRule (Extend.Atoken (Tok.IDENT str), (fun _ -> v_unit))
| tok ->
let loc = loc_of_token tok in
CErrors.user_err ?loc (str "Invalid parsing token")
let parse_token = function
-| SexprStr (_, s) -> TacTerm s
-| SexprRec (_, (_, na), [tok]) ->
+| SexprStr {v=s} -> TacTerm s
+| SexprRec (_, {v=na}, [tok]) ->
let na = match na with None -> Anonymous | Some id -> Name id in
let scope = parse_scope tok in
TacNonTerm (na, scope)
@@ -591,11 +590,10 @@ let perform_notation syn st =
let KRule (rule, act) = get_rule tok in
let mk loc args =
let map (na, e) =
- let loc = loc_of_tacexpr e in
- ((Loc.tag ?loc @@ CPatVar na), e)
+ ((CAst.make ?loc:e.loc @@ CPatVar na), e)
in
let bnd = List.map map args in
- Loc.tag ~loc @@ CTacLet (false, bnd, syn.synext_exp)
+ CAst.make ~loc @@ CTacLet (false, bnd, syn.synext_exp)
in
let rule = Extend.Rule (rule, act mk) in
let lev = match syn.synext_lev with
@@ -659,9 +657,9 @@ let inTac2Abbreviation : abbreviation -> obj =
classify_function = classify_abbreviation}
let register_notation ?(local = false) tkn lev body = match tkn, lev with
-| [SexprRec (_, (loc, Some id), [])], None ->
+| [SexprRec (_, {loc;v=Some id}, [])], None ->
(** Tactic abbreviation *)
- let () = check_lowercase (loc, id) in
+ let () = check_lowercase CAst.(make ?loc id) in
let body = Tac2intern.globalize Id.Set.empty body in
let abbr = { abbr_body = body } in
ignore (Lib.add_leaf id (inTac2Abbreviation abbr))
@@ -780,7 +778,7 @@ let register_struct ?local str = match str with
| StrTyp (isrec, t) -> register_type ?local isrec t
| StrPrm (id, t, ml) -> register_primitive ?local id t ml
| StrSyn (tok, lev, e) -> register_notation ?local tok lev e
-| StrMut (qid, e) -> register_redefinition ?local qid e
+| StrMut (qid, e) -> register_redefinition ?local CAst.(qid.loc, qid.v) e
| StrRun e -> perform_eval e
(** Toplevel exception *)
@@ -876,7 +874,7 @@ let solve default tac =
if not status then Feedback.feedback Feedback.AddedAxiom
let call ~default e =
- let loc = loc_of_tacexpr e in
+ let loc = e.loc in
let (e, t) = intern ~strict:false e in
let () = check_unit ?loc t in
let tac = Tac2interp.interp Tac2interp.empty_environment e in