1 /*
2  * Copyright (c) 2021-2024 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_CHECKER_ETSANALYZERHELPERS_H
17 #define ES2PANDA_CHECKER_ETSANALYZERHELPERS_H
18 
19 #include "checker/types/type.h"
20 #include "varbinder/ETSBinder.h"
21 #include "checker/ETSchecker.h"
22 #include "checker/ets/castingContext.h"
23 #include "checker/ets/typeRelationContext.h"
24 #include "util/helpers.h"
25 
26 #include <memory>
27 
28 namespace ark::es2panda::checker {
29 void CheckExtensionIsShadowedInCurrentClassOrInterface(checker::ETSChecker *checker, checker::ETSObjectType *objType,
30                                                        ir::ScriptFunction *extensionFunc,
31                                                        checker::Signature *signature);
32 void CheckExtensionIsShadowedByMethod(checker::ETSChecker *checker, checker::ETSObjectType *objType,
33                                       ir::ScriptFunction *extensionFunc, checker::Signature *signature);
34 void CheckExtensionMethod(checker::ETSChecker *checker, ir::ScriptFunction *extensionFunc, ir::MethodDefinition *node);
35 void DoBodyTypeChecking(ETSChecker *checker, ir::MethodDefinition *node, ir::ScriptFunction *scriptFunc);
36 void ComposeAsyncImplFuncReturnType(ETSChecker *checker, ir::ScriptFunction *scriptFunc);
37 void ComposeAsyncImplMethod(ETSChecker *checker, ir::MethodDefinition *node);
38 void CheckPredefinedMethodReturnType(ETSChecker *checker, ir::ScriptFunction *scriptFunc);
39 void CheckIteratorMethodReturnType(ETSChecker *checker, ir::ScriptFunction *scriptFunc,
40                                    const lexer::SourcePosition &position, const std::string &methodName);
41 checker::Type *InitAnonymousLambdaCallee(checker::ETSChecker *checker, ir::Expression *callee,
42                                          checker::Type *calleeType);
43 checker::Signature *ResolveCallExtensionFunction(checker::ETSFunctionType *functionType, checker::ETSChecker *checker,
44                                                  ir::CallExpression *expr);
45 checker::Signature *ResolveCallForETSExtensionFuncHelperType(checker::ETSExtensionFuncHelperType *type,
46                                                              checker::ETSChecker *checker, ir::CallExpression *expr);
47 ArenaVector<checker::Signature *> GetUnionTypeSignatures(ETSChecker *checker, checker::ETSUnionType *etsUnionType);
48 ArenaVector<checker::Signature *> &ChooseSignatures(ETSChecker *checker, checker::Type *calleeType,
49                                                     bool isConstructorCall, bool isFunctionalInterface,
50                                                     bool isUnionTypeWithFunctionalInterface);
51 checker::ETSObjectType *ChooseCalleeObj(ETSChecker *checker, ir::CallExpression *expr, checker::Type *calleeType,
52                                         bool isConstructorCall);
53 void ProcessExclamationMark(ETSChecker *checker, ir::UnaryExpression *expr, checker::Type *operandType);
54 void SetTsTypeForUnaryExpression(ETSChecker *checker, ir::UnaryExpression *expr, checker::Type *operandType);
55 checker::ETSObjectType *CreateSyntheticType(ETSChecker *checker, util::StringView const &syntheticName,
56                                             checker::ETSObjectType *lastObjectType, ir::Identifier *id);
57 checker::Type *GetIteratorType(ETSChecker *checker, checker::Type *elemType, ir::AstNode *left);
58 bool CheckArgumentVoidType(checker::Type *&funcReturnType, ETSChecker *checker, const std::string &name,
59                            ir::ReturnStatement *st);
60 bool CheckReturnType(ETSChecker *checker, checker::Type *funcReturnType, checker::Type *argumentType,
61                      ir::Expression *stArgument, bool isAsync);
62 void InferReturnType(ETSChecker *checker, ir::ScriptFunction *containingFunc, checker::Type *&funcReturnType,
63                      ir::Expression *stArgument);
64 void ProcessReturnStatements(ETSChecker *checker, ir::ScriptFunction *containingFunc, checker::Type *&funcReturnType,
65                              ir::ReturnStatement *st, ir::Expression *stArgument);
66 bool IsAsyncMethod(ir::AstNode *node);
67 
68 ETSObjectType *CreateOptionalSignaturesForFunctionalType(ETSChecker *checker, ir::ETSFunctionType *node,
69                                                          ETSObjectType *genericInterfaceType,
70                                                          Substitution *substitution, size_t optionalParameterIndex);
71 ETSObjectType *CreateInterfaceTypeForETSFunctionType(ETSChecker *checker, ir::ETSFunctionType *node,
72                                                      ETSObjectType *genericInterfaceType, Substitution *substitution);
73 Type *CreateParamTypeWithDefaultParam(ETSChecker *checker, ir::Expression *params);
74 
75 Type *InstantiateBoxedPrimitiveType(ETSChecker *checker, ir::Expression *param, Type *paramType);
76 }  // namespace ark::es2panda::checker
77 
78 #endif  // ES2PANDA_CHECKER_ETSANALYZERHELPERS_H
79