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