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_PARSER_INCLUDE_AST_TS_METHOD_SIGNATURE_H
17#define ES2PANDA_PARSER_INCLUDE_AST_TS_METHOD_SIGNATURE_H
18
19#include "ir/typeNode.h"
20#include "ir/base/scriptFunctionSignature.h"
21
22namespace ark::es2panda::checker {
23class TSAnalyzer;
24class ETSAnalyzer;
25}  // namespace ark::es2panda::checker
26
27namespace ark::es2panda::ir {
28class TSTypeParameterDeclaration;
29
30class TSMethodSignature : public AstNode {
31public:
32    TSMethodSignature() = delete;
33    ~TSMethodSignature() override = default;
34
35    NO_COPY_SEMANTIC(TSMethodSignature);
36    NO_MOVE_SEMANTIC(TSMethodSignature);
37
38    explicit TSMethodSignature(Expression *key, ir::FunctionSignature &&signature, bool computed, bool optional)
39        : AstNode(AstNodeType::TS_METHOD_SIGNATURE),
40          key_(key),
41          signature_(std::move(signature)),
42          computed_(computed),
43          optional_(optional)
44    {
45    }
46
47    // NOTE (csabahurton): friend relationship can be removed once there are getters for private fields
48    friend class checker::TSAnalyzer;
49
50    [[nodiscard]] bool IsScopeBearer() const noexcept override
51    {
52        return true;
53    }
54
55    [[nodiscard]] varbinder::Scope *Scope() const noexcept override
56    {
57        return scope_;
58    }
59
60    void SetScope(varbinder::Scope *scope)
61    {
62        ASSERT(scope_ == nullptr);
63        scope_ = scope;
64    }
65
66    void ClearScope() noexcept override
67    {
68        scope_ = nullptr;
69    }
70
71    [[nodiscard]] const Expression *Key() const noexcept
72    {
73        return key_;
74    }
75
76    [[nodiscard]] Expression *Key() noexcept
77    {
78        return key_;
79    }
80
81    [[nodiscard]] const TSTypeParameterDeclaration *TypeParams() const noexcept
82    {
83        return signature_.TypeParams();
84    }
85
86    [[nodiscard]] TSTypeParameterDeclaration *TypeParams()
87    {
88        return signature_.TypeParams();
89    }
90
91    [[nodiscard]] const ArenaVector<Expression *> &Params() const noexcept
92    {
93        return signature_.Params();
94    }
95
96    [[nodiscard]] const TypeNode *ReturnTypeAnnotation() const noexcept
97    {
98        return signature_.ReturnType();
99    }
100
101    TypeNode *ReturnTypeAnnotation()
102    {
103        return signature_.ReturnType();
104    }
105
106    [[nodiscard]] bool Computed() const noexcept
107    {
108        return computed_;
109    }
110
111    [[nodiscard]] bool Optional() const noexcept
112    {
113        return optional_;
114    }
115
116    void TransformChildren(const NodeTransformer &cb, std::string_view transformationName) override;
117    void Iterate(const NodeTraverser &cb) const override;
118
119    void Dump(ir::AstDumper *dumper) const override;
120    void Dump(ir::SrcDumper *dumper) const override;
121    void Compile(compiler::PandaGen *pg) const override;
122    void Compile(compiler::ETSGen *etsg) const override;
123    checker::Type *Check(checker::TSChecker *checker) override;
124    checker::Type *Check(checker::ETSChecker *checker) override;
125
126    void Accept(ASTVisitorT *v) override
127    {
128        v->Accept(this);
129    }
130
131private:
132    varbinder::Scope *scope_ {nullptr};
133    Expression *key_;
134    ir::FunctionSignature signature_;
135    bool computed_;
136    bool optional_;
137};
138}  // namespace ark::es2panda::ir
139
140#endif
141