Skip to content

Commit ba5e770

Browse files
committed
more efficient module_name implementation
1 parent e944125 commit ba5e770

13 files changed

+305
-144
lines changed

jscomp/ext/ext_filename.ml

+17-13
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,20 @@ let new_extension name (ext : string) =
8282
search_dot name (String.length name - 1) ext
8383

8484

85-
let generic_basename name =
86-
let rec find_end n =
87-
if n < 0 then String.sub name 0 1
88-
else if is_dir_sep name.[n] then find_end (n - 1)
89-
else find_beg n (n + 1)
90-
and find_beg n p =
91-
if n < 0 then String.sub name 0 p
92-
else if is_dir_sep name.[n] then String.sub name (n + 1) (p - n - 1)
93-
else find_beg (n - 1) p
94-
in
95-
if name = ""
96-
then "."
97-
else find_end (String.length name - 1)
85+
86+
(** TODO: improve efficiency
87+
given a path, calcuate its module name *)
88+
let module_name name =
89+
let rec search_dot i last name =
90+
if i < 0 then
91+
(match last with
92+
| None -> Ext_string.capitalize_ascii name
93+
| Some i -> Ext_string.capitalize_sub name i)
94+
else
95+
search_dot (i - 1)
96+
(if String.unsafe_get name i = '.' then Some i else last)
97+
name in
98+
let name = Filename.basename name in
99+
let name_len = String.length name in
100+
search_dot (name_len - 1) None name
101+

jscomp/ext/ext_filename.mli

+6-1
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,9 @@ val new_extension:
5555

5656
val chop_all_extensions_maybe:
5757
string ->
58-
string
58+
string
59+
60+
(* OCaml specific abstraction*)
61+
val module_name:
62+
string ->
63+
string

jscomp/ounit_tests/ounit_string_tests.ml

+26
Original file line numberDiff line numberDiff line change
@@ -467,5 +467,31 @@ let suites =
467467
string_eq (Ext_filename.chop_all_extensions_maybe ".a.b.x") "";
468468
string_eq (Ext_filename.chop_all_extensions_maybe "abx") "abx";
469469
end;
470+
__LOC__ >:: begin fun _ ->
471+
string_eq
472+
(Ext_filename.module_name "a/b/c.d")
473+
"C";
474+
string_eq
475+
(Ext_filename.module_name "a/b/xc.re")
476+
"Xc";
477+
string_eq
478+
(Ext_filename.module_name "a/b/xc.ml")
479+
"Xc" ;
480+
string_eq
481+
(Ext_filename.module_name "a/b/xc.mli")
482+
"Xc" ;
483+
string_eq
484+
(Ext_filename.module_name "a/b/xc.cppo.mli")
485+
"Xc";
486+
string_eq
487+
(Ext_filename.module_name "a/b/xc.cppo.")
488+
"Xc" ;
489+
string_eq
490+
(Ext_filename.module_name "a/b/xc..")
491+
"Xc" ;
492+
string_eq
493+
(Ext_filename.module_name "a/b/xc.")
494+
"Xc" ;
495+
end
470496
]
471497

lib/4.02.3/bsb.ml

+23-13
Original file line numberDiff line numberDiff line change
@@ -7319,6 +7319,11 @@ val new_extension:
73197319
val chop_all_extensions_maybe:
73207320
string ->
73217321
string
7322+
7323+
(* OCaml specific abstraction*)
7324+
val module_name:
7325+
string ->
7326+
string
73227327
end = struct
73237328
#1 "ext_filename.ml"
73247329
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
@@ -7405,19 +7410,24 @@ let new_extension name (ext : string) =
74057410
search_dot name (String.length name - 1) ext
74067411

74077412

7408-
let generic_basename name =
7409-
let rec find_end n =
7410-
if n < 0 then String.sub name 0 1
7411-
else if is_dir_sep name.[n] then find_end (n - 1)
7412-
else find_beg n (n + 1)
7413-
and find_beg n p =
7414-
if n < 0 then String.sub name 0 p
7415-
else if is_dir_sep name.[n] then String.sub name (n + 1) (p - n - 1)
7416-
else find_beg (n - 1) p
7417-
in
7418-
if name = ""
7419-
then "."
7420-
else find_end (String.length name - 1)
7413+
7414+
(** TODO: improve efficiency
7415+
given a path, calcuate its module name *)
7416+
let module_name name =
7417+
let rec search_dot i last name =
7418+
if i < 0 then
7419+
(match last with
7420+
| None -> Ext_string.capitalize_ascii name
7421+
| Some i -> Ext_string.capitalize_sub name i)
7422+
else
7423+
search_dot (i - 1)
7424+
(if String.unsafe_get name i = '.' then Some i else last)
7425+
name in
7426+
let name = Filename.basename name in
7427+
let name_len = String.length name in
7428+
search_dot (name_len - 1) None name
7429+
7430+
74217431
end
74227432
module Ext_modulename : sig
74237433
#1 "ext_modulename.mli"

lib/4.02.3/bsb_helper.ml

+23-13
Original file line numberDiff line numberDiff line change
@@ -4298,6 +4298,11 @@ val new_extension:
42984298
val chop_all_extensions_maybe:
42994299
string ->
43004300
string
4301+
4302+
(* OCaml specific abstraction*)
4303+
val module_name:
4304+
string ->
4305+
string
43014306
end = struct
43024307
#1 "ext_filename.ml"
43034308
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
@@ -4384,19 +4389,24 @@ let new_extension name (ext : string) =
43844389
search_dot name (String.length name - 1) ext
43854390

43864391

4387-
let generic_basename name =
4388-
let rec find_end n =
4389-
if n < 0 then String.sub name 0 1
4390-
else if is_dir_sep name.[n] then find_end (n - 1)
4391-
else find_beg n (n + 1)
4392-
and find_beg n p =
4393-
if n < 0 then String.sub name 0 p
4394-
else if is_dir_sep name.[n] then String.sub name (n + 1) (p - n - 1)
4395-
else find_beg (n - 1) p
4396-
in
4397-
if name = ""
4398-
then "."
4399-
else find_end (String.length name - 1)
4392+
4393+
(** TODO: improve efficiency
4394+
given a path, calcuate its module name *)
4395+
let module_name name =
4396+
let rec search_dot i last name =
4397+
if i < 0 then
4398+
(match last with
4399+
| None -> Ext_string.capitalize_ascii name
4400+
| Some i -> Ext_string.capitalize_sub name i)
4401+
else
4402+
search_dot (i - 1)
4403+
(if String.unsafe_get name i = '.' then Some i else last)
4404+
name in
4405+
let name = Filename.basename name in
4406+
let name_len = String.length name in
4407+
search_dot (name_len - 1) None name
4408+
4409+
44004410
end
44014411
module Ext_namespace : sig
44024412
#1 "ext_namespace.mli"

lib/4.02.3/bsdep.ml

+23-13
Original file line numberDiff line numberDiff line change
@@ -33798,6 +33798,11 @@ val new_extension:
3379833798
val chop_all_extensions_maybe:
3379933799
string ->
3380033800
string
33801+
33802+
(* OCaml specific abstraction*)
33803+
val module_name:
33804+
string ->
33805+
string
3380133806
end = struct
3380233807
#1 "ext_filename.ml"
3380333808
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
@@ -33884,19 +33889,24 @@ let new_extension name (ext : string) =
3388433889
search_dot name (String.length name - 1) ext
3388533890

3388633891

33887-
let generic_basename name =
33888-
let rec find_end n =
33889-
if n < 0 then String.sub name 0 1
33890-
else if is_dir_sep name.[n] then find_end (n - 1)
33891-
else find_beg n (n + 1)
33892-
and find_beg n p =
33893-
if n < 0 then String.sub name 0 p
33894-
else if is_dir_sep name.[n] then String.sub name (n + 1) (p - n - 1)
33895-
else find_beg (n - 1) p
33896-
in
33897-
if name = ""
33898-
then "."
33899-
else find_end (String.length name - 1)
33892+
33893+
(** TODO: improve efficiency
33894+
given a path, calcuate its module name *)
33895+
let module_name name =
33896+
let rec search_dot i last name =
33897+
if i < 0 then
33898+
(match last with
33899+
| None -> Ext_string.capitalize_ascii name
33900+
| Some i -> Ext_string.capitalize_sub name i)
33901+
else
33902+
search_dot (i - 1)
33903+
(if String.unsafe_get name i = '.' then Some i else last)
33904+
name in
33905+
let name = Filename.basename name in
33906+
let name_len = String.length name in
33907+
search_dot (name_len - 1) None name
33908+
33909+
3390033910
end
3390133911
module Ext_option : sig
3390233912
#1 "ext_option.mli"

lib/4.02.3/bsppx.ml

+23-13
Original file line numberDiff line numberDiff line change
@@ -15851,6 +15851,11 @@ val new_extension:
1585115851
val chop_all_extensions_maybe:
1585215852
string ->
1585315853
string
15854+
15855+
(* OCaml specific abstraction*)
15856+
val module_name:
15857+
string ->
15858+
string
1585415859
end = struct
1585515860
#1 "ext_filename.ml"
1585615861
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
@@ -15937,19 +15942,24 @@ let new_extension name (ext : string) =
1593715942
search_dot name (String.length name - 1) ext
1593815943

1593915944

15940-
let generic_basename name =
15941-
let rec find_end n =
15942-
if n < 0 then String.sub name 0 1
15943-
else if is_dir_sep name.[n] then find_end (n - 1)
15944-
else find_beg n (n + 1)
15945-
and find_beg n p =
15946-
if n < 0 then String.sub name 0 p
15947-
else if is_dir_sep name.[n] then String.sub name (n + 1) (p - n - 1)
15948-
else find_beg (n - 1) p
15949-
in
15950-
if name = ""
15951-
then "."
15952-
else find_end (String.length name - 1)
15945+
15946+
(** TODO: improve efficiency
15947+
given a path, calcuate its module name *)
15948+
let module_name name =
15949+
let rec search_dot i last name =
15950+
if i < 0 then
15951+
(match last with
15952+
| None -> Ext_string.capitalize_ascii name
15953+
| Some i -> Ext_string.capitalize_sub name i)
15954+
else
15955+
search_dot (i - 1)
15956+
(if String.unsafe_get name i = '.' then Some i else last)
15957+
name in
15958+
let name = Filename.basename name in
15959+
let name_len = String.length name in
15960+
search_dot (name_len - 1) None name
15961+
15962+
1595315963
end
1595415964
module Bs_version : sig
1595515965
#1 "bs_version.mli"

lib/4.02.3/unstable/all_ounit_tests.ml

+49-13
Original file line numberDiff line numberDiff line change
@@ -7246,6 +7246,11 @@ val new_extension:
72467246
val chop_all_extensions_maybe:
72477247
string ->
72487248
string
7249+
7250+
(* OCaml specific abstraction*)
7251+
val module_name:
7252+
string ->
7253+
string
72497254
end = struct
72507255
#1 "ext_filename.ml"
72517256
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
@@ -7332,19 +7337,24 @@ let new_extension name (ext : string) =
73327337
search_dot name (String.length name - 1) ext
73337338

73347339

7335-
let generic_basename name =
7336-
let rec find_end n =
7337-
if n < 0 then String.sub name 0 1
7338-
else if is_dir_sep name.[n] then find_end (n - 1)
7339-
else find_beg n (n + 1)
7340-
and find_beg n p =
7341-
if n < 0 then String.sub name 0 p
7342-
else if is_dir_sep name.[n] then String.sub name (n + 1) (p - n - 1)
7343-
else find_beg (n - 1) p
7344-
in
7345-
if name = ""
7346-
then "."
7347-
else find_end (String.length name - 1)
7340+
7341+
(** TODO: improve efficiency
7342+
given a path, calcuate its module name *)
7343+
let module_name name =
7344+
let rec search_dot i last name =
7345+
if i < 0 then
7346+
(match last with
7347+
| None -> Ext_string.capitalize_ascii name
7348+
| Some i -> Ext_string.capitalize_sub name i)
7349+
else
7350+
search_dot (i - 1)
7351+
(if String.unsafe_get name i = '.' then Some i else last)
7352+
name in
7353+
let name = Filename.basename name in
7354+
let name_len = String.length name in
7355+
search_dot (name_len - 1) None name
7356+
7357+
73487358
end
73497359
module Ext_format : sig
73507360
#1 "ext_format.mli"
@@ -17711,6 +17721,32 @@ let suites =
1771117721
string_eq (Ext_filename.chop_all_extensions_maybe ".a.b.x") "";
1771217722
string_eq (Ext_filename.chop_all_extensions_maybe "abx") "abx";
1771317723
end;
17724+
__LOC__ >:: begin fun _ ->
17725+
string_eq
17726+
(Ext_filename.module_name "a/b/c.d")
17727+
"C";
17728+
string_eq
17729+
(Ext_filename.module_name "a/b/xc.re")
17730+
"Xc";
17731+
string_eq
17732+
(Ext_filename.module_name "a/b/xc.ml")
17733+
"Xc" ;
17734+
string_eq
17735+
(Ext_filename.module_name "a/b/xc.mli")
17736+
"Xc" ;
17737+
string_eq
17738+
(Ext_filename.module_name "a/b/xc.cppo.mli")
17739+
"Xc";
17740+
string_eq
17741+
(Ext_filename.module_name "a/b/xc.cppo.")
17742+
"Xc" ;
17743+
string_eq
17744+
(Ext_filename.module_name "a/b/xc..")
17745+
"Xc" ;
17746+
string_eq
17747+
(Ext_filename.module_name "a/b/xc.")
17748+
"Xc" ;
17749+
end
1771417750
]
1771517751

1771617752

0 commit comments

Comments
 (0)