aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--interp/constrintern.ml12
-rw-r--r--lib/util.ml14
-rw-r--r--lib/util.mli1
-rw-r--r--library/libnames.ml6
-rw-r--r--library/libnames.mli1
5 files changed, 26 insertions, 8 deletions
diff --git a/interp/constrintern.ml b/interp/constrintern.ml
index 98919082d..9e6cbaf44 100644
--- a/interp/constrintern.ml
+++ b/interp/constrintern.ml
@@ -140,12 +140,12 @@ let coqdoc_unfreeze (lt,tn,lp) =
let add_glob loc ref =
let sp = Nametab.sp_of_global ref in
- let modqid,id = repr_path sp in
- let file_prefix_length = List.length (repr_dirpath (Lib.library_dp())) in
- let file,fields = chop_dirpath file_prefix_length modqid in
- let filepath = string_of_dirpath file in
- let modpath = string_of_qualid (make_qualid fields id) in
- dump_string (Printf.sprintf "R%d %s.%s\n" (fst (unloc loc)) filepath modpath)
+ let lib_dp = Lib.library_dp() in
+ let mod_dp,id = repr_path sp in
+ let mod_dp_trunc = drop_dirpath_prefix lib_dp mod_dp in
+ let filepath = string_of_dirpath lib_dp in
+ let fullname = string_of_qualid (make_qualid mod_dp_trunc id) in
+ dump_string (Printf.sprintf "R%d %s.%s\n" (fst (unloc loc)) filepath fullname)
let loc_of_notation f loc args ntn =
if args=[] or ntn.[0] <> '_' then fst (unloc loc)
diff --git a/lib/util.ml b/lib/util.ml
index 04086e20f..a9d9655ed 100644
--- a/lib/util.ml
+++ b/lib/util.ml
@@ -363,7 +363,19 @@ let list_prefix_of prefl l =
| ([], _) -> true
| (_, _) -> false
in
- prefrec (prefl,l)
+ prefrec (prefl,l)
+
+let list_drop_prefix p l =
+(* if l=p++t then return t else l *)
+ let rec list_drop_prefix_rec = function
+ | ([], tl) -> Some tl
+ | (_, []) -> None
+ | (h1::tp, h2::tl) ->
+ if h1 = h2 then list_drop_prefix_rec (tp,tl) else None
+ in
+ match list_drop_prefix_rec (p,l) with
+ | Some r -> r
+ | None -> l
let list_map_append f l = List.flatten (List.map f l)
diff --git a/lib/util.mli b/lib/util.mli
index ababb2ff9..e93094f89 100644
--- a/lib/util.mli
+++ b/lib/util.mli
@@ -123,6 +123,7 @@ val list_last : 'a list -> 'a
val list_lastn : int -> 'a list -> 'a list
val list_skipn : int -> 'a list -> 'a list
val list_prefix_of : 'a list -> 'a list -> bool
+val list_drop_prefix : 'a list -> 'a list -> 'a list
(* [map_append f [x1; ...; xn]] returns [(f x1)@(f x2)@...@(f xn)] *)
val list_map_append : ('a -> 'b list) -> 'a list -> 'b list
(* raises [Invalid_argument] if the two lists don't have the same length *)
diff --git a/library/libnames.ml b/library/libnames.ml
index d4cc60719..424cf1f73 100644
--- a/library/libnames.ml
+++ b/library/libnames.ml
@@ -80,7 +80,11 @@ let is_dirpath_prefix_of d1 d2 =
let chop_dirpath n d =
let d1,d2 = list_chop n (List.rev (repr_dirpath d)) in
- make_dirpath (List.rev d1), make_dirpath (List.rev d2)
+ make_dirpath (List.rev d1), make_dirpath (List.rev d2)
+
+let drop_dirpath_prefix d1 d2 =
+ let d = Util.list_drop_prefix (List.rev (repr_dirpath d1)) (List.rev (repr_dirpath d2)) in
+ make_dirpath (List.rev d)
(* To know how qualified a name should be to be understood in the current env*)
let add_dirpath_prefix id d = make_dirpath (repr_dirpath d @ [id])
diff --git a/library/libnames.mli b/library/libnames.mli
index 22cdd3a09..69710f431 100644
--- a/library/libnames.mli
+++ b/library/libnames.mli
@@ -54,6 +54,7 @@ val extend_dirpath : dir_path -> module_ident -> dir_path
val add_dirpath_prefix : module_ident -> dir_path -> dir_path
val chop_dirpath : int -> dir_path -> dir_path * dir_path
+val drop_dirpath_prefix : dir_path -> dir_path -> dir_path
val extract_dirpath_prefix : int -> dir_path -> dir_path
val is_dirpath_prefix_of : dir_path -> dir_path -> bool