Skip to content

Commit 8dda5f8

Browse files
committed
Flow: Print types closer to values they are used in.
1 parent 98b4c15 commit 8dda5f8

File tree

5 files changed

+34
-39
lines changed

5 files changed

+34
-39
lines changed

jscomp/flow.ml

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ type state = {
99
mutable type_ids: id SMap.t;
1010
mutable val_ids: id SMap.t;
1111

12-
mutable types: decl list;
13-
mutable exports: decl list;
12+
mutable decls: decl list;
1413

1514
mutable curr_tvars: int list option;
1615
}
@@ -48,7 +47,7 @@ and p_sig s = function
4847
| Types.Sig_value (id, val_desc) ->
4948
let decl_name = get_val_id s (Ident.name id) in
5049
let decl_type = p_type_expr s val_desc.val_type in
51-
s.exports <- {decl_name; decl_type; decl_tvars = []} :: s.exports
50+
s.decls <- Decl_val {decl_name; decl_type} :: s.decls
5251
| Sig_type _ -> () (* Types are declared on demand *)
5352
| Sig_typext _ -> ()
5453
| Sig_module _ -> () (* Non-toplevel values are not exposed *)
@@ -98,10 +97,10 @@ and p_type_expr s type_expr =
9897
let decl_name = get_type_id s type_name in
9998
let type_decl = Env.find_type path s.env in
10099
let decl_type = p_type_decl s type_decl in
101-
let decl_tvars = List.map (fun t -> t.Types.id) type_decl.Types.type_params in
100+
let tvars = List.map (fun t -> t.Types.id) type_decl.Types.type_params in
102101
s.curr_tvars <- prev_tvars;
103-
let decl = {decl_name; decl_type; decl_tvars} in
104-
s.types <- decl :: s.types
102+
let decl = Decl_type (tvars, {decl_name; decl_type}) in
103+
s.decls <- decl :: s.decls
105104
end;
106105
p_type_name ~tl:(List.map (p_type_expr s) tl) s type_name
107106
end
@@ -179,14 +178,12 @@ let print_signature env sigs =
179178
used_types = [];
180179
type_ids = SMap.empty;
181180
val_ids = SMap.empty;
182-
types = [];
183-
exports = [];
181+
decls = [];
184182
curr_tvars = None;
185183
} in
186184
List.iter (p_sig s) sigs;
187185
rename_types s;
188186
let prog = {
189-
prog_types = List.rev s.types;
190-
prog_exports = List.rev s.exports;
187+
prog_decls = List.rev s.decls;
191188
} in
192189
Flow_print.print prog

jscomp/flow_print.ml

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,18 @@ let rec print_type = function
3737
let types_str = types |> List.map print_type |> String.concat ", " in
3838
"[" ^ types_str ^ "]"
3939

40-
let print_type_decl decl =
41-
let tvars = print_tvars decl.decl_tvars in
42-
let type_str = print_type decl.decl_type in
43-
"type " ^ decl.decl_name.id ^ tvars ^ " = " ^ type_str
44-
4540
let print_decl decl =
46-
let type_ = print_type decl.decl_type in
47-
"declare export var " ^ decl.decl_name.id ^ ": " ^ type_ ^ ";"
41+
match decl with
42+
| Decl_type (tvars, desc) ->
43+
let tvars = print_tvars tvars in
44+
let type_str = print_type desc.decl_type in
45+
"type " ^ desc.decl_name.id ^ tvars ^ " = " ^ type_str
46+
| Decl_val desc ->
47+
let type_ = print_type desc.decl_type in
48+
"declare export var " ^ desc.decl_name.id ^ ": " ^ type_ ^ ";"
4849

4950
let print prog =
50-
let types = List.map print_type_decl prog.prog_types in
51-
let decls = List.map print_decl prog.prog_exports in
51+
let decls = List.map print_decl prog.prog_decls in
5252
"// @flow\n\n" ^
53-
(String.concat "\n\n" types) ^
54-
"\n\n" ^
5553
(String.concat "\n\n" decls) ^
5654
"\n"

jscomp/flow_tree.ml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
type prog = {
2-
prog_types: decl list;
3-
prog_exports: decl list;
2+
prog_decls: decl list;
43
}
54

6-
and decl = {
5+
and decl =
6+
| Decl_type of (* tvars *) int list * decl_desc
7+
| Decl_val of decl_desc
8+
9+
and decl_desc = {
710
decl_name: id;
811
decl_type: type_;
9-
decl_tvars: int list;
1012
}
1113

1214
and type_ =

jscomp/test_flow/main.js.flow

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
// @flow
22

3-
type Mod__t = number
4-
5-
type rec_t = /* Type_record */any
6-
7-
type obj_t = /* Tobject */any
8-
9-
type Util__t = {id: number}
10-
11-
type tt$0 = number
12-
13-
type pair$0<TVAR_2148> = [TVAR_2148, TVAR_2148]
14-
153
declare export var tuple: [string, number, number, 0 | 1, 0 | 1];
164

5+
type Mod__t = number
6+
177
declare export var aliased: Mod__t;
188

199
declare export var js_obj: {id: number, name: string};
2010

11+
type rec_t = /* Type_record */any
12+
2113
declare export var record: rec_t;
2214

15+
type obj_t = /* Tobject */any
16+
2317
declare export var obj_arg: (p0: obj_t) => void;
2418

2519
declare export var arr: Array<number>;
2620

21+
type Util__t = {id: number}
22+
2723
declare export var from_util: (p0: Util__t) => void;
2824

25+
type tt$0 = number
26+
2927
declare export var tt: tt$0;
3028

3129
declare export var iter: <TVAR_2135>(p0: Array<TVAR_2135>, p1: (p0: TVAR_2135) => void) => void;
3230

31+
type pair$0<TVAR_2148> = [TVAR_2148, TVAR_2148]
32+
3333
declare export var pair: <TVAR_2176>(p0: pair$0<TVAR_2176>) => void;
3434

3535
declare export var tuple_with_fn: [<TVAR_2197>(p0: pair$0<TVAR_2197>) => void, number];

jscomp/test_flow/util.js.flow

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
11
// @flow
22

3-
4-
53
declare export var next: (p0: void) => number;

0 commit comments

Comments
 (0)