• 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 #include <cstdint>
21 
22 namespace panda::es2panda::checker {
23 
24 enum class TypeFacts : uint32_t {
25     NONE = 0,
26     TYPEOF_EQ_STRING = 1 << 0,        // typeof x === "string"
27     TYPEOF_EQ_NUMBER = 1 << 1,        // typeof x === "number"
28     TYPEOF_EQ_BIGINT = 1 << 2,        // typeof x === "bigint"
29     TYPEOF_EQ_BOOLEAN = 1 << 3,       // typeof x === "boolean"
30     TYPEOF_EQ_SYMBOL = 1 << 4,        // typeof x === "symbol"
31     TYPEOF_EQ_OBJECT = 1 << 5,        // typeof x === "object"
32     TYPEOF_EQ_FUNCTION = 1 << 6,      // typeof x === "function"
33     TYPEOF_EQ_HOST_OBJECT = 1 << 7,   // typeof x === "xxx"
34     TYPEOF_NE_STRING = 1 << 8,        // typeof x !== "string"
35     TYPEOF_NE_NUMBER = 1 << 9,        // typeof x !== "number"
36     TYPEOF_NE_BIGINT = 1 << 10,       // typeof x !== "bigint"
37     TYPEOF_NE_BOOLEAN = 1 << 11,      // typeof x !== "boolean"
38     TYPEOF_NE_SYMBOL = 1 << 12,       // typeof x !== "symbol"
39     TYPEOF_NE_OBJECT = 1 << 13,       // typeof x !== "object"
40     TYPEOF_NE_FUNCTION = 1 << 14,     // typeof x !== "function"
41     TYPEOF_NE_HOST_OBJECT = 1 << 15,  // typeof x !== "xxx"
42     EQ_UNDEFINED = 1 << 16,           // x === undefined
43     EQ_NULL = 1 << 17,                // x === null
44     EQ_UNDEFINED_OR_NULL = 1 << 18,   // x === undefined / x === null
45     NE_UNDEFINED = 1 << 19,           // x !== undefined
46     NE_NULL = 1 << 20,                // x !== null
47     NE_UNDEFINED_OR_NULL = 1 << 21,   // x != undefined / x != null
48     TRUTHY = 1 << 22,                 // x
49     FALSY = 1 << 23,                  // !x
50     ALL = (1 << 24) - 1,
51 
52     // Number facts
53     BASE_NUMBER_STRICT_FACTS = TYPEOF_EQ_NUMBER | TYPEOF_NE_STRING | TYPEOF_NE_BIGINT | TYPEOF_NE_BOOLEAN |
54                                TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
55                                NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
56     BASE_NUMBER_FACTS = BASE_NUMBER_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
57     NUMBER_FACTS = BASE_NUMBER_FACTS | TRUTHY,
58     ZERO_NUMBER_STRICT_FACTS = BASE_NUMBER_STRICT_FACTS | FALSY,
59     ZERO_NUMBER_FACTS = BASE_NUMBER_FACTS,
60     NON_ZERO_NUMBER_FACTS = BASE_NUMBER_FACTS | TRUTHY,
61 
62     // String facts
63     BASE_STRING_STRICT_FACTS = TYPEOF_EQ_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BIGINT | TYPEOF_NE_BOOLEAN |
64                                TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
65                                NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
66     BASE_STRING_FACTS = BASE_STRING_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
67     STRING_FACTS = BASE_STRING_FACTS | TRUTHY,
68     EMPTY_STRING_STRICT_FACTS = BASE_STRING_STRICT_FACTS | FALSY | TRUTHY,
69     EMPTY_STRING_FACTS = BASE_STRING_FACTS,
70     NON_EMPTY_STRING_FACTS = BASE_STRING_FACTS | TRUTHY,
71 
72     // Symbol facts
73     BASE_SYMBOL_STRICT_FACTS = TYPEOF_EQ_SYMBOL | TYPEOF_NE_NUMBER | TYPEOF_NE_BIGINT | TYPEOF_NE_BOOLEAN |
74                                TYPEOF_NE_STRING | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
75                                NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
76     BASE_SYMBOL_FACTS = BASE_SYMBOL_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
77     SYMBOL_FACTS = BASE_SYMBOL_FACTS | TRUTHY,
78 
79     // Bigint facts
80     BASE_BIGINT_STRICT_FACTS = TYPEOF_EQ_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN |
81                                TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
82                                NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
83     BASE_BIGINT_FACTS = BASE_BIGINT_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
84     BIGINT_FACTS = BASE_BIGINT_FACTS | TRUTHY,
85     ZERO_BIGINT_STRICT_FACTS = BASE_BIGINT_STRICT_FACTS | FALSY,
86     ZERO_BIGINT_FACTS = BASE_BIGINT_FACTS,
87     NON_ZERO_BIGINT_FACTS = BASE_BIGINT_FACTS | TRUTHY,
88 
89     // Boolean facts
90     BASE_BOOLEAN_STRICT_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_EQ_BOOLEAN |
91                                 TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
92                                 NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
93     BASE_BOOLEAN_FACTS = BASE_BOOLEAN_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
94     BOOLEAN_FACTS = BASE_BOOLEAN_FACTS | TRUTHY,
95     FALSE_STRICT_FACTS = BASE_BOOLEAN_STRICT_FACTS | FALSY,
96     FALSE_FACTS = BASE_BOOLEAN_FACTS,
97     TRUE_STRICT_FACTS = BASE_BOOLEAN_STRICT_FACTS | TRUTHY,
98     TRUE_FACTS = BASE_BOOLEAN_FACTS | TRUTHY,
99 
100     // Object facts
101     OBJECT_STRICT_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN |
102                           TYPEOF_NE_SYMBOL | TYPEOF_EQ_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_EQ_HOST_OBJECT |
103                           NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL | TRUTHY,
104     OBJECT_FACTS = OBJECT_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
105     EMPTY_OBJECT_STRICT_FACTS = ALL & ~(EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL),
106     EMPTY_OBJECT_FACTS = ALL,
107 
108     // Function facts
109     FUNCTION_STRICT_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN |
110                             TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_EQ_FUNCTION | TYPEOF_EQ_HOST_OBJECT |
111                             NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL | TRUTHY,
112     FUNCTION_FACTS = FUNCTION_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
113 
114     // Undefined facts
115     UNDEFINED_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN | TYPEOF_NE_SYMBOL |
116                       TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT | EQ_UNDEFINED | NE_NULL |
117                       EQ_UNDEFINED_OR_NULL | FALSY,
118 
119     // Null facts
120     NULL_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN | TYPEOF_NE_SYMBOL |
121                  TYPEOF_EQ_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT | NE_UNDEFINED | EQ_NULL |
122                  EQ_UNDEFINED_OR_NULL | FALSY,
123 };
124 
125 DEFINE_BITOPS(TypeFacts)
126 
127 }  // namespace panda::es2panda::checker
128 
129 #endif /* TYPESCRIPT_TYPES_TYPE_FACTS_H */
130