Skip to content

Commit 8d58cc9

Browse files
committed
Flow: rename type if conflicts with value names.
1 parent fa7546a commit 8d58cc9

File tree

6 files changed

+71
-5
lines changed

6 files changed

+71
-5
lines changed

jscomp/flow.ml

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
open Flow_tree
22

3+
module SSet = Set.Make(String)
4+
module SMap = Map.Make(String)
5+
36
type state = {
47
env: Env.t;
58
mutable used_types: string list;
@@ -107,10 +110,63 @@ and p_any comment = p_named ~comment "any"
107110

108111
and p_named ?(tl=[]) ?comment name = T_name (name, tl, comment)
109112

113+
let mk_type_name name used_names =
114+
let is_unique name = not (SSet.mem name used_names) in
115+
let rec loop i =
116+
let new_name = name ^ "$" ^ (string_of_int i) in
117+
if is_unique new_name then new_name else loop (i + 1)
118+
in
119+
if is_unique name then name else loop 0
120+
121+
let get_type_map types exports =
122+
let used_names = List.fold_left (fun names e ->
123+
print_endline ("add export " ^ e.decl_name);
124+
SSet.add e.decl_name names
125+
) SSet.empty exports in
126+
let (_, type_map) = List.fold_left (fun (used_names, type_map) t ->
127+
print_endline ("add type " ^ t.decl_name);
128+
let name = mk_type_name t.decl_name used_names in
129+
let type_names = SSet.add name used_names in
130+
let type_map = SMap.add t.decl_name name type_map in
131+
(type_names, type_map)
132+
) (used_names, SMap.empty) types in
133+
SMap.iter (fun k v -> print_endline (k ^ " -> " ^ v)) type_map;
134+
type_map
135+
136+
let rename_types prog type_map =
137+
let get_name name =
138+
if SMap.mem name type_map then SMap.find name type_map else name
139+
in
140+
let rec rename t =
141+
match t with
142+
| T_name (name, tl, comment) ->
143+
let name = get_name name in
144+
let tl = List.map rename tl in
145+
T_name (name, tl, comment)
146+
| T_fun (args, ret) -> T_fun (List.map rename args, rename ret)
147+
| T_obj fields ->
148+
let map f = {
149+
field_name = f.field_name;
150+
field_type = rename f.field_type;
151+
} in
152+
T_obj (List.map map fields)
153+
| T_tuple tl -> T_tuple (List.map rename tl)
154+
in
155+
let prog_types = List.map (fun d ->
156+
{decl_name = get_name d.decl_name; decl_type = rename d.decl_type}
157+
) prog.prog_types in
158+
let prog_exports = List.map (fun d ->
159+
{d with decl_type = rename d.decl_type}
160+
) prog.prog_exports in
161+
{prog_types; prog_exports}
162+
110163
let print_signature env sigs =
111164
let s = {env; used_types = []; types = []; exports = []} in
112165
List.iter (p_sig s) sigs;
113-
Flow_print.print {
166+
let prog = {
114167
prog_types = List.rev s.types;
115168
prog_exports = List.rev s.exports;
116-
}
169+
} in
170+
let type_map = get_type_map s.types s.exports in
171+
let prog = rename_types prog type_map in
172+
Flow_print.print prog

jscomp/test_flow/build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
../bin/bsc -I ../runtime -I ../stdlib -bs-gen-flow -bs-main main.ml -c
1+
../bin/bsc.exe -I ../runtime -I ../stdlib -bs-gen-flow -bs-main main.ml -c

jscomp/test_flow/main.js

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jscomp/test_flow/main.js.flow

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ type rec_t = /* Type_record */any
1010

1111
type Util__t = {id: number}
1212

13+
type tt$0 = number
14+
1315
declare export var do_if: (p0: /* bool */any) => /* bool */any;
1416

1517
declare export var mk_tuple: (p0: M__t, p1: number, p2: void) => [number, number, string, char];
@@ -23,3 +25,5 @@ declare export var mk_arr: (p0: void) => Array<number>;
2325
declare export var from_util: (p0: Util__t) => void;
2426

2527
declare export var float_: number;
28+
29+
declare export var tt: tt$0;

jscomp/test_flow/main.ml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,6 @@ let mk_arr () = [|1; 2; 3|]
2929
let from_util (a: Util.t) = ()
3030

3131
let float_ = 1.0
32+
33+
type tt = int
34+
let tt: tt = 0

jscomp/test_flow/util.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)