• 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_CHECKER_TYPES_TYPE_FACTS_H
17 #define ES2PANDA_COMPILER_CHECKER_TYPES_TYPE_FACTS_H
18 
19 #include "util/enumbitops.h"
20 
21 namespace panda::es2panda::checker {
22 enum class TypeFacts : uint32_t {
23     NONE = 0U,
24     TYPEOF_EQ_STRING = 1U << 0U,        // typeof x === "string"
25     TYPEOF_EQ_NUMBER = 1U << 1U,        // typeof x === "number"
26     TYPEOF_EQ_BIGINT = 1U << 2U,        // typeof x === "bigint"
27     TYPEOF_EQ_BOOLEAN = 1U << 3U,       // typeof x === "boolean"
28     TYPEOF_EQ_SYMBOL = 1U << 4U,        // typeof x === "symbol"
29     TYPEOF_EQ_OBJECT = 1U << 5U,        // typeof x === "object"
30     TYPEOF_EQ_FUNCTION = 1U << 6U,      // typeof x === "function"
31     TYPEOF_EQ_HOST_OBJECT = 1U << 7U,   // typeof x === "xxx"
32     TYPEOF_NE_STRING = 1U << 8U,        // typeof x !== "string"
33     TYPEOF_NE_NUMBER = 1U << 9U,        // typeof x !== "number"
34     TYPEOF_NE_BIGINT = 1U << 10U,       // typeof x !== "bigint"
35     TYPEOF_NE_BOOLEAN = 1U << 11U,      // typeof x !== "boolean"
36     TYPEOF_NE_SYMBOL = 1U << 12U,       // typeof x !== "symbol"
37     TYPEOF_NE_OBJECT = 1U << 13U,       // typeof x !== "object"
38     TYPEOF_NE_FUNCTION = 1U << 14U,     // typeof x !== "function"
39     TYPEOF_NE_HOST_OBJECT = 1U << 15U,  // typeof x !== "xxx"
40     EQ_UNDEFINED = 1U << 16U,           // x === undefined
41     EQ_NULL = 1U << 17U,                // x === null
42     EQ_UNDEFINED_OR_NULL = 1U << 18U,   // x === undefined / x === null
43     NE_UNDEFINED = 1U << 19U,           // x !== undefined
44     NE_NULL = 1U << 20U,                // x !== null
45     NE_UNDEFINED_OR_NULL = 1U << 21U,   // x != undefined / x != null
46     TRUTHY = 1U << 22U,                 // x
47     FALSY = 1U << 23U,                  // !x
48 
49     LAST = FALSY,
50     ALL = (LAST << 1U) - 1U,
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     // Bigint facts
73     BASE_BIGINT_STRICT_FACTS = TYPEOF_EQ_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN |
74                                TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
75                                NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
76     BASE_BIGINT_FACTS = BASE_BIGINT_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
77     BIGINT_FACTS = BASE_BIGINT_FACTS | TRUTHY,
78     ZERO_BIGINT_STRICT_FACTS = BASE_BIGINT_STRICT_FACTS | FALSY,
79     ZERO_BIGINT_FACTS = BASE_BIGINT_FACTS,
80     NON_ZERO_BIGINT_FACTS = BASE_BIGINT_FACTS | TRUTHY,
81 
82     // Boolean facts
83     BASE_BOOLEAN_STRICT_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_EQ_BOOLEAN |
84                                 TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT |
85                                 NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL,
86     BASE_BOOLEAN_FACTS = BASE_BOOLEAN_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
87     BOOLEAN_FACTS = BASE_BOOLEAN_FACTS | TRUTHY,
88     FALSE_STRICT_FACTS = BASE_BOOLEAN_STRICT_FACTS | FALSY,
89     FALSE_FACTS = BASE_BOOLEAN_FACTS,
90     TRUE_STRICT_FACTS = BASE_BOOLEAN_STRICT_FACTS | TRUTHY,
91     TRUE_FACTS = BASE_BOOLEAN_FACTS | TRUTHY,
92 
93     // Object facts
94     OBJECT_STRICT_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN |
95                           TYPEOF_NE_SYMBOL | TYPEOF_EQ_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_EQ_HOST_OBJECT |
96                           NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL | TRUTHY,
97     OBJECT_FACTS = OBJECT_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
98     EMPTY_OBJECT_STRICT_FACTS = ALL & ~(EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL),
99     EMPTY_OBJECT_FACTS = ALL,
100 
101     // Function facts
102     FUNCTION_STRICT_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN |
103                             TYPEOF_NE_SYMBOL | TYPEOF_NE_OBJECT | TYPEOF_EQ_FUNCTION | TYPEOF_EQ_HOST_OBJECT |
104                             NE_UNDEFINED | NE_NULL | NE_UNDEFINED_OR_NULL | TRUTHY,
105     FUNCTION_FACTS = FUNCTION_STRICT_FACTS | EQ_UNDEFINED | EQ_NULL | EQ_UNDEFINED_OR_NULL | FALSY,
106 
107     // Undefined facts
108     UNDEFINED_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN | TYPEOF_NE_SYMBOL |
109                       TYPEOF_NE_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT | EQ_UNDEFINED | NE_NULL |
110                       EQ_UNDEFINED_OR_NULL | FALSY,
111 
112     // Null facts
113     NULL_FACTS = TYPEOF_NE_BIGINT | TYPEOF_NE_STRING | TYPEOF_NE_NUMBER | TYPEOF_NE_BOOLEAN | TYPEOF_NE_SYMBOL |
114                  TYPEOF_EQ_OBJECT | TYPEOF_NE_FUNCTION | TYPEOF_NE_HOST_OBJECT | NE_UNDEFINED | EQ_NULL |
115                  EQ_UNDEFINED_OR_NULL | FALSY,
116 };
117 
118 DEFINE_BITOPS(TypeFacts)
119 }  // namespace panda::es2panda::checker
120 
121 #endif /* TYPESCRIPT_TYPES_TYPE_FACTS_H */
122