• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ES2PANDA_COMPILER_TYPESCRIPT_TYPES_TYPE_FACTS_H
17 #define ES2PANDA_COMPILER_TYPESCRIPT_TYPES_TYPE_FACTS_H
18 
19 #include <util/enumbitops.h>
20 
21 namespace panda::es2panda::checker {
22 
23 enum class TypeFacts {
24     NONE = 0,
25     TYPEOF_EQ_STRING = 1 << 0,        // typeof x === "string"
26     TYPEOF_EQ_NUMBER = 1 << 1,        // typeof x === "number"
27     TYPEOF_EQ_BIGINT = 1 << 2,        // typeof x === "bigint"
28     TYPEOF_EQ_BOOLEAN = 1 << 3,       // typeof x === "boolean"
29     TYPEOF_EQ_SYMBOL = 1 << 4,        // typeof x === "symbol"
30     TYPEOF_EQ_OBJECT = 1 << 5,        // typeof x === "object"
31     TYPEOF_EQ_FUNCTION = 1 << 6,      // typeof x === "function"
32     TYPEOF_EQ_HOST_OBJECT = 1 << 7,   // typeof x === "xxx"
33     TYPEOF_NE_STRING = 1 << 8,        // typeof x !== "string"
34     TYPEOF_NE_NUMBER = 1 << 9,        // typeof x !== "number"
35     TYPEOF_NE_BIGINT = 1 << 10,       // typeof x !== "bigint"
36     TYPEOF_NE_BOOLEAN = 1 << 11,      // typeof x !== "boolean"
37     TYPEOF_NE_SYMBOL = 1 << 12,       // typeof x !== "symbol"
38     TYPEOF_NE_OBJECT = 1 << 13,       // typeof x !== "object"
39     TYPEOF_NE_FUNCTION = 1 << 14,     // typeof x !== "function"
40     TYPEOF_NE_HOST_OBJECT = 1 << 15,  // typeof x !== "xxx"
41     EQ_UNDEFINED = 1 << 16,           // x === undefined
42     EQ_NULL = 1 << 17,                // x === null
43     EQ_UNDEFINED_OR_NULL = 1 << 18,   // x === undefined / x === null
44     NE_UNDEFINED = 1 << 19,           // x !== undefined
45     NE_NULL = 1 << 20,                // x !== null
46     NE_UNDEFINED_OR_NULL = 1 << 21,   // x != undefined / x != null
47     TRUTHY = 1 << 22,                 // x
48     FALSY = 1 << 23,                  // !x
49     ALL = (1 << 24) - 1,
50 
51     // Number facts
52     BASE_NUMBER_STRICT_FACTS = TYPEOF_EQ_NUMBER | TYPEOF_NE_STRING | TYPEOF_NE_BIGINT | TYPEOF_NE_BOOLEAN |
53                                TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
54                                NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
55     BASE_NUMBER_FACTS = BASE_NUMBER_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
56     NUMBER_FACTS = BASE_NUMBER_FACTS | TRUTHY,
57     ZERO_NUMBER_STRICT_FACTS = BASE_NUMBER_STRICT_FACTS | FALSY,
58     ZERO_NUMBER_FACTS = BASE_NUMBER_FACTS,
59     NON_ZERO_NUMBER_FACTS = BASE_NUMBER_FACTS | TRUTHY,
60 
61     // String facts
62     BASE_STRING_STRICT_FACTS = TYPEOF_EQ_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BIGINT | TYPEOF_NE_BOOLEAN |
63                                TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
64                                NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
65     BASE_STRING_FACTS = BASE_STRING_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
66     STRING_FACTS = BASE_STRING_FACTS | TRUTHY,
67     EMPTY_STRING_STRICT_FACTS = BASE_STRING_STRICT_FACTS | FALSY | TRUTHY,
68     EMPTY_STRING_FACTS = BASE_STRING_FACTS,
69     NON_EMPTY_STRING_FACTS = BASE_STRING_FACTS | TRUTHY,
70 
71     // Symbol facts
72     BASE_SYMBOL_STRICT_FACTS = TYPEOF_EQ_SYMBOL | TYPEOF_NE_NUMBER | TYPEOF_NE_BIGINT | TYPEOF_NE_BOOLEAN |
73                                TYPEOF_NE_STRING | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
74                                NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
75     BASE_SYMBOL_FACTS = BASE_SYMBOL_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
76     SYMBOL_FACTS = BASE_SYMBOL_FACTS | TRUTHY,
77 
78     // Bigint facts
79     BASE_BIGINT_STRICT_FACTS = TYPEOF_EQ_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN |
80                                TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
81                                NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
82     BASE_BIGINT_FACTS = BASE_BIGINT_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
83     BIGINT_FACTS = BASE_BIGINT_FACTS | TRUTHY,
84     ZERO_BIGINT_STRICT_FACTS = BASE_BIGINT_STRICT_FACTS | FALSY,
85     ZERO_BIGINT_FACTS = BASE_BIGINT_FACTS,
86     NON_ZERO_BIGINT_FACTS = BASE_BIGINT_FACTS | TRUTHY,
87 
88     // Boolean facts
89     BASE_BOOLEAN_STRICT_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_EQ_BOOLEAN |
90                                 TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
91                                 NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
92     BASE_BOOLEAN_FACTS = BASE_BOOLEAN_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
93     BOOLEAN_FACTS = BASE_BOOLEAN_FACTS | TRUTHY,
94     FALSE_STRICT_FACTS = BASE_BOOLEAN_STRICT_FACTS | FALSY,
95     FALSE_FACTS = BASE_BOOLEAN_FACTS,
96     TRUE_STRICT_FACTS = BASE_BOOLEAN_STRICT_FACTS | TRUTHY,
97     TRUE_FACTS = BASE_BOOLEAN_FACTS | TRUTHY,
98 
99     // Object facts
100     OBJECT_STRICT_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN |
101                           TYPEOF_NE_SYMBOL | TYPEOF_EQ_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_EQ_HOST_OBJECT |
102                           NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL | TRUTHY,
103     OBJECT_FACTS = OBJECT_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
104     EMPTY_OBJECT_STRICT_FACTS = ALL & ~(EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL),
105     EMPTY_OBJECT_FACTS = ALL,
106 
107     // Function facts
108     FUNCTION_STRICT_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN |
109                             TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_EQ_FUNCTION | TYPEOF_EQ_HOST_OBJECT |
110                             NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL | TRUTHY,
111     FUNCTION_FACTS = FUNCTION_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
112 
113     // Undefined facts
114     UNDEFINED_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN | TYPEOF_NE_SYMBOL |
115                       TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT | EQ_UNDEFINED | NE_NULL |
116                       EQ_UNDEFINED_OR_NULL | FALSY,
117 
118     // Null facts
119     NULL_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN | TYPEOF_NE_SYMBOL |
120                  TYPEOF_EQ_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT | NE_UNDEFINED | EQ_NULL |
121                  EQ_UNDEFINED_OR_NULL | FALSY,
122 };
123 
124 DEFINE_BITOPS(TypeFacts)
125 
126 }  // namespace panda::es2panda::checker
127 
128 #endif /* TYPESCRIPT_TYPES_TYPE_FACTS_H */
129