-
Notifications
You must be signed in to change notification settings - Fork 0
/
fileInfo.ml
102 lines (85 loc) · 3.21 KB
/
fileInfo.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
(**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the "hack" directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*)
(*****************************************************************************)
(* This module defines the data structured used to describe the content of
* a file.
* The parser constructs FileInfo.t structs, that contain names and positions
* plus some extra info required for the build.
* After the names have been checked (Naming.make_env), we "simplify" the
* struct and only keep the names defined in the files we know about.
*)
(*****************************************************************************)
open Utils
(*****************************************************************************)
(* Parsing modes *)
(*****************************************************************************)
type file_type =
| PhpFile
| HhFile
[@@deriving show]
type mode =
| Mdecl (* just declare signatures, don't check anything *)
| Mstrict (* check everthing! *)
| Mpartial (* Don't fail if you see a function/class you don't know *)
[@@deriving show]
(*****************************************************************************)
(* The record produced by the parsing phase. *)
(*****************************************************************************)
type id = Pos.t * string
[@@deriving show]
type t = {
file_mode : mode option;
funs : id list;
classes : id list;
typedefs : id list;
consts : id list;
comments : (Pos.t * string) list;
consider_names_just_for_autoload: bool;
}
[@@deriving show]
(*****************************************************************************)
(* The simplified record used after parsing. *)
(*****************************************************************************)
type names = {
n_funs : SSet.t;
n_classes : SSet.t;
n_types : SSet.t;
n_consts : SSet.t;
}
type fast = names Relative_path.Map.t
let empty_names = {
n_funs = SSet.empty;
n_classes = SSet.empty;
n_types = SSet.empty;
n_consts = SSet.empty;
}
(*****************************************************************************)
(* Functions simplifying the file information. *)
(*****************************************************************************)
let name_set_of_idl idl =
List.fold_left (fun acc (_, x) -> SSet.add x acc) SSet.empty idl
let simplify info =
let {funs; classes; typedefs; consts; file_mode = _; comments = _;
consider_names_just_for_autoload = _ } = info in
let n_funs = name_set_of_idl funs in
let n_classes = name_set_of_idl classes in
let n_types = name_set_of_idl typedefs in
let n_consts = name_set_of_idl consts in
{n_funs; n_classes; n_types; n_consts}
let merge_names t_names1 t_names2 =
let {n_funs; n_classes; n_types; n_consts} = t_names1 in
{
n_funs = SSet.union n_funs t_names2.n_funs;
n_classes = SSet.union n_classes t_names2.n_classes;
n_types = SSet.union n_types t_names2.n_types;
n_consts = SSet.union n_consts t_names2.n_consts;
}
let simplify_fast fast =
Relative_path.Map.map simplify fast