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