AAST cleanup: Remove the Any node
[hiphop-php.git] / hphp / hack / src / ifc / ifc_utils.ml
blobd9bdb9268e70af096959ff69b3c031fb35066daa
1 (*
2 * Copyright (c) Facebook, Inc. and its affiliates.
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the "hack" directory of this source tree.
7 *)
9 open Hh_prelude
10 module A = Aast
12 let identity x = x
14 let rec funpow n ~f ~init =
15 if n <= 0 then
16 init
17 else
18 funpow (n - 1) ~f ~init:(f init)
20 let combine_opts keep_some combine x y =
21 match (x, y) with
22 | (Some z, None)
23 | (None, Some z) ->
24 if keep_some then
25 Some z
26 else
27 None
28 | (Some x, Some y) -> Some (combine x y)
29 | (None, None) -> None
31 let rec fold3 ~f ~init xs ys zs =
32 List.Or_unequal_lengths.(
33 match (xs, ys, zs) with
34 | ([], [], []) -> Ok init
35 | (x :: xs, y :: ys, z :: zs) ->
36 begin
37 match fold3 ~f ~init xs ys zs with
38 | Ok acc -> Ok (f acc x y z)
39 | err -> err
40 end
41 | _ -> Unequal_lengths)
43 let stmt_name = function
44 | A.Fallthrough -> "Fallthrough"
45 | A.Expr _ -> "Expr"
46 | A.Break -> "Break"
47 | A.Continue -> "Continue"
48 | A.Throw _ -> "Throw"
49 | A.Return _ -> "Return"
50 | A.Yield_break -> "Yield_break"
51 | A.Awaitall _ -> "Awaitall"
52 | A.If _ -> "If"
53 | A.Do _ -> "Do"
54 | A.While _ -> "While"
55 | A.Using _ -> "Using"
56 | A.For _ -> "For"
57 | A.Switch _ -> "Switch"
58 | A.Foreach _ -> "Foreach"
59 | A.Try _ -> "Try"
60 | A.Noop -> "Noop"
61 | A.Block _ -> "Block"
62 | A.Markup _ -> "Markup"
63 | A.AssertEnv _ -> "AssertEnv"
65 let expr_name = function
66 | A.Darray _ -> "Darray"
67 | A.Varray _ -> "Varray"
68 | A.Shape _ -> "Shape"
69 | A.ValCollection _ -> "ValCollection"
70 | A.KeyValCollection _ -> "KeyValCollection"
71 | A.Null -> "Null"
72 | A.This -> "This"
73 | A.True -> "True"
74 | A.False -> "False"
75 | A.Omitted -> "Omitted"
76 | A.Id _ -> "Id"
77 | A.Lvar _ -> "Lvar"
78 | A.Dollardollar _ -> "Dollardollar"
79 | A.Clone _ -> "Clone"
80 | A.Obj_get _ -> "Obj_get"
81 | A.Array_get _ -> "Array_get"
82 | A.Class_get _ -> "Class_get"
83 | A.Class_const _ -> "Class_const"
84 | A.Call _ -> "Call"
85 | A.FunctionPointer _ -> "FunctionPointer"
86 | A.Int _ -> "Int"
87 | A.Float _ -> "Float"
88 | A.String _ -> "String"
89 | A.String2 _ -> "String2"
90 | A.PrefixedString _ -> "PrefixedString"
91 | A.Yield _ -> "Yield"
92 | A.Await _ -> "Await"
93 | A.Tuple _ -> "Tuple"
94 | A.List _ -> "List"
95 | A.Cast _ -> "Cast"
96 | A.Unop _ -> "Unop"
97 | A.Binop _ -> "Binop"
98 | A.Pipe _ -> "Pipe"
99 | A.Eif _ -> "Eif"
100 | A.Is _ -> "Is"
101 | A.As _ -> "As"
102 | A.New _ -> "New"
103 | A.Record _ -> "Record"
104 | A.Efun _ -> "Efun"
105 | A.Lfun _ -> "Lfun"
106 | A.Xml _ -> "Xml"
107 | A.Callconv _ -> "Callconv"
108 | A.Import _ -> "Import"
109 | A.Collection _ -> "Collection"
110 | A.ExpressionTree _ -> "ExpressionTree"
111 | A.Lplaceholder _ -> "Lplaceholder"
112 | A.Fun_id _ -> "Fun_id"
113 | A.Method_id _ -> "Method_id"
114 | A.Method_caller _ -> "Method_caller"
115 | A.Smethod_id _ -> "Smethod_id"
116 | A.Pair _ -> "Pair"
117 | A.ET_Splice _ -> "ET_splice"
118 | A.EnumClassLabel _ -> "EnumClassLabel"
119 | A.ReadonlyExpr _ -> "Readonly"
120 | A.Hole _ -> "Hole"