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