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_IR_ETS_NEW_MULTI_DIM_ARRAY_INSTANCE_EXPRESSION_H 17 #define ES2PANDA_IR_ETS_NEW_MULTI_DIM_ARRAY_INSTANCE_EXPRESSION_H 18 19 #include "ir/expression.h" 20 #include "checker/types/type.h" 21 22 namespace ark::es2panda::checker { 23 class ETSAnalyzer; 24 class Signature; 25 } // namespace ark::es2panda::checker 26 27 namespace ark::es2panda::compiler { 28 class ETSCompiler; 29 } // namespace ark::es2panda::compiler 30 31 namespace ark::es2panda::ir { 32 33 class ETSNewMultiDimArrayInstanceExpression : public Expression { 34 public: 35 ETSNewMultiDimArrayInstanceExpression() = delete; 36 ~ETSNewMultiDimArrayInstanceExpression() override = default; 37 38 NO_COPY_SEMANTIC(ETSNewMultiDimArrayInstanceExpression); 39 NO_MOVE_SEMANTIC(ETSNewMultiDimArrayInstanceExpression); 40 ETSNewMultiDimArrayInstanceExpression(ir::TypeNode * const typeReference,ArenaVector<ir::Expression * > && dimensions)41 explicit ETSNewMultiDimArrayInstanceExpression(ir::TypeNode *const typeReference, 42 ArenaVector<ir::Expression *> &&dimensions) 43 : Expression(AstNodeType::ETS_NEW_MULTI_DIM_ARRAY_INSTANCE_EXPRESSION), 44 typeReference_(typeReference), 45 dimensions_(std::move(dimensions)) 46 { 47 } 48 49 explicit ETSNewMultiDimArrayInstanceExpression(ETSNewMultiDimArrayInstanceExpression const &other, 50 ArenaAllocator *allocator); 51 TypeReference()52 [[nodiscard]] ir::TypeNode *TypeReference() noexcept 53 { 54 return typeReference_; 55 } 56 TypeReference()57 [[nodiscard]] ir::TypeNode const *TypeReference() const noexcept 58 { 59 return typeReference_; 60 } 61 Dimensions()62 [[nodiscard]] ArenaVector<ir::Expression *> &Dimensions() noexcept 63 { 64 return dimensions_; 65 } 66 Dimensions()67 [[nodiscard]] ArenaVector<ir::Expression *> const &Dimensions() const noexcept 68 { 69 return dimensions_; 70 } 71 Signature()72 [[nodiscard]] checker::Signature *Signature() noexcept 73 { 74 return signature_; 75 } 76 Signature()77 [[nodiscard]] const checker::Signature *Signature() const noexcept 78 { 79 return signature_; 80 } 81 GetPreferredType()82 [[nodiscard]] checker::Type *GetPreferredType() noexcept 83 { 84 return preferredType_; 85 } 86 GetPreferredType()87 [[nodiscard]] checker::Type const *GetPreferredType() const noexcept 88 { 89 return preferredType_; 90 } 91 SetPreferredType(checker::Type * preferredType)92 void SetPreferredType(checker::Type *preferredType) noexcept 93 { 94 preferredType_ = preferredType; 95 } 96 SetSignature(checker::Signature * signature)97 void SetSignature(checker::Signature *signature) noexcept 98 { 99 signature_ = signature; 100 } 101 102 [[nodiscard]] ETSNewMultiDimArrayInstanceExpression *Clone(ArenaAllocator *allocator, AstNode *parent) override; 103 104 void TransformChildren(const NodeTransformer &cb, std::string_view transformationName) override; 105 void Iterate(const NodeTraverser &cb) const override; 106 107 void Dump(ir::AstDumper *dumper) const override; 108 void Dump(ir::SrcDumper *dumper) const override; 109 void Compile(compiler::PandaGen *pg) const override; 110 void Compile(compiler::ETSGen *etsg) const override; 111 checker::Type *Check(checker::TSChecker *checker) override; 112 checker::VerifiedType Check(checker::ETSChecker *checker) override; 113 void SetPreferredTypeBasedOnFuncParam(checker::ETSChecker *checker, checker::Type *param, 114 checker::TypeRelationFlag flags); 115 Accept(ASTVisitorT * v)116 void Accept(ASTVisitorT *v) override 117 { 118 v->Accept(this); 119 } 120 CleanUp()121 void CleanUp() override 122 { 123 AstNode::CleanUp(); 124 signature_ = nullptr; 125 } 126 127 void ClearPreferredType(); 128 129 private: 130 ir::TypeNode *typeReference_; 131 ArenaVector<ir::Expression *> dimensions_; 132 checker::Signature *signature_ {}; 133 checker::Type *preferredType_ {}; 134 }; 135 } // namespace ark::es2panda::ir 136 137 #endif 138