1/** 2 * Copyright (c) 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_IR_EXPRESSION_DUMMYNODE_H 17#define ES2PANDA_IR_EXPRESSION_DUMMYNODE_H 18 19#include "ir/astNode.h" 20#include "ir/visitor/AstVisitor.h" 21#include "util/ustring.h" 22 23namespace ark::es2panda::ir { 24 25using ENUMBITOPS_OPERATORS; 26 27enum class DummyNodeFlag : uint32_t { NONE = 0U, INDEXER = 1U << 0U }; 28 29} // namespace ark::es2panda::ir 30 31template <> 32struct enumbitops::IsAllowedType<ark::es2panda::ir::DummyNodeFlag> : std::true_type { 33}; 34 35namespace ark::es2panda::ir { 36 37class DummyNode : public AstNode { 38public: 39 DummyNode() = delete; 40 ~DummyNode() override = default; 41 42 NO_COPY_SEMANTIC(DummyNode); 43 NO_MOVE_SEMANTIC(DummyNode); 44 45public: 46 explicit DummyNode(util::StringView const name, util::StringView indexName, TypeNode *returnType, 47 DummyNodeFlag flag) 48 : AstNode(AstNodeType::DUMMYNODE), name_(name), indexName_(indexName), returnType_(returnType), flag_(flag) 49 { 50 } 51 52 [[nodiscard]] bool IsAmbientIndexer() const noexcept 53 { 54 return (flag_ & ir::DummyNodeFlag::INDEXER) != 0; 55 } 56 57 void SetAmbientIndexer(bool const ambientIndexer) noexcept 58 { 59 if (ambientIndexer) { 60 flag_ |= DummyNodeFlag::INDEXER; 61 } else { 62 flag_ &= ~DummyNodeFlag::INDEXER; 63 } 64 } 65 66 [[nodiscard]] util::StringView GetIndexName() const 67 { 68 return indexName_; 69 } 70 71 void SetIndexName(const util::StringView &indexName) 72 { 73 indexName_ = indexName; 74 } 75 76 [[nodiscard]] TypeNode *GetReturnTypeLiteral() const 77 { 78 return returnType_; 79 } 80 81 void SetReturnTypeLiteral(TypeNode *returnType) 82 { 83 returnType_ = returnType; 84 } 85 86 util::StringView Name() const 87 { 88 return name_; 89 } 90 91 bool operator==(const DummyNode &node) const 92 { 93 return name_.Is(std::string(node.Name().Bytes())); 94 } 95 96 void TransformChildren(const NodeTransformer &cb, std::string_view transformationName) override; 97 void Iterate(const NodeTraverser &cb) const override; 98 void Dump(ir::AstDumper *dumper) const override; 99 void Dump(ir::SrcDumper *dumper) const override; 100 void Compile(compiler::PandaGen *pg) const override; 101 void Compile(compiler::ETSGen *etsg) const override; 102 checker::Type *Check(checker::TSChecker *checker) override; 103 checker::Type *Check(checker::ETSChecker *checker) override; 104 105 void Accept(ASTVisitorT *v) override 106 { 107 v->Accept(this); 108 } 109 110private: 111 util::StringView name_; 112 util::StringView indexName_; 113 TypeNode *returnType_; 114 DummyNodeFlag flag_ {DummyNodeFlag::NONE}; 115}; 116} // namespace ark::es2panda::ir 117 118#endif 119