• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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