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#ifndef ES2PANDA_IR_TS_QUALIFIED_NAME_H
17#define ES2PANDA_IR_TS_QUALIFIED_NAME_H
18
19#include "ir/expression.h"
20
21namespace ark::es2panda::ir {
22class TSQualifiedName : public Expression {
23    struct Tag {};
24
25public:
26    TSQualifiedName() = delete;
27    ~TSQualifiedName() override = default;
28
29    NO_COPY_SEMANTIC(TSQualifiedName);
30    NO_MOVE_SEMANTIC(TSQualifiedName);
31
32    explicit TSQualifiedName(Expression *left, Identifier *right)
33        : Expression(AstNodeType::TS_QUALIFIED_NAME), left_(left), right_(right)
34    {
35    }
36
37    explicit TSQualifiedName(Tag tag, TSQualifiedName const &other, ArenaAllocator *allocator);
38
39    [[nodiscard]] const Expression *Left() const noexcept
40    {
41        return left_;
42    }
43
44    [[nodiscard]] Expression *Left() noexcept
45    {
46        return left_;
47    }
48
49    [[nodiscard]] const Identifier *Right() const noexcept
50    {
51        return right_;
52    }
53
54    [[nodiscard]] Identifier *Right() noexcept
55    {
56        return right_;
57    }
58
59    util::StringView ToString(ArenaAllocator *allocator) const;
60    util::StringView BaseToString(ArenaAllocator *allocator) const;
61    ir::TSQualifiedName *ResolveLeftMostQualifiedName();
62    const ir::TSQualifiedName *ResolveLeftMostQualifiedName() const;
63
64    [[nodiscard]] TSQualifiedName *Clone(ArenaAllocator *allocator, AstNode *parent) override;
65
66    void TransformChildren(const NodeTransformer &cb, std::string_view transformationName) override;
67    void Iterate(const NodeTraverser &cb) const override;
68    void Dump(ir::AstDumper *dumper) const override;
69    void Dump(ir::SrcDumper *dumper) const override;
70    void Compile([[maybe_unused]] compiler::PandaGen *pg) const override;
71    void Compile(compiler::ETSGen *etsg) const override;
72    checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override;
73    checker::Type *Check([[maybe_unused]] checker::ETSChecker *checker) override;
74
75    void Accept(ASTVisitorT *v) override
76    {
77        v->Accept(this);
78    }
79
80private:
81    Expression *left_;
82    Identifier *right_;
83};
84}  // namespace ark::es2panda::ir
85
86#endif
87