1 /** 2 * Copyright (c) 2021-2025 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_GLOBAL_TYPES_HOLDER_H 17 #define ES2PANDA_COMPILER_CHECKER_TYPES_GLOBAL_TYPES_HOLDER_H 18 19 #include "ir/astNodeFlags.h" 20 #include "checker/types/type.h" 21 22 namespace ark::es2panda::checker { 23 enum class GlobalTypeId : std::size_t { 24 NUMBER, 25 ANY, 26 STRING, 27 BOOLEAN, 28 VOID, 29 NULL_ID, 30 UNDEFINED, 31 UNKNOWN, 32 NEVER, 33 NON_PRIMITIVE, 34 BIGINT, 35 FALSE_ID, 36 TRUE_ID, 37 NUMBER_OR_BIGINT, 38 STRING_OR_NUMBER, 39 ZERO, 40 EMPTY_STRING, 41 ZERO_BIGINT, 42 PRIMITIVE, 43 EMPTY_TUPLE, 44 EMPTY_OBJECT, 45 RESOLVING_RETURN_TYPE, 46 ERROR_TYPE, 47 BYTE, 48 SHORT, 49 INT, 50 LONG, 51 FLOAT, 52 DOUBLE, 53 CHAR, 54 ETS_BOOLEAN, 55 ETS_STRING, 56 ETS_VOID, 57 ETS_OBJECT_BUILTIN, 58 ETS_NULL, 59 ETS_UNDEFINED, 60 ETS_UNION_UNDEFINED_NULL, 61 ETS_ANY, 62 ETS_NEVER, 63 ETS_UNION_UNDEFINED_NULL_OBJECT, 64 ETS_WILDCARD, 65 ETS_BOOLEAN_BUILTIN, 66 ETS_BYTE_BUILTIN, 67 ETS_CHAR_BUILTIN, 68 ETS_COMPARABLE_BUILTIN, 69 ETS_CONSOLE_BUILTIN, 70 ETS_DATE_BUILTIN, 71 ETS_DOUBLE_BUILTIN, 72 ETS_EXCEPTION_BUILTIN, 73 ETS_FLOAT_BUILTIN, 74 ETS_FLOATING_BUILTIN, 75 ETS_INT_BUILTIN, 76 ETS_INTEGRAL_BUILTIN, 77 ETS_LONG_BUILTIN, 78 ETS_MAP_BUILTIN, 79 ETS_RECORD_BUILTIN, 80 ETS_ERROR_BUILTIN, 81 ETS_RUNTIME_BUILTIN, 82 ETS_RUNTIME_LINKER_BUILTIN, 83 ETS_SET_BUILTIN, 84 ETS_SHORT_BUILTIN, 85 ETS_STACK_TRACE_ELEMENT_BUILTIN, 86 ETS_STACK_TRACE_BUILTIN, 87 ETS_ARRAY_INDEX_OUT_OF_BOUNDS_ERROR_BUILTIN, 88 ETS_ARITHMETIC_ERROR_BUILTIN, 89 ETS_CLASS_CAST_ERROR_BUILTIN, 90 ETS_ASSERTION_ERROR_BUILTIN, 91 ETS_DIVIDE_BY_ZERO_ERROR_BUILTIN, 92 ETS_NULL_POINTER_ERROR_BUILTIN, 93 ETS_UNCAUGHT_EXCEPTION_ERROR_BUILTIN, 94 ETS_STRING_BUILTIN, 95 ETS_STRING_BUILDER_BUILTIN, 96 ETS_TYPE_BUILTIN, 97 ETS_TYPES_BUILTIN, 98 ETS_PROMISE_BUILTIN, 99 ETS_FUNCTION_BUILTIN, 100 ETS_REGEXP_BUILTIN, 101 ETS_ARRAY_BUILTIN, 102 ETS_ARRAY, 103 ETS_INTEROP_JSRUNTIME_BUILTIN, 104 ETS_INTEROP_JSVALUE_BUILTIN, 105 ETS_BOX_BUILTIN, 106 ETS_BOOLEAN_BOX_BUILTIN, 107 ETS_BYTE_BOX_BUILTIN, 108 ETS_CHAR_BOX_BUILTIN, 109 ETS_SHORT_BOX_BUILTIN, 110 ETS_INT_BOX_BUILTIN, 111 ETS_LONG_BOX_BUILTIN, 112 ETS_FLOAT_BOX_BUILTIN, 113 ETS_DOUBLE_BOX_BUILTIN, 114 ETS_BIG_INT_BUILTIN, 115 ETS_BIG_INT, 116 117 ETS_FUNCTION0_CLASS, 118 ETS_FUNCTION1_CLASS, 119 ETS_FUNCTION2_CLASS, 120 ETS_FUNCTION3_CLASS, 121 ETS_FUNCTION4_CLASS, 122 ETS_FUNCTION5_CLASS, 123 ETS_FUNCTION6_CLASS, 124 ETS_FUNCTION7_CLASS, 125 ETS_FUNCTION8_CLASS, 126 ETS_FUNCTION9_CLASS, 127 ETS_FUNCTION10_CLASS, 128 ETS_FUNCTION11_CLASS, 129 ETS_FUNCTION12_CLASS, 130 ETS_FUNCTION13_CLASS, 131 ETS_FUNCTION14_CLASS, 132 ETS_FUNCTION15_CLASS, 133 ETS_FUNCTION16_CLASS, 134 ETS_FUNCTIONN_CLASS, 135 136 ETS_LAMBDA0_CLASS, 137 ETS_LAMBDA1_CLASS, 138 ETS_LAMBDA2_CLASS, 139 ETS_LAMBDA3_CLASS, 140 ETS_LAMBDA4_CLASS, 141 ETS_LAMBDA5_CLASS, 142 ETS_LAMBDA6_CLASS, 143 ETS_LAMBDA7_CLASS, 144 ETS_LAMBDA8_CLASS, 145 ETS_LAMBDA9_CLASS, 146 ETS_LAMBDA10_CLASS, 147 ETS_LAMBDA11_CLASS, 148 ETS_LAMBDA12_CLASS, 149 ETS_LAMBDA13_CLASS, 150 ETS_LAMBDA14_CLASS, 151 ETS_LAMBDA15_CLASS, 152 ETS_LAMBDA16_CLASS, 153 ETS_LAMBDAN_CLASS, 154 155 ETS_FUNCTIONR0_CLASS, 156 ETS_FUNCTIONR1_CLASS, 157 ETS_FUNCTIONR2_CLASS, 158 ETS_FUNCTIONR3_CLASS, 159 ETS_FUNCTIONR4_CLASS, 160 ETS_FUNCTIONR5_CLASS, 161 ETS_FUNCTIONR6_CLASS, 162 ETS_FUNCTIONR7_CLASS, 163 ETS_FUNCTIONR8_CLASS, 164 ETS_FUNCTIONR9_CLASS, 165 ETS_FUNCTIONR10_CLASS, 166 ETS_FUNCTIONR11_CLASS, 167 ETS_FUNCTIONR12_CLASS, 168 ETS_FUNCTIONR13_CLASS, 169 ETS_FUNCTIONR14_CLASS, 170 ETS_FUNCTIONR15_CLASS, 171 ETS_FUNCTIONR16_CLASS, 172 173 ETS_LAMBDAR0_CLASS, 174 ETS_LAMBDAR1_CLASS, 175 ETS_LAMBDAR2_CLASS, 176 ETS_LAMBDAR3_CLASS, 177 ETS_LAMBDAR4_CLASS, 178 ETS_LAMBDAR5_CLASS, 179 ETS_LAMBDAR6_CLASS, 180 ETS_LAMBDAR7_CLASS, 181 ETS_LAMBDAR8_CLASS, 182 ETS_LAMBDAR9_CLASS, 183 ETS_LAMBDAR10_CLASS, 184 ETS_LAMBDAR11_CLASS, 185 ETS_LAMBDAR12_CLASS, 186 ETS_LAMBDAR13_CLASS, 187 ETS_LAMBDAR14_CLASS, 188 ETS_LAMBDAR15_CLASS, 189 ETS_LAMBDAR16_CLASS, 190 191 ETS_TUPLE0_CLASS, 192 ETS_TUPLE1_CLASS, 193 ETS_TUPLE2_CLASS, 194 ETS_TUPLE3_CLASS, 195 ETS_TUPLE4_CLASS, 196 ETS_TUPLE5_CLASS, 197 ETS_TUPLE6_CLASS, 198 ETS_TUPLE7_CLASS, 199 ETS_TUPLE8_CLASS, 200 ETS_TUPLE9_CLASS, 201 ETS_TUPLE10_CLASS, 202 ETS_TUPLE11_CLASS, 203 ETS_TUPLE12_CLASS, 204 ETS_TUPLE13_CLASS, 205 ETS_TUPLE14_CLASS, 206 ETS_TUPLE15_CLASS, 207 ETS_TUPLE16_CLASS, 208 ETS_TUPLEN_CLASS, 209 210 TYPE_ERROR, 211 212 COUNT, 213 }; 214 215 using ExtensionAccessorMap = 216 ArenaUnorderedMap<util::StringView, ArenaUnorderedMap<checker::ETSObjectType *, Signature *>>; 217 218 class GlobalTypesHolder { 219 public: 220 explicit GlobalTypesHolder(ArenaAllocator *allocator); 221 ~GlobalTypesHolder() = default; 222 NO_COPY_SEMANTIC(GlobalTypesHolder); 223 NO_MOVE_SEMANTIC(GlobalTypesHolder); 224 225 void AddETSEscompatLayer(); 226 void AddEtsSpecificTypes(ArenaAllocator *allocator); 227 void AddEtsSpecificBuiltinTypes(); 228 void AddTSSpecificTypes(ArenaAllocator *allocator); 229 void AddFunctionTypes(ArenaAllocator *allocator); 230 void AddTupleTypes(ArenaAllocator *allocator); 231 232 // TS specific types 233 Type *GlobalNumberType(); 234 Type *GlobalAnyType(); 235 Type *GlobalStringType(); 236 Type *GlobalBooleanType(); 237 Type *GlobalVoidType(); 238 Type *GlobalNullType(); 239 Type *GlobalUndefinedType(); 240 Type *GlobalUnknownType(); 241 Type *GlobalNeverType(); 242 Type *GlobalNonPrimitiveType(); 243 Type *GlobalBigintType(); 244 Type *GlobalFalseType(); 245 Type *GlobalTrueType(); 246 Type *GlobalNumberOrBigintType(); 247 Type *GlobalStringOrNumberType(); 248 Type *GlobalZeroType(); 249 Type *GlobalEmptyStringType(); 250 Type *GlobalZeroBigintType(); 251 Type *GlobalPrimitiveType(); 252 Type *GlobalEmptyTupleType(); 253 Type *GlobalEmptyObjectType(); 254 Type *GlobalResolvingReturnType(); 255 Type *GlobalErrorType(); 256 257 // ETS specific types 258 Type *GlobalByteType(); 259 Type *GlobalShortType(); 260 Type *GlobalIntType(); 261 Type *GlobalLongType(); 262 Type *GlobalFloatType(); 263 Type *GlobalDoubleType(); 264 Type *GlobalCharType(); 265 Type *GlobalETSBooleanType(); 266 Type *GlobalETSStringLiteralType(); 267 Type *GlobalETSVoidType(); 268 Type *GlobalETSObjectType(); 269 Type *GlobalETSNullType(); 270 Type *GlobalETSUndefinedType(); 271 Type *GlobalETSAnyType(); 272 Type *GlobalETSNeverType(); 273 Type *GlobalETSUnionUndefinedNull(); 274 Type *GlobalETSUnionUndefinedNullObject(); 275 Type *GlobalWildcardType(); 276 Type *GlobalETSBooleanBuiltinType(); 277 Type *GlobalByteBuiltinType(); 278 Type *GlobalCharBuiltinType(); 279 Type *GlobalComparableBuiltinType(); 280 Type *GlobalConsoleBuiltinType(); 281 Type *GlobalDoubleBuiltinType(); 282 Type *GlobalExceptionBuiltinType(); 283 Type *GlobalFloatBuiltinType(); 284 Type *GlobalFloatingBuiltinType(); 285 Type *GlobalIntegerBuiltinType(); 286 Type *GlobalIntegralBuiltinType(); 287 Type *GlobalLongBuiltinType(); 288 Type *GlobalErrorBuiltinType(); 289 Type *GlobalRuntimeBuiltinType(); 290 Type *GlobalShortBuiltinType(); 291 Type *GlobalStackTraceElementBuiltinType(); 292 Type *GlobalStackTraceBuiltinType(); 293 Type *GlobalArrayIndexOutOfBoundsErrorBuiltinType(); 294 Type *GlobalArithmeticErrorBuiltinType(); 295 [[nodiscard]] Type *GlobalClassCastErrorBuiltinType() const noexcept; 296 Type *GlobalETSStringBuiltinType(); 297 Type *GlobalETSBigIntBuiltinType(); 298 Type *GlobalETSBigIntLiteralType(); 299 Type *GlobalStringBuilderBuiltinType(); 300 Type *GlobalTypeBuiltinType(); 301 Type *GlobalTypesBuiltinType(); 302 Type *GlobalPromiseBuiltinType(); 303 Type *GlobalFunctionBuiltinType(); 304 Type *GlobalBoxBuiltinType(); 305 Type *GlobalBooleanBoxBuiltinType(); 306 Type *GlobalByteBoxBuiltinType(); 307 Type *GlobalCharBoxBuiltinType(); 308 Type *GlobalShortBoxBuiltinType(); 309 Type *GlobalIntBoxBuiltinType(); 310 Type *GlobalLongBoxBuiltinType(); 311 Type *GlobalFloatBoxBuiltinType(); 312 Type *GlobalDoubleBoxBuiltinType(); 313 314 // Functional types 315 size_t VariadicFunctionTypeThreshold(); 316 Type *GlobalFunctionBuiltinType(size_t nargs, bool hasRest); 317 Type *GlobalLambdaBuiltinType(size_t nargs, bool hasRest); 318 319 // Tuple types 320 Type *GlobalTupleBuiltinType(size_t nargs); 321 size_t VariadicTupleTypeThreshold(); 322 323 // ETS escompat layer 324 Type *GlobalArrayBuiltinType(); 325 Type *GlobalAssertionErrorBuiltinType(); 326 Type *GlobalDivideByZeroErrorBuiltinType(); 327 Type *GlobalNullPointerErrorBuiltinType(); 328 Type *GlobalUncaughtExceptionErrorBuiltinType(); 329 Type *GlobalMapBuiltinType(); 330 Type *GlobalRecordBuiltinType(); 331 Type *GlobalRegExpBuiltinType(); 332 Type *GlobalSetBuiltinType(); 333 334 // JS specific types 335 Type *GlobalJSRuntimeBuiltinType(); 336 Type *GlobalJSValueBuiltinType(); 337 338 Type *GlobalTypeError(); 339 340 void InitializeBuiltin(util::StringView name, Type *type); 341 342 using Holder = std::array<Type *, static_cast<size_t>(GlobalTypeId::COUNT)>; 343 GlobalTypes()344 Holder &GlobalTypes() 345 { 346 return globalTypes_; 347 } 348 GlobalTypes()349 const Holder &GlobalTypes() const 350 { 351 return globalTypes_; 352 } 353 NameToId(util::StringView name)354 std::optional<GlobalTypeId> NameToId(util::StringView name) const 355 { 356 if (auto it = builtinNameMappings_.find(name); it != builtinNameMappings_.end()) { 357 return it->second; 358 } 359 return std::nullopt; 360 } 361 FindExtensionSetterInMap(util::StringView name,ETSObjectType * type)362 Signature *FindExtensionSetterInMap(util::StringView name, ETSObjectType *type) 363 { 364 return FindExtensionAccessorInMap(name, type, extensionSetterMaps_); 365 } 366 FindExtensionGetterInMap(util::StringView name,ETSObjectType * type)367 Signature *FindExtensionGetterInMap(util::StringView name, ETSObjectType *type) 368 { 369 return FindExtensionAccessorInMap(name, type, extensionGetterMaps_); 370 } 371 InsertExtensionSetterToMap(util::StringView name,ETSObjectType * type,Signature * sig)372 void InsertExtensionSetterToMap(util::StringView name, ETSObjectType *type, Signature *sig) 373 { 374 InsertExtensionAccessorToMap(name, type, sig, extensionSetterMaps_); 375 } 376 InsertExtensionGetterToMap(util::StringView name,ETSObjectType * type,Signature * sig)377 void InsertExtensionGetterToMap(util::StringView name, ETSObjectType *type, Signature *sig) 378 { 379 InsertExtensionAccessorToMap(name, type, sig, extensionGetterMaps_); 380 } 381 382 private: 383 Signature *FindExtensionAccessorInMap(util::StringView name, ETSObjectType *type, ExtensionAccessorMap &maps) const; 384 void InsertExtensionAccessorToMap(util::StringView name, ETSObjectType *type, Signature *sig, 385 ExtensionAccessorMap &maps); 386 387 Holder globalTypes_ {}; 388 ArenaAllocator *allocator_; 389 ArenaMap<util::StringView, GlobalTypeId> builtinNameMappings_; 390 ExtensionAccessorMap extensionGetterMaps_; 391 ExtensionAccessorMap extensionSetterMaps_; 392 }; 393 } // namespace ark::es2panda::checker 394 395 #endif /* ES2PANDA_COMPILER_CHECKER_TYPES_TS_GLOBAL_TYPES_HOLDER_H */ 396