13af6ab5fSopenharmony_ci/* 23af6ab5fSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License. 53af6ab5fSopenharmony_ci * You may obtain a copy of the License at 63af6ab5fSopenharmony_ci * 73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 83af6ab5fSopenharmony_ci * 93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and 133af6ab5fSopenharmony_ci * limitations under the License. 143af6ab5fSopenharmony_ci */ 153af6ab5fSopenharmony_ci 163af6ab5fSopenharmony_ci#ifndef ES2PANDA_CHECKER_TS_CHECKER_H 173af6ab5fSopenharmony_ci#define ES2PANDA_CHECKER_TS_CHECKER_H 183af6ab5fSopenharmony_ci 193af6ab5fSopenharmony_ci#include "checker/checker.h" 203af6ab5fSopenharmony_ci#include "varbinder/enumMemberResult.h" 213af6ab5fSopenharmony_ci#include "checker/types/globalTypesHolder.h" 223af6ab5fSopenharmony_ci#include "checker/types/ts/types.h" 233af6ab5fSopenharmony_ci#include "util/enumbitops.h" 243af6ab5fSopenharmony_ci#include "util/ustring.h" 253af6ab5fSopenharmony_ci#include "macros.h" 263af6ab5fSopenharmony_ci 273af6ab5fSopenharmony_ci#include <cstdint> 283af6ab5fSopenharmony_ci#include <initializer_list> 293af6ab5fSopenharmony_ci#include <unordered_map> 303af6ab5fSopenharmony_ci#include <unordered_set> 313af6ab5fSopenharmony_ci 323af6ab5fSopenharmony_cinamespace ark::es2panda::varbinder { 333af6ab5fSopenharmony_ciclass VarBinder; 343af6ab5fSopenharmony_ciclass Decl; 353af6ab5fSopenharmony_ciclass EnumVariable; 363af6ab5fSopenharmony_ciclass FunctionDecl; 373af6ab5fSopenharmony_ciclass LocalVariable; 383af6ab5fSopenharmony_ciclass Scope; 393af6ab5fSopenharmony_ciclass Variable; 403af6ab5fSopenharmony_ci} // namespace ark::es2panda::varbinder 413af6ab5fSopenharmony_ci 423af6ab5fSopenharmony_cinamespace ark::es2panda::ir { 433af6ab5fSopenharmony_ciclass AstNode; 443af6ab5fSopenharmony_ciclass SpreadElement; 453af6ab5fSopenharmony_ciclass AssignmentExpression; 463af6ab5fSopenharmony_ciclass Property; 473af6ab5fSopenharmony_ciclass Expression; 483af6ab5fSopenharmony_ciclass ScriptFunction; 493af6ab5fSopenharmony_ciclass UnaryExpression; 503af6ab5fSopenharmony_ciclass BinaryExpression; 513af6ab5fSopenharmony_ciclass Identifier; 523af6ab5fSopenharmony_ciclass MemberExpression; 533af6ab5fSopenharmony_ciclass TSEnumDeclaration; 543af6ab5fSopenharmony_ciclass TSInterfaceDeclaration; 553af6ab5fSopenharmony_ciclass ObjectExpression; 563af6ab5fSopenharmony_ciclass TSArrayType; 573af6ab5fSopenharmony_ciclass TSUnionType; 583af6ab5fSopenharmony_ciclass TSFunctionType; 593af6ab5fSopenharmony_ciclass TSConstructorType; 603af6ab5fSopenharmony_ciclass TSTypeLiteral; 613af6ab5fSopenharmony_ciclass TSTypeReference; 623af6ab5fSopenharmony_ciclass TSQualifiedName; 633af6ab5fSopenharmony_ciclass TSIndexedAccessType; 643af6ab5fSopenharmony_ciclass TSInterfaceHeritage; 653af6ab5fSopenharmony_ciclass TSTypeQuery; 663af6ab5fSopenharmony_ciclass TSTupleType; 673af6ab5fSopenharmony_ciclass ArrayExpression; 683af6ab5fSopenharmony_ciclass Statement; 693af6ab5fSopenharmony_ciclass TSTypeParameterDeclaration; 703af6ab5fSopenharmony_ciclass TSTypeParameterInstantiation; 713af6ab5fSopenharmony_ciclass BlockStatement; 723af6ab5fSopenharmony_ciclass VariableDeclaration; 733af6ab5fSopenharmony_ciclass IfStatement; 743af6ab5fSopenharmony_ciclass DoWhileStatement; 753af6ab5fSopenharmony_ciclass WhileStatement; 763af6ab5fSopenharmony_ciclass ForUpdateStatement; 773af6ab5fSopenharmony_ciclass ForInStatement; 783af6ab5fSopenharmony_ciclass ForOfStatement; 793af6ab5fSopenharmony_ciclass ReturnStatement; 803af6ab5fSopenharmony_ciclass SwitchStatement; 813af6ab5fSopenharmony_ciclass LabelledStatement; 823af6ab5fSopenharmony_ciclass ThrowStatement; 833af6ab5fSopenharmony_ciclass TryStatement; 843af6ab5fSopenharmony_ciclass TSTypeAliasDeclaration; 853af6ab5fSopenharmony_ciclass TSAsExpression; 863af6ab5fSopenharmony_ciclass ThisExpression; 873af6ab5fSopenharmony_ciclass TypeofExpression; 883af6ab5fSopenharmony_ciclass NewExpression; 893af6ab5fSopenharmony_ciclass FunctionExpression; 903af6ab5fSopenharmony_ciclass AwaitExpression; 913af6ab5fSopenharmony_ciclass UpdateExpression; 923af6ab5fSopenharmony_ciclass ConditionalExpression; 933af6ab5fSopenharmony_ciclass YieldExpression; 943af6ab5fSopenharmony_ciclass ArrowFunctionExpression; 953af6ab5fSopenharmony_ciclass TemplateLiteral; 963af6ab5fSopenharmony_ciclass TaggedTemplateExpression; 973af6ab5fSopenharmony_ciclass TSIndexSignature; 983af6ab5fSopenharmony_ciclass TSSignatureDeclaration; 993af6ab5fSopenharmony_ciclass TSPropertySignature; 1003af6ab5fSopenharmony_ciclass TSMethodSignature; 1013af6ab5fSopenharmony_ciclass ChainExpression; 1023af6ab5fSopenharmony_ciclass VariableDeclarator; 1033af6ab5fSopenharmony_ci 1043af6ab5fSopenharmony_cienum class AstNodeType; 1053af6ab5fSopenharmony_ci} // namespace ark::es2panda::ir 1063af6ab5fSopenharmony_ci 1073af6ab5fSopenharmony_cinamespace ark::es2panda::checker { 1083af6ab5fSopenharmony_ci 1093af6ab5fSopenharmony_cistruct ExpressionTypeInfo { 1103af6ab5fSopenharmony_ci Type *leftType; 1113af6ab5fSopenharmony_ci Type *rightType; 1123af6ab5fSopenharmony_ci}; 1133af6ab5fSopenharmony_ci 1143af6ab5fSopenharmony_cistruct TupleTypeInfo { 1153af6ab5fSopenharmony_ci ElementFlags combinedFlags; 1163af6ab5fSopenharmony_ci uint32_t minLength; 1173af6ab5fSopenharmony_ci uint32_t fixedLength; 1183af6ab5fSopenharmony_ci bool readonly; 1193af6ab5fSopenharmony_ci}; 1203af6ab5fSopenharmony_ci 1213af6ab5fSopenharmony_ciclass TSChecker : public Checker { 1223af6ab5fSopenharmony_cipublic: 1233af6ab5fSopenharmony_ci // NOLINTNEXTLINE(readability-redundant-member-init) 1243af6ab5fSopenharmony_ci explicit TSChecker() : Checker() {} 1253af6ab5fSopenharmony_ci 1263af6ab5fSopenharmony_ci Type *GlobalNumberType() 1273af6ab5fSopenharmony_ci { 1283af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalNumberType(); 1293af6ab5fSopenharmony_ci } 1303af6ab5fSopenharmony_ci 1313af6ab5fSopenharmony_ci Type *GlobalAnyType() 1323af6ab5fSopenharmony_ci { 1333af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalAnyType(); 1343af6ab5fSopenharmony_ci } 1353af6ab5fSopenharmony_ci 1363af6ab5fSopenharmony_ci Type *GlobalStringType() 1373af6ab5fSopenharmony_ci { 1383af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalStringType(); 1393af6ab5fSopenharmony_ci } 1403af6ab5fSopenharmony_ci 1413af6ab5fSopenharmony_ci Type *GlobalBooleanType() 1423af6ab5fSopenharmony_ci { 1433af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalBooleanType(); 1443af6ab5fSopenharmony_ci } 1453af6ab5fSopenharmony_ci 1463af6ab5fSopenharmony_ci Type *GlobalVoidType() 1473af6ab5fSopenharmony_ci { 1483af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalVoidType(); 1493af6ab5fSopenharmony_ci } 1503af6ab5fSopenharmony_ci 1513af6ab5fSopenharmony_ci Type *GlobalNullType() 1523af6ab5fSopenharmony_ci { 1533af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalNullType(); 1543af6ab5fSopenharmony_ci } 1553af6ab5fSopenharmony_ci 1563af6ab5fSopenharmony_ci Type *GlobalUndefinedType() 1573af6ab5fSopenharmony_ci { 1583af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalUndefinedType(); 1593af6ab5fSopenharmony_ci } 1603af6ab5fSopenharmony_ci 1613af6ab5fSopenharmony_ci Type *GlobalUnknownType() 1623af6ab5fSopenharmony_ci { 1633af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalUnknownType(); 1643af6ab5fSopenharmony_ci } 1653af6ab5fSopenharmony_ci 1663af6ab5fSopenharmony_ci Type *GlobalNeverType() 1673af6ab5fSopenharmony_ci { 1683af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalNeverType(); 1693af6ab5fSopenharmony_ci } 1703af6ab5fSopenharmony_ci 1713af6ab5fSopenharmony_ci Type *GlobalNonPrimitiveType() 1723af6ab5fSopenharmony_ci { 1733af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalNonPrimitiveType(); 1743af6ab5fSopenharmony_ci } 1753af6ab5fSopenharmony_ci 1763af6ab5fSopenharmony_ci Type *GlobalBigintType() 1773af6ab5fSopenharmony_ci { 1783af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalBigintType(); 1793af6ab5fSopenharmony_ci } 1803af6ab5fSopenharmony_ci 1813af6ab5fSopenharmony_ci Type *GlobalFalseType() 1823af6ab5fSopenharmony_ci { 1833af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalFalseType(); 1843af6ab5fSopenharmony_ci } 1853af6ab5fSopenharmony_ci 1863af6ab5fSopenharmony_ci Type *GlobalTrueType() 1873af6ab5fSopenharmony_ci { 1883af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalTrueType(); 1893af6ab5fSopenharmony_ci } 1903af6ab5fSopenharmony_ci 1913af6ab5fSopenharmony_ci Type *GlobalNumberOrBigintType() 1923af6ab5fSopenharmony_ci { 1933af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalNumberOrBigintType(); 1943af6ab5fSopenharmony_ci } 1953af6ab5fSopenharmony_ci 1963af6ab5fSopenharmony_ci Type *GlobalStringOrNumberType() 1973af6ab5fSopenharmony_ci { 1983af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalStringOrNumberType(); 1993af6ab5fSopenharmony_ci } 2003af6ab5fSopenharmony_ci 2013af6ab5fSopenharmony_ci Type *GlobalZeroType() 2023af6ab5fSopenharmony_ci { 2033af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalZeroType(); 2043af6ab5fSopenharmony_ci } 2053af6ab5fSopenharmony_ci 2063af6ab5fSopenharmony_ci Type *GlobalEmptyStringType() 2073af6ab5fSopenharmony_ci { 2083af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalEmptyStringType(); 2093af6ab5fSopenharmony_ci } 2103af6ab5fSopenharmony_ci 2113af6ab5fSopenharmony_ci Type *GlobalZeroBigintType() 2123af6ab5fSopenharmony_ci { 2133af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalZeroBigintType(); 2143af6ab5fSopenharmony_ci } 2153af6ab5fSopenharmony_ci 2163af6ab5fSopenharmony_ci Type *GlobalPrimitiveType() 2173af6ab5fSopenharmony_ci { 2183af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalPrimitiveType(); 2193af6ab5fSopenharmony_ci } 2203af6ab5fSopenharmony_ci 2213af6ab5fSopenharmony_ci Type *GlobalEmptyTupleType() 2223af6ab5fSopenharmony_ci { 2233af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalEmptyTupleType(); 2243af6ab5fSopenharmony_ci } 2253af6ab5fSopenharmony_ci 2263af6ab5fSopenharmony_ci Type *GlobalEmptyObjectType() 2273af6ab5fSopenharmony_ci { 2283af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalEmptyObjectType(); 2293af6ab5fSopenharmony_ci } 2303af6ab5fSopenharmony_ci 2313af6ab5fSopenharmony_ci Type *GlobalResolvingReturnType() 2323af6ab5fSopenharmony_ci { 2333af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalResolvingReturnType(); 2343af6ab5fSopenharmony_ci } 2353af6ab5fSopenharmony_ci 2363af6ab5fSopenharmony_ci Type *GlobalErrorType() 2373af6ab5fSopenharmony_ci { 2383af6ab5fSopenharmony_ci return GetGlobalTypesHolder()->GlobalErrorType(); 2393af6ab5fSopenharmony_ci } 2403af6ab5fSopenharmony_ci 2413af6ab5fSopenharmony_ci NumberLiteralPool &NumberLiteralMap() 2423af6ab5fSopenharmony_ci { 2433af6ab5fSopenharmony_ci return numberLiteralMap_; 2443af6ab5fSopenharmony_ci } 2453af6ab5fSopenharmony_ci 2463af6ab5fSopenharmony_ci StringLiteralPool &StringLiteralMap() 2473af6ab5fSopenharmony_ci { 2483af6ab5fSopenharmony_ci return stringLiteralMap_; 2493af6ab5fSopenharmony_ci } 2503af6ab5fSopenharmony_ci 2513af6ab5fSopenharmony_ci StringLiteralPool &BigintLiteralMap() 2523af6ab5fSopenharmony_ci { 2533af6ab5fSopenharmony_ci return bigintLiteralMap_; 2543af6ab5fSopenharmony_ci } 2553af6ab5fSopenharmony_ci 2563af6ab5fSopenharmony_ci bool StartChecker([[maybe_unused]] varbinder::VarBinder *varbinder, const CompilerOptions &options) override; 2573af6ab5fSopenharmony_ci Type *CheckTypeCached(ir::Expression *expr) override; 2583af6ab5fSopenharmony_ci 2593af6ab5fSopenharmony_ci // Util 2603af6ab5fSopenharmony_ci static bool InAssignment(ir::AstNode *node); 2613af6ab5fSopenharmony_ci static bool IsAssignmentOperator(lexer::TokenType op); 2623af6ab5fSopenharmony_ci static bool IsLiteralType(const Type *type); 2633af6ab5fSopenharmony_ci static ir::AstNode *FindAncestorUntilGivenType(ir::AstNode *node, ir::AstNodeType stop); 2643af6ab5fSopenharmony_ci static bool MaybeTypeOfKind(const Type *type, TypeFlag flags); 2653af6ab5fSopenharmony_ci static bool MaybeTypeOfKind(const Type *type, ObjectType::ObjectTypeKind kind); 2663af6ab5fSopenharmony_ci static bool IsConstantMemberAccess(ir::Expression *expr); 2673af6ab5fSopenharmony_ci static bool IsStringLike(ir::Expression *expr); 2683af6ab5fSopenharmony_ci static ir::MemberExpression *ResolveLeftMostMemberExpression(ir::MemberExpression *expr); 2693af6ab5fSopenharmony_ci 2703af6ab5fSopenharmony_ci // Helpers 2713af6ab5fSopenharmony_ci void CheckTruthinessOfType(Type *type, lexer::SourcePosition lineInfo); 2723af6ab5fSopenharmony_ci Type *CheckNonNullType(Type *type, lexer::SourcePosition lineInfo); 2733af6ab5fSopenharmony_ci Type *GetBaseTypeOfLiteralType(Type *type); 2743af6ab5fSopenharmony_ci void CheckReferenceExpression(ir::Expression *expr, const char *invalidReferenceMsg, 2753af6ab5fSopenharmony_ci const char *invalidOptionalChainMsg); 2763af6ab5fSopenharmony_ci void CheckTestingKnownTruthyCallableOrAwaitableType(ir::Expression *condExpr, Type *type, ir::AstNode *body); 2773af6ab5fSopenharmony_ci Type *ExtractDefinitelyFalsyTypes(Type *type); 2783af6ab5fSopenharmony_ci Type *RemoveDefinitelyFalsyTypes(Type *type); 2793af6ab5fSopenharmony_ci TypeFlag GetFalsyFlags(Type *type); 2803af6ab5fSopenharmony_ci bool IsVariableUsedInConditionBody(ir::AstNode *parent, varbinder::Variable *searchVar); 2813af6ab5fSopenharmony_ci bool FindVariableInBinaryExpressionChain(ir::AstNode *parent, varbinder::Variable *searchVar); 2823af6ab5fSopenharmony_ci bool IsVariableUsedInBinaryExpressionChain(ir::AstNode *parent, varbinder::Variable *searchVar); 2833af6ab5fSopenharmony_ci [[noreturn]] void ThrowBinaryLikeError(lexer::TokenType op, Type *leftType, Type *rightType, 2843af6ab5fSopenharmony_ci lexer::SourcePosition lineInfo); 2853af6ab5fSopenharmony_ci [[noreturn]] void ThrowAssignmentError(Type *source, Type *target, lexer::SourcePosition lineInfo, 2863af6ab5fSopenharmony_ci bool isAsSrcLeftType = false); 2873af6ab5fSopenharmony_ci void ElaborateElementwise(Type *targetType, ir::Expression *sourceNode, const lexer::SourcePosition &pos); 2883af6ab5fSopenharmony_ci void InferSimpleVariableDeclaratorType(ir::VariableDeclarator *declarator); 2893af6ab5fSopenharmony_ci void GetTypeVar(varbinder::Decl *decl); 2903af6ab5fSopenharmony_ci void GetTypeParam(varbinder::Variable *var, varbinder::Decl *decl); 2913af6ab5fSopenharmony_ci void GetTypeEnum(varbinder::Variable *var, varbinder::Decl *decl); 2923af6ab5fSopenharmony_ci Type *GetDeclTsType(varbinder::Variable *var, varbinder::Decl *decl); 2933af6ab5fSopenharmony_ci Type *GetTypeOfVariable(varbinder::Variable *var) override; 2943af6ab5fSopenharmony_ci Type *GetUnaryResultType(Type *operandType); 2953af6ab5fSopenharmony_ci Type *GetTypeFromClassOrInterfaceReference(ir::TSTypeReference *node, varbinder::Variable *var); 2963af6ab5fSopenharmony_ci Type *GetTypeFromTypeAliasReference(ir::TSTypeReference *node, varbinder::Variable *var); 2973af6ab5fSopenharmony_ci Type *GetTypeReferenceType(ir::TSTypeReference *node, varbinder::Variable *var); 2983af6ab5fSopenharmony_ci 2993af6ab5fSopenharmony_ci // Type creation 3003af6ab5fSopenharmony_ci Type *CreateNumberLiteralType(double value); 3013af6ab5fSopenharmony_ci Type *CreateBigintLiteralType(const util::StringView &str, bool negative); 3023af6ab5fSopenharmony_ci Type *CreateStringLiteralType(const util::StringView &str); 3033af6ab5fSopenharmony_ci Type *CreateFunctionTypeWithSignature(Signature *callSignature); 3043af6ab5fSopenharmony_ci Type *CreateConstructorTypeWithSignature(Signature *constructSignature); 3053af6ab5fSopenharmony_ci Type *CreateTupleType(ObjectDescriptor *desc, ArenaVector<ElementFlags> &&elementFlags, 3063af6ab5fSopenharmony_ci const TupleTypeInfo &tupleTypeInfo); 3073af6ab5fSopenharmony_ci Type *CreateTupleType(ObjectDescriptor *desc, ArenaVector<ElementFlags> &&elementFlags, 3083af6ab5fSopenharmony_ci const TupleTypeInfo &tupleTypeInfo, NamedTupleMemberPool &&namedMembers); 3093af6ab5fSopenharmony_ci Type *CreateUnionType(std::initializer_list<Type *> constituentTypes); 3103af6ab5fSopenharmony_ci Type *CreateUnionType(ArenaVector<Type *> &&constituentTypes); 3113af6ab5fSopenharmony_ci Type *CreateUnionType(ArenaVector<Type *> &constituentTypes); 3123af6ab5fSopenharmony_ci Type *CreateObjectTypeWithCallSignature(Signature *callSignature); 3133af6ab5fSopenharmony_ci Type *CreateObjectTypeWithConstructSignature(Signature *constructSignature); 3143af6ab5fSopenharmony_ci 3153af6ab5fSopenharmony_ci // Object 3163af6ab5fSopenharmony_ci void ResolvePropertiesOfObjectType(ObjectType *type, ir::AstNode *member, 3173af6ab5fSopenharmony_ci ArenaVector<ir::TSSignatureDeclaration *> &signatureDeclarations, 3183af6ab5fSopenharmony_ci ArenaVector<ir::TSIndexSignature *> &indexDeclarations, bool isInterface); 3193af6ab5fSopenharmony_ci void ResolveSignaturesOfObjectType(ObjectType *type, 3203af6ab5fSopenharmony_ci ArenaVector<ir::TSSignatureDeclaration *> &signatureDeclarations); 3213af6ab5fSopenharmony_ci void ResolveIndexInfosOfObjectType(ObjectType *type, ArenaVector<ir::TSIndexSignature *> &indexDeclarations); 3223af6ab5fSopenharmony_ci void ResolveDeclaredMembers(InterfaceType *type); 3233af6ab5fSopenharmony_ci bool ValidateInterfaceMemberRedeclaration(ObjectType *type, varbinder::Variable *prop, 3243af6ab5fSopenharmony_ci const lexer::SourcePosition &locInfo); 3253af6ab5fSopenharmony_ci varbinder::Variable *GetPropertyOfType(Type *type, const util::StringView &name, bool getPartial = false, 3263af6ab5fSopenharmony_ci varbinder::VariableFlags propagateFlags = varbinder::VariableFlags::NONE); 3273af6ab5fSopenharmony_ci varbinder::Variable *GetPropertyOfUnionType(UnionType *type, const util::StringView &name, bool getPartial, 3283af6ab5fSopenharmony_ci varbinder::VariableFlags propagateFlags); 3293af6ab5fSopenharmony_ci void CheckIndexConstraints(Type *type); 3303af6ab5fSopenharmony_ci void ResolveUnionTypeMembers(UnionType *type); 3313af6ab5fSopenharmony_ci void ResolveObjectTypeMembers(ObjectType *type); 3323af6ab5fSopenharmony_ci void ResolveInterfaceOrClassTypeMembers(InterfaceType *type); 3333af6ab5fSopenharmony_ci Type *CheckComputedPropertyName(ir::Expression *key); 3343af6ab5fSopenharmony_ci Type *GetPropertyTypeForIndexType(Type *type, Type *indexType); 3353af6ab5fSopenharmony_ci IndexInfo *GetApplicableIndexInfo(Type *type, Type *indexType); 3363af6ab5fSopenharmony_ci ArenaVector<ObjectType *> GetBaseTypes(InterfaceType *type); 3373af6ab5fSopenharmony_ci void ResolveStructuredTypeMembers(Type *type) override; 3383af6ab5fSopenharmony_ci 3393af6ab5fSopenharmony_ci // Function 3403af6ab5fSopenharmony_ci Type *HandleFunctionReturn(ir::ScriptFunction *func); 3413af6ab5fSopenharmony_ci void CheckFunctionParameterDeclarations(const ArenaVector<ir::Expression *> ¶ms, SignatureInfo *signatureInfo); 3423af6ab5fSopenharmony_ci std::tuple<varbinder::LocalVariable *, varbinder::LocalVariable *, bool> CheckFunctionParameter( 3433af6ab5fSopenharmony_ci ir::Expression *param, SignatureInfo *signatureInfo); 3443af6ab5fSopenharmony_ci std::tuple<varbinder::LocalVariable *, varbinder::LocalVariable *, bool> CheckFunctionIdentifierParameter( 3453af6ab5fSopenharmony_ci ir::Identifier *param); 3463af6ab5fSopenharmony_ci std::tuple<varbinder::LocalVariable *, varbinder::LocalVariable *, bool> CheckFunctionAssignmentPatternParameter( 3473af6ab5fSopenharmony_ci ir::AssignmentExpression *param); 3483af6ab5fSopenharmony_ci std::tuple<varbinder::LocalVariable *, varbinder::LocalVariable *, bool> CheckFunctionRestParameter( 3493af6ab5fSopenharmony_ci ir::SpreadElement *param, SignatureInfo *signatureInfo); 3503af6ab5fSopenharmony_ci std::tuple<varbinder::LocalVariable *, varbinder::LocalVariable *, bool> CheckFunctionArrayPatternParameter( 3513af6ab5fSopenharmony_ci ir::ArrayExpression *param); 3523af6ab5fSopenharmony_ci std::tuple<varbinder::LocalVariable *, varbinder::LocalVariable *, bool> CheckFunctionObjectPatternParameter( 3533af6ab5fSopenharmony_ci ir::ObjectExpression *param); 3543af6ab5fSopenharmony_ci void ValidateSubsequentNode(const ir::Statement *const subsequentNode, const ir::ScriptFunction *const func); 3553af6ab5fSopenharmony_ci void CheckOverloadSignatureCompatibility(Signature *bodyCallSignature, Signature *signature); 3563af6ab5fSopenharmony_ci void InferFunctionDeclarationType(const varbinder::FunctionDecl *decl, varbinder::Variable *funcVar); 3573af6ab5fSopenharmony_ci void CollectTypesFromReturnStatements(ir::AstNode *parent, ArenaVector<Type *> *returnTypes); 3583af6ab5fSopenharmony_ci void CheckAllCodePathsInNonVoidFunctionReturnOrThrow(ir::ScriptFunction *func, lexer::SourcePosition lineInfo, 3593af6ab5fSopenharmony_ci const char *errMsg); 3603af6ab5fSopenharmony_ci void CreatePatternParameterName(ir::AstNode *node, std::stringstream &ss); 3613af6ab5fSopenharmony_ci void HandlePropertyPatternParameterName(ir::Property *prop, std::stringstream &ss); 3623af6ab5fSopenharmony_ci void ThrowReturnTypeCircularityError(ir::ScriptFunction *func); 3633af6ab5fSopenharmony_ci ArgRange GetArgRange(const ArenaVector<Signature *> &signatures, ArenaVector<Signature *> *potentialSignatures, 3643af6ab5fSopenharmony_ci uint32_t callArgsSize, bool *haveSignatureWithRest); 3653af6ab5fSopenharmony_ci bool CallMatchesSignature(const ArenaVector<ir::Expression *> &args, Signature *signature, bool throwError); 3663af6ab5fSopenharmony_ci Type *ResolveCallOrNewExpression(const ArenaVector<Signature *> &signatures, 3673af6ab5fSopenharmony_ci ArenaVector<ir::Expression *> arguments, const lexer::SourcePosition &errPos); 3683af6ab5fSopenharmony_ci Type *CreateParameterTypeForArrayAssignmentPattern(ir::ArrayExpression *arrayPattern, Type *inferredType); 3693af6ab5fSopenharmony_ci Type *CreateParameterTypeForObjectAssignmentPattern(ir::ObjectExpression *objectPattern, Type *inferredType); 3703af6ab5fSopenharmony_ci 3713af6ab5fSopenharmony_ci // Binary like expression 3723af6ab5fSopenharmony_ci Type *CheckBinaryOperator(ExpressionTypeInfo *leftRightType, ir::Expression *leftExpr, ir::Expression *rightExpr, 3733af6ab5fSopenharmony_ci ir::AstNode *expr, lexer::TokenType op); 3743af6ab5fSopenharmony_ci Type *CheckPlusOperator(ExpressionTypeInfo *leftRightType, ir::Expression *leftExpr, ir::Expression *rightExpr, 3753af6ab5fSopenharmony_ci ir::AstNode *expr, lexer::TokenType op); 3763af6ab5fSopenharmony_ci Type *CheckCompareOperator(ExpressionTypeInfo *leftRightType, ir::Expression *leftExpr, ir::Expression *rightExpr, 3773af6ab5fSopenharmony_ci ir::AstNode *expr, lexer::TokenType op); 3783af6ab5fSopenharmony_ci Type *CheckAndOperator(Type *leftType, Type *rightType, ir::Expression *leftExpr); 3793af6ab5fSopenharmony_ci Type *CheckOrOperator(Type *leftType, Type *rightType, ir::Expression *leftExpr); 3803af6ab5fSopenharmony_ci Type *CheckInstanceofExpression(Type *leftType, Type *rightType, ir::Expression *rightExpr, ir::AstNode *expr); 3813af6ab5fSopenharmony_ci Type *CheckInExpression(Type *leftType, Type *rightType, ir::Expression *leftExpr, ir::Expression *rightExpr, 3823af6ab5fSopenharmony_ci ir::AstNode *expr); 3833af6ab5fSopenharmony_ci void CheckAssignmentOperator(lexer::TokenType op, ir::Expression *leftExpr, Type *leftType, Type *valueType); 3843af6ab5fSopenharmony_ci 3853af6ab5fSopenharmony_ciprivate: 3863af6ab5fSopenharmony_ci NumberLiteralPool numberLiteralMap_; 3873af6ab5fSopenharmony_ci StringLiteralPool stringLiteralMap_; 3883af6ab5fSopenharmony_ci StringLiteralPool bigintLiteralMap_; 3893af6ab5fSopenharmony_ci 3903af6ab5fSopenharmony_ci // Binary like expression 3913af6ab5fSopenharmony_ci void CheckBooleanLikeType(Type *leftType, Type *rightType, ir::AstNode *expr, lexer::TokenType op); 3923af6ab5fSopenharmony_ci 3933af6ab5fSopenharmony_ci void CheckExtendsBases(ObjectType *&baseObj, InterfaceType *&type, varbinder::InterfaceDecl *&decl); 3943af6ab5fSopenharmony_ci}; 3953af6ab5fSopenharmony_ci 3963af6ab5fSopenharmony_ci} // namespace ark::es2panda::checker 3973af6ab5fSopenharmony_ci 3983af6ab5fSopenharmony_ci#endif /* CHECKER_H */ 399