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 "namespaceDefinition.h"
17 
18 #include "checker/TSchecker.h"
19 #include "checker/ETSchecker.h"
20 #include "compiler/core/ETSGen.h"
21 #include "compiler/core/pandagen.h"
22 #include "ir/astDump.h"
23 #include "ir/srcDump.h"
24 #include "ir/base/classStaticBlock.h"
25 #include "ir/base/methodDefinition.h"
26 #include "ir/base/scriptFunction.h"
27 #include "ir/expressions/identifier.h"
28 #include "ir/ts/tsClassImplements.h"
29 
30 namespace ark::es2panda::ir {
Ctor() const31 const FunctionExpression *NamespaceDefinition::Ctor() const
32 {
33     return ctor_ != nullptr ? ctor_->Value()->AsFunctionExpression() : nullptr;
34 }
35 
TransformChildren(const NodeTransformer &cb, std::string_view transformationName)36 void NamespaceDefinition::TransformChildren(const NodeTransformer &cb, std::string_view transformationName)
37 {
38     if (ident_ != nullptr) {
39         if (auto *transformedNode = cb(ident_); ident_ != transformedNode) {
40             ident_->SetTransformedNode(transformationName, transformedNode);
41             ident_ = transformedNode->AsIdentifier();
42         }
43     }
44 
45     for (auto *&it : body_) {
46         if (auto *transformedNode = cb(it); it != transformedNode) {
47             it->SetTransformedNode(transformationName, transformedNode);
48             it = transformedNode;
49         }
50     }
51 }
52 
Iterate(const NodeTraverser &cb) const53 void NamespaceDefinition::Iterate(const NodeTraverser &cb) const
54 {
55     if (ident_ != nullptr) {
56         cb(ident_);
57     }
58 
59     // NOLINTNEXTLINE(modernize-loop-convert)
60     for (size_t ix = 0; ix < body_.size(); ix++) {
61         cb(body_[ix]);
62     }
63 }
64 
65 void NamespaceDefinition::SetIdent(ir::Identifier *ident) noexcept
66 {
67     ident_ = ident;
68     if (ident_ != nullptr) {
69         ident_->SetParent(this);
70     }
71 }
72 
Dump(ir::AstDumper *dumper) const73 void NamespaceDefinition::Dump(ir::AstDumper *dumper) const
74 {
75     dumper->Add({{"id", AstDumper::Nullish(ident_)}, {"body", body_}});
76 }
77 
Dump([[maybe_unused]] ir::SrcDumper *dumper) const78 void NamespaceDefinition::Dump([[maybe_unused]] ir::SrcDumper *dumper) const
79 {
80     ASSERT(ident_ != nullptr);
81 
82     if (IsExported()) {
83         dumper->Add("export ");
84     }
85 
86     dumper->Add(" {");
87     if (!body_.empty()) {
88         dumper->IncrIndent();
89         dumper->Endl();
90         for (auto elem : body_) {
91             elem->Dump(dumper);
92             if (elem == body_.back()) {
93                 dumper->DecrIndent();
94             }
95             dumper->Endl();
96         }
97     }
98     dumper->Add("}");
99     dumper->Endl();
100 }
101 
Compile(compiler::PandaGen *pg) const102 void NamespaceDefinition::Compile(compiler::PandaGen *pg) const
103 {
104     pg->GetAstCompiler()->Compile(this);
105 }
106 
Compile(compiler::ETSGen *etsg) const107 void NamespaceDefinition::Compile(compiler::ETSGen *etsg) const
108 {
109     etsg->GetAstCompiler()->Compile(this);
110 }
111 
Check(checker::TSChecker *checker)112 checker::Type *NamespaceDefinition::Check(checker::TSChecker *checker)
113 {
114     return checker->GetAnalyzer()->Check(this);
115 }
116 
Check(checker::ETSChecker *checker)117 checker::Type *NamespaceDefinition::Check(checker::ETSChecker *checker)
118 {
119     return checker->GetAnalyzer()->Check(this);
120 }
121 
122 }  // namespace ark::es2panda::ir
123