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