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