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_DESTRUCTURING_CONTEXT_H 173af6ab5fSopenharmony_ci#define ES2PANDA_CHECKER_TS_DESTRUCTURING_CONTEXT_H 183af6ab5fSopenharmony_ci 193af6ab5fSopenharmony_ci#include "checker/TSchecker.h" 203af6ab5fSopenharmony_ci#include "ir/expression.h" 213af6ab5fSopenharmony_ci 223af6ab5fSopenharmony_ci#include <macros.h> 233af6ab5fSopenharmony_ci 243af6ab5fSopenharmony_cinamespace ark::es2panda::ir { 253af6ab5fSopenharmony_ciclass Expression; 263af6ab5fSopenharmony_ciclass SpreadElement; 273af6ab5fSopenharmony_ci} // namespace ark::es2panda::ir 283af6ab5fSopenharmony_ci 293af6ab5fSopenharmony_cinamespace ark::es2panda::checker { 303af6ab5fSopenharmony_ciclass Type; 313af6ab5fSopenharmony_ci 323af6ab5fSopenharmony_ciclass DestructuringContext { 333af6ab5fSopenharmony_cipublic: 343af6ab5fSopenharmony_ci // Struct to reduce number of constructor arguments to pass code checker 353af6ab5fSopenharmony_ci struct DestructuringContextArguments { 363af6ab5fSopenharmony_ci TSChecker *checker; 373af6ab5fSopenharmony_ci ir::Expression *id; 383af6ab5fSopenharmony_ci bool inAssignment; 393af6ab5fSopenharmony_ci bool convertTupleToArray; 403af6ab5fSopenharmony_ci ir::TypeNode *typeAnnotation; 413af6ab5fSopenharmony_ci ir::Expression *initializer; 423af6ab5fSopenharmony_ci }; 433af6ab5fSopenharmony_ci 443af6ab5fSopenharmony_ci explicit DestructuringContext(const DestructuringContextArguments &data) 453af6ab5fSopenharmony_ci : checker_(data.checker), 463af6ab5fSopenharmony_ci id_(data.id), 473af6ab5fSopenharmony_ci inAssignment_(data.inAssignment), 483af6ab5fSopenharmony_ci convertTupleToArray_(data.convertTupleToArray) 493af6ab5fSopenharmony_ci { 503af6ab5fSopenharmony_ci Prepare(data.typeAnnotation, data.initializer, data.id->Start()); 513af6ab5fSopenharmony_ci } 523af6ab5fSopenharmony_ci 533af6ab5fSopenharmony_ci void SetInferredType(Type *type) 543af6ab5fSopenharmony_ci { 553af6ab5fSopenharmony_ci inferredType_ = type; 563af6ab5fSopenharmony_ci } 573af6ab5fSopenharmony_ci 583af6ab5fSopenharmony_ci void SetSignatureInfo(SignatureInfo *info) 593af6ab5fSopenharmony_ci { 603af6ab5fSopenharmony_ci signatureInfo_ = info; 613af6ab5fSopenharmony_ci } 623af6ab5fSopenharmony_ci 633af6ab5fSopenharmony_ci Type *InferredType() 643af6ab5fSopenharmony_ci { 653af6ab5fSopenharmony_ci return inferredType_; 663af6ab5fSopenharmony_ci } 673af6ab5fSopenharmony_ci 683af6ab5fSopenharmony_ci void ValidateObjectLiteralType(ObjectType *objType, ir::ObjectExpression *objPattern); 693af6ab5fSopenharmony_ci void HandleDestructuringAssignment(ir::Identifier *ident, Type *inferredType, Type *defaultType); 703af6ab5fSopenharmony_ci void HandleAssignmentPattern(ir::AssignmentExpression *assignmentPattern, Type *inferredType, bool validateDefault); 713af6ab5fSopenharmony_ci void HandleAssignmentPatternArrayPattern(ir::AssignmentExpression *assignmentPattern, Type *inferredType); 723af6ab5fSopenharmony_ci void HandleAssignmentPatternIdentifier(ir::AssignmentExpression *assignmentPattern, Type *defaultType, 733af6ab5fSopenharmony_ci Type *inferredType); 743af6ab5fSopenharmony_ci void SetInferredTypeForVariable(varbinder::Variable *var, Type *inferredType, const lexer::SourcePosition &loc); 753af6ab5fSopenharmony_ci void Prepare(ir::TypeNode *typeAnnotation, ir::Expression *initializer, const lexer::SourcePosition &loc); 763af6ab5fSopenharmony_ci 773af6ab5fSopenharmony_ci DEFAULT_COPY_SEMANTIC(DestructuringContext); 783af6ab5fSopenharmony_ci DEFAULT_MOVE_SEMANTIC(DestructuringContext); 793af6ab5fSopenharmony_ci virtual ~DestructuringContext() = default; 803af6ab5fSopenharmony_ci 813af6ab5fSopenharmony_ci virtual void Start() = 0; 823af6ab5fSopenharmony_ci virtual void ValidateInferredType() = 0; 833af6ab5fSopenharmony_ci virtual Type *NextInferredType([[maybe_unused]] const util::StringView &searchName, bool throwError) = 0; 843af6ab5fSopenharmony_ci virtual void HandleRest(ir::SpreadElement *rest) = 0; 853af6ab5fSopenharmony_ci virtual Type *GetRestType([[maybe_unused]] const lexer::SourcePosition &loc) = 0; 863af6ab5fSopenharmony_ci virtual Type *ConvertTupleTypeToArrayTypeIfNecessary(ir::AstNode *node, Type *type) = 0; 873af6ab5fSopenharmony_ci 883af6ab5fSopenharmony_ciprotected: 893af6ab5fSopenharmony_ci // NOLINTBEGIN(misc-non-private-member-variables-in-classes) 903af6ab5fSopenharmony_ci TSChecker *checker_; 913af6ab5fSopenharmony_ci ir::Expression *id_; 923af6ab5fSopenharmony_ci bool inAssignment_; 933af6ab5fSopenharmony_ci bool convertTupleToArray_; 943af6ab5fSopenharmony_ci Type *inferredType_ {}; 953af6ab5fSopenharmony_ci SignatureInfo *signatureInfo_ {}; 963af6ab5fSopenharmony_ci bool validateObjectPatternInitializer_ {true}; 973af6ab5fSopenharmony_ci bool validateTypeAnnotation_ {}; 983af6ab5fSopenharmony_ci // NOLINTEND(misc-non-private-member-variables-in-classes) 993af6ab5fSopenharmony_ci}; 1003af6ab5fSopenharmony_ci 1013af6ab5fSopenharmony_ciclass ArrayDestructuringContext : public DestructuringContext { 1023af6ab5fSopenharmony_cipublic: 1033af6ab5fSopenharmony_ci explicit ArrayDestructuringContext(const DestructuringContextArguments &data) : DestructuringContext(data) {} 1043af6ab5fSopenharmony_ci 1053af6ab5fSopenharmony_ci Type *GetTypeFromTupleByIndex(TupleType *tuple); 1063af6ab5fSopenharmony_ci Type *CreateArrayTypeForRest(UnionType *inferredType); 1073af6ab5fSopenharmony_ci Type *CreateTupleTypeForRest(TupleType *tuple); 1083af6ab5fSopenharmony_ci void SetRemainingParameterTypes(); 1093af6ab5fSopenharmony_ci 1103af6ab5fSopenharmony_ci void Start() override; 1113af6ab5fSopenharmony_ci void HandleElement(ir::Expression *element, Type *nextInferredType); 1123af6ab5fSopenharmony_ci void ValidateInferredType() override; 1133af6ab5fSopenharmony_ci Type *NextInferredType([[maybe_unused]] const util::StringView &searchName, bool throwError) override; 1143af6ab5fSopenharmony_ci void HandleRest(ir::SpreadElement *rest) override; 1153af6ab5fSopenharmony_ci Type *GetRestType([[maybe_unused]] const lexer::SourcePosition &loc) override; 1163af6ab5fSopenharmony_ci Type *ConvertTupleTypeToArrayTypeIfNecessary(ir::AstNode *node, Type *type) override; 1173af6ab5fSopenharmony_ci 1183af6ab5fSopenharmony_ciprivate: 1193af6ab5fSopenharmony_ci uint32_t index_ {0}; 1203af6ab5fSopenharmony_ci}; 1213af6ab5fSopenharmony_ci 1223af6ab5fSopenharmony_ciclass ObjectDestructuringContext : public DestructuringContext { 1233af6ab5fSopenharmony_cipublic: 1243af6ab5fSopenharmony_ci explicit ObjectDestructuringContext(const DestructuringContextArguments &data) : DestructuringContext(data) {} 1253af6ab5fSopenharmony_ci 1263af6ab5fSopenharmony_ci Type *CreateObjectTypeForRest(ObjectType *objType); 1273af6ab5fSopenharmony_ci 1283af6ab5fSopenharmony_ci void Start() override; 1293af6ab5fSopenharmony_ci void ValidateInferredType() override; 1303af6ab5fSopenharmony_ci Type *NextInferredType([[maybe_unused]] const util::StringView &searchName, bool throwError) override; 1313af6ab5fSopenharmony_ci void HandleRest(ir::SpreadElement *rest) override; 1323af6ab5fSopenharmony_ci Type *GetRestType([[maybe_unused]] const lexer::SourcePosition &loc) override; 1333af6ab5fSopenharmony_ci Type *ConvertTupleTypeToArrayTypeIfNecessary(ir::AstNode *node, Type *type) override; 1343af6ab5fSopenharmony_ci}; 1353af6ab5fSopenharmony_ci} // namespace ark::es2panda::checker 1363af6ab5fSopenharmony_ci 1373af6ab5fSopenharmony_ci#endif 138