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_EXPRESSION_YIELD_EXPRESSION_H
17#define ES2PANDA_IR_EXPRESSION_YIELD_EXPRESSION_H
18
19#include "ir/expression.h"
20
21namespace ark::es2panda::compiler {
22class GeneratorFunctionBuilder;
23}  // namespace ark::es2panda::compiler
24
25namespace ark::es2panda::ir {
26class YieldExpression : public Expression {
27public:
28    YieldExpression() = delete;
29    ~YieldExpression() override = default;
30
31    NO_COPY_SEMANTIC(YieldExpression);
32    NO_MOVE_SEMANTIC(YieldExpression);
33
34    explicit YieldExpression(Expression *const argument, bool const isDelegate)
35        : Expression(AstNodeType::YIELD_EXPRESSION), argument_(argument), delegate_(isDelegate)
36    {
37    }
38
39    [[nodiscard]] bool HasDelegate() const noexcept
40    {
41        return delegate_;
42    }
43
44    [[nodiscard]] const Expression *Argument() const noexcept
45    {
46        return argument_;
47    }
48
49    [[nodiscard]] YieldExpression *Clone(ArenaAllocator *allocator, AstNode *parent) override;
50
51    void TransformChildren(const NodeTransformer &cb, std::string_view transformationName) override;
52    void Iterate(const NodeTraverser &cb) const override;
53    void Dump(ir::AstDumper *dumper) const override;
54    void Dump(ir::SrcDumper *dumper) const override;
55    void Compile(compiler::PandaGen *pg) const override;
56    void Compile(compiler::ETSGen *etsg) const override;
57    checker::Type *Check(checker::TSChecker *checker) override;
58    checker::Type *Check([[maybe_unused]] checker::ETSChecker *checker) override;
59
60    void Accept(ASTVisitorT *v) override
61    {
62        v->Accept(this);
63    }
64
65private:
66    Expression *argument_;
67    bool delegate_;
68};
69}  // namespace ark::es2panda::ir
70
71#endif
72