Skip to content

Commit

Permalink
Use Misc.UString.{un,}capitalize to connect file names with module …
Browse files Browse the repository at this point in the history
…names

Instead of `String.{un,}capitalize_ascii` like before.

This should support compilation units whose module names start with
or contain non-ASCII letters.
  • Loading branch information
xavierleroy committed Nov 17, 2022
1 parent 7221c24 commit fa5514c
Show file tree
Hide file tree
Showing 19 changed files with 43 additions and 91 deletions.
4 changes: 2 additions & 2 deletions asmcomp/asmpackager.ml
Expand Up @@ -41,7 +41,7 @@ type pack_member =

let read_member_info pack_path file = (
let name =
String.capitalize_ascii(Filename.basename(chop_extensions file)) in
Misc.UString.capitalize(Filename.basename(chop_extensions file)) in
let kind =
if Filename.check_suffix file ".cmi" then
PM_intf
Expand Down Expand Up @@ -261,7 +261,7 @@ let package_files ~ppf_dump initial_env files targetcmx ~backend =
let prefix = chop_extensions targetcmx in
let targetcmi = prefix ^ ".cmi" in
let targetobj = Filename.remove_extension targetcmx ^ Config.ext_obj in
let targetname = String.capitalize_ascii(Filename.basename prefix) in
let targetname = Misc.UString.capitalize(Filename.basename prefix) in
(* Set the name of the current "input" *)
Location.input_name := targetcmx;
(* Set the name of the current compunit *)
Expand Down
4 changes: 2 additions & 2 deletions bytecomp/bytepackager.ml
Expand Up @@ -98,7 +98,7 @@ type pack_member =

let read_member_info file = (
let name =
String.capitalize_ascii(Filename.basename(chop_extensions file)) in
Misc.UString.capitalize(Filename.basename(chop_extensions file)) in
let kind =
(* PR#7479: make sure it is either a .cmi or a .cmo *)
if Filename.check_suffix file ".cmi" then
Expand Down Expand Up @@ -287,7 +287,7 @@ let package_files ~ppf_dump initial_env files targetfile =
files in
let prefix = chop_extensions targetfile in
let targetcmi = prefix ^ ".cmi" in
let targetname = String.capitalize_ascii(Filename.basename prefix) in
let targetname = Misc.UString.capitalize(Filename.basename prefix) in
Misc.try_finally (fun () ->
let coercion =
Typemod.package_units initial_env files targetcmi targetname in
Expand Down
2 changes: 1 addition & 1 deletion debugger/command_line.ml
Expand Up @@ -155,7 +155,7 @@ let convert_module mdle =
match mdle with
| Some m ->
(* Strip .ml extension if any, and capitalize *)
String.capitalize_ascii(if Filename.check_suffix m ".ml"
Misc.UString.capitalize(if Filename.check_suffix m ".ml"
then Filename.chop_suffix m ".ml"
else m)
| None ->
Expand Down
2 changes: 1 addition & 1 deletion debugger/loadprinter.ml
Expand Up @@ -52,7 +52,7 @@ let rec loadfiles ppf name =
true
with
| Dynlink.Error (Dynlink.Unavailable_unit unit) ->
loadfiles ppf (String.uncapitalize_ascii unit ^ ".cmo")
loadfiles ppf (Misc.UString.uncapitalize unit ^ ".cmo")
&&
loadfiles ppf name
| Not_found ->
Expand Down
41 changes: 9 additions & 32 deletions driver/compenv.ml
Expand Up @@ -62,40 +62,17 @@ let first_objfiles = ref []
let last_objfiles = ref []
let stop_early = ref false

(* Check validity of module name *)
let is_unit_name name =
try
if name = "" then raise Exit;
begin match name.[0] with
| 'A'..'Z' -> ()
| _ ->
raise Exit;
end;
for i = 1 to String.length name - 1 do
match name.[i] with
| 'A'..'Z' | 'a'..'z' | '0'..'9' | '_' | '\'' -> ()
| _ ->
raise Exit;
done;
true
with Exit -> false

let check_unit_name filename name =
if not (is_unit_name name) then
Location.prerr_warning (Location.in_file filename)
(Warnings.Bad_module_name name)

(* Compute name of module from output file name *)
(* Compute name of module from output file name.
Warn if it is not a valid identifier *)

let module_of_filename inputfile outputprefix =
let basename = Filename.basename outputprefix in
let name =
try
let pos = String.index basename '.' in
String.sub basename 0 pos
with Not_found -> basename
in
let name = String.capitalize_ascii name in
check_unit_name inputfile name;
Filename.basename outputprefix
|> Filename.remove_extension
|> Misc.UString.capitalize in
if not (Misc.UString.is_valid_identifier name) then
Location.prerr_warning (Location.in_file inputfile)
(Warnings.Bad_module_name name);
name

type filename = string
Expand Down
7 changes: 0 additions & 7 deletions driver/compenv.mli
Expand Up @@ -46,13 +46,6 @@ type readenv_position =

val readenv : Format.formatter -> readenv_position -> unit

(* [is_unit_name name] returns true only if [name] can be used as a
correct module name *)
val is_unit_name : string -> bool
(* [check_unit_name ppf filename name] prints a warning in [filename]
on [ppf] if [name] should not be used as a module name. *)
val check_unit_name : string -> string -> unit

(* Deferred actions of the compiler, while parsing arguments *)

type deferred_action =
Expand Down
6 changes: 3 additions & 3 deletions driver/makedepend.ml
Expand Up @@ -100,7 +100,7 @@ let add_to_synonym_list synonyms suffix =
let find_module_in_load_path name =
let names = List.map (fun ext -> name ^ ext) (!mli_synonyms @ !ml_synonyms) in
let unames =
let uname = String.uncapitalize_ascii name in
let uname = Misc.UString.uncapitalize name in
List.map (fun ext -> uname ^ ext) (!mli_synonyms @ !ml_synonyms)
in
let rec find_in_array a pos =
Expand Down Expand Up @@ -441,7 +441,7 @@ let sort_files_by_dependencies files =
(* Init Hashtbl with all defined modules *)
let files = List.map (fun (file, file_kind, deps, pp_deps) ->
let modname =
String.capitalize_ascii (Filename.chop_extension (Filename.basename file))
Misc.UString.capitalize (Filename.chop_extension (Filename.basename file))
in
let key = (modname, file_kind) in
let new_deps = ref [] in
Expand Down Expand Up @@ -546,7 +546,7 @@ let parse_map fname =
in
Clflags.transparent_modules := old_transp;
let modname =
String.capitalize_ascii
Misc.UString.capitalize
(Filename.basename (Filename.chop_extension fname)) in
if String.Map.is_empty m then
report_err (Failure (fname ^ " : empty map file or parse error"));
Expand Down
6 changes: 3 additions & 3 deletions ocamldoc/odoc_analyse.ml
Expand Up @@ -69,7 +69,7 @@ let no_docstring f x =
let process_implementation_file sourcefile =
init_path ();
let prefixname = Filename.chop_extension sourcefile in
let modulename = String.capitalize_ascii(Filename.basename prefixname) in
let modulename = Misc.UString.capitalize(Filename.basename prefixname) in
Env.set_unit_name modulename;
let inputfile = preprocess sourcefile in
let env = initial_env () in
Expand Down Expand Up @@ -103,7 +103,7 @@ let process_implementation_file sourcefile =
let process_interface_file sourcefile =
init_path ();
let prefixname = Filename.chop_extension sourcefile in
let modulename = String.capitalize_ascii(Filename.basename prefixname) in
let modulename = Misc.UString.capitalize(Filename.basename prefixname) in
Env.set_unit_name modulename;
let inputfile = preprocess sourcefile in
let ast =
Expand Down Expand Up @@ -212,7 +212,7 @@ let process_file sourcefile =
try Filename.chop_extension file
with _ -> file
in
String.capitalize_ascii (Filename.basename s)
Misc.UString.capitalize (Filename.basename s)
in
let txt =
try Odoc_text.Texter.text_of_string (Odoc_misc.input_file_as_string file)
Expand Down
2 changes: 1 addition & 1 deletion ocamldoc/odoc_ast.ml
Expand Up @@ -1893,7 +1893,7 @@ module Analyser =
let (tree_structure, _) = typedtree in
prepare_file source_file input_file;
(* We create the t_module for this file. *)
let mod_name = String.capitalize_ascii (Filename.basename (Filename.chop_extension source_file)) in
let mod_name = Misc.UString.capitalize (Filename.basename (Filename.chop_extension source_file)) in
let len, info_opt = Sig.preamble !file_name !file
(fun x -> x.Parsetree.pstr_loc) parsetree in
let info_opt = analyze_toplevel_alerts info_opt parsetree in
Expand Down
2 changes: 1 addition & 1 deletion ocamldoc/odoc_sig.ml
Expand Up @@ -1889,7 +1889,7 @@ module Analyser =
(ast : Parsetree.signature) (signat : Types.signature) =
prepare_file source_file input_file;
(* We create the t_module for this file. *)
let mod_name = String.capitalize_ascii
let mod_name = Misc.UString.capitalize
(Filename.basename (try Filename.chop_extension source_file with _ -> source_file))
in
let len, info_opt = preamble !file_name !file
Expand Down
2 changes: 1 addition & 1 deletion otherlibs/dynlink/extract_crc.ml
Expand Up @@ -56,7 +56,7 @@ let print_crc unit =
try
let crc = digest_interface unit (!load_path @ ["."]) in
if !first then first := false else print_string ";\n";
print_string " \""; print_string (String.capitalize_ascii unit);
print_string " \""; print_string (Misc.UString.capitalize unit);
print_string "\",\n \"";
for i = 0 to String.length crc - 1 do
Printf.printf "\\%03d" (Char.code crc.[i])
Expand Down
2 changes: 1 addition & 1 deletion tools/lintapidiff.ml
Expand Up @@ -186,7 +186,7 @@ module Ast = struct
try
let id =
orig |> Filename.chop_extension |> Filename.basename |>
String.capitalize_ascii |> Ident.create_persistent in
Misc.UString.capitalize |> Ident.create_persistent in
let ast = Pparse.file ~tool_name:"lintapidiff" input
Parse.interface Pparse.Signature in
Location.input_name := orig;
Expand Down
2 changes: 1 addition & 1 deletion toplevel/expunge.ml
Expand Up @@ -42,7 +42,7 @@ let main () =
let input_name = Sys.argv.(1) in
let output_name = Sys.argv.(2) in
for i = (if negate then 4 else 3) to Array.length Sys.argv - 1 do
to_keep := String.Set.add (String.capitalize_ascii Sys.argv.(i)) !to_keep
to_keep := String.Set.add (Misc.UString.capitalize Sys.argv.(i)) !to_keep
done;
let ic = open_in_bin input_name in
Bytesections.read_toc ic;
Expand Down
2 changes: 1 addition & 1 deletion toplevel/topcommon.ml
Expand Up @@ -32,7 +32,7 @@ let input_name = Location.input_name

let parse_mod_use_file name lb =
let modname =
String.capitalize_ascii
Misc.UString.capitalize
(Filename.remove_extension (Filename.basename name))
in
let items =
Expand Down
32 changes: 7 additions & 25 deletions typing/env.ml
Expand Up @@ -1661,16 +1661,6 @@ let module_declaration_address env id presence md =
| Mp_present ->
Lazy_backtrack.create_forced (Aident id)

let is_identchar c =
(* This should be kept in sync with the [identchar_latin1] character class
in [lexer.mll] *)
match c with
| 'A'..'Z' | 'a'..'z' | '_' | '\192'..'\214'
| '\216'..'\246' | '\248'..'\255' | '\'' | '0'..'9' ->
true
| _ ->
false

let rec components_of_module_maker
{cm_env; cm_prefixing_subst;
cm_path; cm_addr; cm_mty; cm_shape} : _ result =
Expand Down Expand Up @@ -1876,7 +1866,8 @@ and check_value_name name loc =
(* Note: we could also check here general validity of the
identifier, to protect against bad identifiers forged by -pp or
-ppx preprocessors. *)
if String.length name > 0 && not (is_identchar name.[0]) then
if String.length name > 0 && not (UString.starts_like_a_valid_identifier name)
then
for i = 1 to String.length name - 1 do
if name.[i] = '#' then
error (Illegal_value_name(loc, name))
Expand Down Expand Up @@ -2485,22 +2476,13 @@ let read_signature modname filename =
| Mty_signature sg -> sg
| Mty_ident _ | Mty_functor _ | Mty_alias _ -> assert false

let is_identchar_latin1 = function
| 'A'..'Z' | 'a'..'z' | '_' | '\192'..'\214' | '\216'..'\246'
| '\248'..'\255' | '\'' | '0'..'9' -> true
| _ -> false

let unit_name_of_filename fn =
match Filename.extension fn with
| ".cmi" -> begin
let unit =
String.capitalize_ascii (Filename.remove_extension fn)
in
if String.for_all is_identchar_latin1 unit then
Some unit
else
None
end
| ".cmi" ->
let unit = UString.capitalize (Filename.remove_extension fn) in
if UString.is_valid_identifier unit
then Some unit
else None
| _ -> None

let persistent_structures_of_dir dir =
Expand Down
2 changes: 1 addition & 1 deletion typing/printtyp.ml
Expand Up @@ -399,7 +399,7 @@ let rec rewrite_double_underscore_paths env p =
let better_lid =
Ldot
(Lident (String.sub name 0 i),
String.capitalize_ascii
Misc.UString.capitalize
(String.sub name (i + 2) (String.length name - i - 2)))
in
match Env.find_module_by_name better_lid env with
Expand Down
2 changes: 1 addition & 1 deletion typing/typemod.ml
Expand Up @@ -3121,7 +3121,7 @@ let package_units initial_env objfiles cmifile modulename =
List.map
(fun f ->
let pref = chop_extensions f in
let modname = String.capitalize_ascii(Filename.basename pref) in
let modname = Misc.UString.capitalize(Filename.basename pref) in
let sg = Env.read_signature modname (pref ^ ".cmi") in
if Filename.check_suffix f ".cmi" &&
not(Mtype.no_code_needed_sig Env.initial sg)
Expand Down
12 changes: 6 additions & 6 deletions utils/load_path.ml
Expand Up @@ -38,9 +38,9 @@ module Dir = struct
None

let find_uncap t fn =
let fn = String.uncapitalize_ascii fn in
let fn = Misc.UString.uncapitalize fn in
let search base =
if String.uncapitalize_ascii base = fn then
if Misc.UString.uncapitalize base = fn then
Some (Filename.concat t.path base)
else
None
Expand Down Expand Up @@ -85,7 +85,7 @@ let prepend_add dir =
List.iter (fun base ->
let fn = Filename.concat dir.Dir.path base in
STbl.replace !files base fn;
STbl.replace !files_uncap (String.uncapitalize_ascii base) fn
STbl.replace !files_uncap (Misc.UString.uncapitalize base) fn
) dir.Dir.files

let init ~auto_include l =
Expand Down Expand Up @@ -113,7 +113,7 @@ let add dir =
let fn = Filename.concat dir.Dir.path base in
if not (STbl.mem !files base) then
STbl.replace !files base fn;
let ubase = String.uncapitalize_ascii base in
let ubase = Misc.UString.uncapitalize base in
if not (STbl.mem !files_uncap ubase) then
STbl.replace !files_uncap ubase fn)
dir.Dir.files;
Expand Down Expand Up @@ -168,9 +168,9 @@ let find_uncap fn =
assert (not Config.merlin || Local_store.is_bound ());
try
if is_basename fn && not !Sys.interactive then
STbl.find !files_uncap (String.uncapitalize_ascii fn)
STbl.find !files_uncap (Misc.UString.uncapitalize fn)
else
Misc.find_in_path_uncap (get_paths ()) fn
with Not_found ->
let fn_uncap = String.uncapitalize_ascii fn in
let fn_uncap = Misc.UString.uncapitalize fn in
!auto_include_callback Dir.find_uncap fn_uncap
2 changes: 1 addition & 1 deletion utils/misc.ml
Expand Up @@ -463,7 +463,7 @@ let find_in_path_rel path name =
in try_dir path

let find_in_path_uncap path name =
let uname = String.uncapitalize_ascii name in
let uname = UString.uncapitalize name in
let rec try_dir = function
[] -> raise Not_found
| dir::rem ->
Expand Down

0 comments on commit fa5514c

Please sign in to comment.