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