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