Skip to content
Prev Previous commit
Flow: Print types closer to values they are used in.
  • Loading branch information
pvolok committed Oct 11, 2016
commit 8dda5f891cc9a18a47ae39e3aa49f48c8b09a41e
17 changes: 7 additions & 10 deletions jscomp/flow.ml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ type state = {
mutable type_ids: id SMap.t;
mutable val_ids: id SMap.t;

mutable types: decl list;
mutable exports: decl list;
mutable decls: decl list;

mutable curr_tvars: int list option;
}
Expand Down Expand Up @@ -48,7 +47,7 @@ and p_sig s = function
| Types.Sig_value (id, val_desc) ->
let decl_name = get_val_id s (Ident.name id) in
let decl_type = p_type_expr s val_desc.val_type in
s.exports <- {decl_name; decl_type; decl_tvars = []} :: s.exports
s.decls <- Decl_val {decl_name; decl_type} :: s.decls
| Sig_type _ -> () (* Types are declared on demand *)
| Sig_typext _ -> ()
| Sig_module _ -> () (* Non-toplevel values are not exposed *)
Expand Down Expand Up @@ -98,10 +97,10 @@ and p_type_expr s type_expr =
let decl_name = get_type_id s type_name in
let type_decl = Env.find_type path s.env in
let decl_type = p_type_decl s type_decl in
let decl_tvars = List.map (fun t -> t.Types.id) type_decl.Types.type_params in
let tvars = List.map (fun t -> t.Types.id) type_decl.Types.type_params in
s.curr_tvars <- prev_tvars;
let decl = {decl_name; decl_type; decl_tvars} in
s.types <- decl :: s.types
let decl = Decl_type (tvars, {decl_name; decl_type}) in
s.decls <- decl :: s.decls
end;
p_type_name ~tl:(List.map (p_type_expr s) tl) s type_name
end
Expand Down Expand Up @@ -179,14 +178,12 @@ let print_signature env sigs =
used_types = [];
type_ids = SMap.empty;
val_ids = SMap.empty;
types = [];
exports = [];
decls = [];
curr_tvars = None;
} in
List.iter (p_sig s) sigs;
rename_types s;
let prog = {
prog_types = List.rev s.types;
prog_exports = List.rev s.exports;
prog_decls = List.rev s.decls;
} in
Flow_print.print prog
20 changes: 9 additions & 11 deletions jscomp/flow_print.ml
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,18 @@ let rec print_type = function
let types_str = types |> List.map print_type |> String.concat ", " in
"[" ^ types_str ^ "]"

let print_type_decl decl =
let tvars = print_tvars decl.decl_tvars in
let type_str = print_type decl.decl_type in
"type " ^ decl.decl_name.id ^ tvars ^ " = " ^ type_str

let print_decl decl =
let type_ = print_type decl.decl_type in
"declare export var " ^ decl.decl_name.id ^ ": " ^ type_ ^ ";"
match decl with
| Decl_type (tvars, desc) ->
let tvars = print_tvars tvars in
let type_str = print_type desc.decl_type in
"type " ^ desc.decl_name.id ^ tvars ^ " = " ^ type_str
| Decl_val desc ->
let type_ = print_type desc.decl_type in
"declare export var " ^ desc.decl_name.id ^ ": " ^ type_ ^ ";"

let print prog =
let types = List.map print_type_decl prog.prog_types in
let decls = List.map print_decl prog.prog_exports in
let decls = List.map print_decl prog.prog_decls in
"// @flow\n\n" ^
(String.concat "\n\n" types) ^
"\n\n" ^
(String.concat "\n\n" decls) ^
"\n"
10 changes: 6 additions & 4 deletions jscomp/flow_tree.ml
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
type prog = {
prog_types: decl list;
prog_exports: decl list;
prog_decls: decl list;
}

and decl = {
and decl =
| Decl_type of (* tvars *) int list * decl_desc
| Decl_val of decl_desc

and decl_desc = {
decl_name: id;
decl_type: type_;
decl_tvars: int list;
}

and type_ =
Expand Down
24 changes: 12 additions & 12 deletions jscomp/test_flow/main.js.flow
Original file line number Diff line number Diff line change
@@ -1,35 +1,35 @@
// @flow

type Mod__t = number

type rec_t = /* Type_record */any

type obj_t = /* Tobject */any

type Util__t = {id: number}

type tt$0 = number

type pair$0<TVAR_2148> = [TVAR_2148, TVAR_2148]

declare export var tuple: [string, number, number, 0 | 1, 0 | 1];

type Mod__t = number

declare export var aliased: Mod__t;

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

type rec_t = /* Type_record */any

declare export var record: rec_t;

type obj_t = /* Tobject */any

declare export var obj_arg: (p0: obj_t) => void;

declare export var arr: Array<number>;

type Util__t = {id: number}

declare export var from_util: (p0: Util__t) => void;

type tt$0 = number

declare export var tt: tt$0;

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

type pair$0<TVAR_2148> = [TVAR_2148, TVAR_2148]

declare export var pair: <TVAR_2176>(p0: pair$0<TVAR_2176>) => void;

declare export var tuple_with_fn: [<TVAR_2197>(p0: pair$0<TVAR_2197>) => void, number];
2 changes: 0 additions & 2 deletions jscomp/test_flow/util.js.flow
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
// @flow



declare export var next: (p0: void) => number;