aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--library/libnames.ml24
-rw-r--r--library/libnames.mli1
-rw-r--r--parsing/g_vernac.ml44
3 files changed, 29 insertions, 0 deletions
diff --git a/library/libnames.ml b/library/libnames.ml
index 909a4dc3e..cf6d4c8ad 100644
--- a/library/libnames.ml
+++ b/library/libnames.ml
@@ -203,6 +203,30 @@ let eq_reference r1 r2 = match r1, r2 with
| Ident (_, id1), Ident (_, id2) -> Id.equal id1 id2
| _ -> false
+let join_reference ns r =
+ match ns , r with
+ Qualid (_, q1), Qualid (loc, q2) ->
+ let (dp1,id1) = repr_qualid q1 in
+ let (dp2,id2) = repr_qualid q2 in
+ Qualid (loc,
+ make_qualid
+ (append_dirpath (append_dirpath dp1 (dirpath_of_string (Names.Id.to_string id1))) dp2)
+ id2)
+ | Qualid (_, q1), Ident (loc, id2) ->
+ let (dp1,id1) = repr_qualid q1 in
+ Qualid (loc,
+ make_qualid
+ (append_dirpath dp1 (dirpath_of_string (Names.Id.to_string id1)))
+ id2)
+ | Ident (_, id1), Qualid (loc, q2) ->
+ let (dp2,id2) = repr_qualid q2 in
+ Qualid (loc, make_qualid
+ (append_dirpath (dirpath_of_string (Names.Id.to_string id1)) dp2)
+ id2)
+ | Ident (_, id1), Ident (loc, id2) ->
+ Qualid (loc, make_qualid
+ (dirpath_of_string (Names.Id.to_string id1)) id2)
+
(* Deprecated synonyms *)
let make_short_qualid = qualid_of_ident
diff --git a/library/libnames.mli b/library/libnames.mli
index 60ec7af79..9a5fa8be4 100644
--- a/library/libnames.mli
+++ b/library/libnames.mli
@@ -124,6 +124,7 @@ val qualid_of_reference : reference -> qualid located
val string_of_reference : reference -> string
val pr_reference : reference -> std_ppcmds
val loc_of_reference : reference -> Loc.t
+val join_reference : reference -> reference -> reference
(** Deprecated synonyms *)
diff --git a/parsing/g_vernac.ml4 b/parsing/g_vernac.ml4
index 567bde9ca..54f831010 100644
--- a/parsing/g_vernac.ml4
+++ b/parsing/g_vernac.ml4
@@ -439,6 +439,10 @@ GEXTEND Gram
VernacRequire (export, qidl)
| IDENT "Require"; export = export_token; filename = ne_string ->
VernacRequireFrom (export, filename)
+ | IDENT "From" ; ns = global ; IDENT "Require"; export = export_token
+ ; qidl = LIST1 global ->
+ let qidl = List.map (Libnames.join_reference ns) qidl in
+ VernacRequire (export, qidl)
| IDENT "Import"; qidl = LIST1 global -> VernacImport (false,qidl)
| IDENT "Export"; qidl = LIST1 global -> VernacImport (true,qidl)
| IDENT "Include"; e = module_expr_inl; l = LIST0 ext_module_expr ->