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#include "tsEnumDeclaration.h" 17 18#include "checker/TSchecker.h" 19#include "compiler/core/ETSGen.h" 20#include "compiler/core/pandagen.h" 21#include "util/helpers.h" 22#include "ir/astDump.h" 23#include "ir/srcDump.h" 24 25namespace ark::es2panda::ir { 26void TSEnumDeclaration::TransformChildren(const NodeTransformer &cb, std::string_view transformationName) 27{ 28 for (auto *&it : decorators_) { 29 if (auto *transformedNode = cb(it); it != transformedNode) { 30 it->SetTransformedNode(transformationName, transformedNode); 31 it = transformedNode->AsDecorator(); 32 } 33 } 34 35 if (auto *transformedNode = cb(key_); key_ != transformedNode) { 36 key_->SetTransformedNode(transformationName, transformedNode); 37 key_ = transformedNode->AsIdentifier(); 38 } 39 40 for (auto *&it : members_) { 41 if (auto *transformedNode = cb(it); it != transformedNode) { 42 it->SetTransformedNode(transformationName, transformedNode); 43 it = transformedNode; 44 } 45 } 46} 47 48void TSEnumDeclaration::Iterate(const NodeTraverser &cb) const 49{ 50 for (auto *it : decorators_) { 51 cb(it); 52 } 53 54 cb(key_); 55 56 for (auto *it : members_) { 57 cb(it); 58 } 59} 60 61void TSEnumDeclaration::Dump(ir::AstDumper *dumper) const 62{ 63 dumper->Add({{"type", "TSEnumDeclaration"}, 64 {"decorators", AstDumper::Optional(decorators_)}, 65 {"id", key_}, 66 {"members", members_}, 67 {"const", isConst_}}); 68} 69 70void TSEnumDeclaration::Dump(ir::SrcDumper *dumper) const 71{ 72 ASSERT(isConst_ == false); 73 ASSERT(key_ != nullptr); 74 dumper->Add("enum "); 75 key_->Dump(dumper); 76 dumper->Add(" {"); 77 if (!members_.empty()) { 78 dumper->IncrIndent(); 79 dumper->Endl(); 80 for (auto member : members_) { 81 member->Dump(dumper); 82 if (member != members_.back()) { 83 dumper->Add(","); 84 dumper->Endl(); 85 } 86 } 87 dumper->DecrIndent(); 88 dumper->Endl(); 89 } 90 dumper->Add("}"); 91 dumper->Endl(); 92} 93 94// NOTE (csabahurton): this method has not been moved to TSAnalyizer.cpp, because it is not used. 95varbinder::EnumMemberResult EvaluateMemberExpression(checker::TSChecker *checker, 96 [[maybe_unused]] varbinder::EnumVariable *enumVar, 97 ir::MemberExpression *expr) 98{ 99 if (checker::TSChecker::IsConstantMemberAccess(expr->AsExpression())) { 100 if (expr->Check(checker)->TypeFlags() == checker::TypeFlag::ENUM) { 101 util::StringView name; 102 if (!expr->IsComputed()) { 103 name = expr->Property()->AsIdentifier()->Name(); 104 } else { 105 ASSERT(checker::TSChecker::IsStringLike(expr->Property())); 106 name = reinterpret_cast<const ir::StringLiteral *>(expr->Property())->Str(); 107 } 108 109 // NOTE: aszilagyi. 110 } 111 } 112 113 return false; 114} 115 116void TSEnumDeclaration::Compile(compiler::PandaGen *pg) const 117{ 118 pg->GetAstCompiler()->Compile(this); 119} 120 121void TSEnumDeclaration::Compile(compiler::ETSGen *etsg) const 122{ 123 etsg->GetAstCompiler()->Compile(this); 124} 125 126checker::Type *TSEnumDeclaration::Check(checker::TSChecker *checker) 127{ 128 return checker->GetAnalyzer()->Check(this); 129} 130 131checker::Type *TSEnumDeclaration::Check(checker::ETSChecker *const checker) 132{ 133 return checker->GetAnalyzer()->Check(this); 134} 135} // namespace ark::es2panda::ir 136