13af6ab5fSopenharmony_ci/**
23af6ab5fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ci#ifndef ES2PANDA_PARSER_INCLUDE_AST_METHOD_DEFINITION_H
173af6ab5fSopenharmony_ci#define ES2PANDA_PARSER_INCLUDE_AST_METHOD_DEFINITION_H
183af6ab5fSopenharmony_ci
193af6ab5fSopenharmony_ci#include <ir/statement.h>
203af6ab5fSopenharmony_ci#include <ir/expression.h>
213af6ab5fSopenharmony_ci
223af6ab5fSopenharmony_cinamespace panda::es2panda::compiler {
233af6ab5fSopenharmony_ciclass PandaGen;
243af6ab5fSopenharmony_ci}  // namespace panda::es2panda::compiler
253af6ab5fSopenharmony_ci
263af6ab5fSopenharmony_cinamespace panda::es2panda::checker {
273af6ab5fSopenharmony_ciclass Checker;
283af6ab5fSopenharmony_ciclass Type;
293af6ab5fSopenharmony_ci}  // namespace panda::es2panda::checker
303af6ab5fSopenharmony_ci
313af6ab5fSopenharmony_cinamespace panda::es2panda::ir {
323af6ab5fSopenharmony_ci
333af6ab5fSopenharmony_ciclass FunctionExpression;
343af6ab5fSopenharmony_ci
353af6ab5fSopenharmony_cienum class MethodDefinitionKind { CONSTRUCTOR, METHOD, GET, SET };
363af6ab5fSopenharmony_ci
373af6ab5fSopenharmony_cistruct ParamDecorators {
383af6ab5fSopenharmony_ci    size_t paramIndex;
393af6ab5fSopenharmony_ci    ArenaVector<Decorator *> decorators;
403af6ab5fSopenharmony_ci};
413af6ab5fSopenharmony_ci
423af6ab5fSopenharmony_ciclass MethodDefinition : public Statement {
433af6ab5fSopenharmony_cipublic:
443af6ab5fSopenharmony_ci    explicit MethodDefinition(MethodDefinitionKind kind, Expression *key, FunctionExpression *value,
453af6ab5fSopenharmony_ci                              ModifierFlags modifiers, ArenaAllocator *allocator, ArenaVector<Decorator *> &&decorators,
463af6ab5fSopenharmony_ci                              ArenaVector<Annotation *> &&annotations, ArenaVector<ParamDecorators> &&paramDecorators,
473af6ab5fSopenharmony_ci                              bool isComputed)
483af6ab5fSopenharmony_ci        : Statement(AstNodeType::METHOD_DEFINITION),
493af6ab5fSopenharmony_ci          kind_(kind),
503af6ab5fSopenharmony_ci          key_(key),
513af6ab5fSopenharmony_ci          value_(value),
523af6ab5fSopenharmony_ci          modifiers_(modifiers),
533af6ab5fSopenharmony_ci          overloads_(allocator->Adapter()),
543af6ab5fSopenharmony_ci          decorators_(std::move(decorators)),
553af6ab5fSopenharmony_ci          annotations_(std::move(annotations)),
563af6ab5fSopenharmony_ci          paramDecorators_(std::move(paramDecorators)),
573af6ab5fSopenharmony_ci          isComputed_(isComputed)
583af6ab5fSopenharmony_ci    {
593af6ab5fSopenharmony_ci    }
603af6ab5fSopenharmony_ci
613af6ab5fSopenharmony_ci    MethodDefinitionKind Kind() const
623af6ab5fSopenharmony_ci    {
633af6ab5fSopenharmony_ci        return kind_;
643af6ab5fSopenharmony_ci    }
653af6ab5fSopenharmony_ci
663af6ab5fSopenharmony_ci    ModifierFlags Modifiers() const
673af6ab5fSopenharmony_ci    {
683af6ab5fSopenharmony_ci        return modifiers_;
693af6ab5fSopenharmony_ci    }
703af6ab5fSopenharmony_ci
713af6ab5fSopenharmony_ci    const Expression *Key() const
723af6ab5fSopenharmony_ci    {
733af6ab5fSopenharmony_ci        return key_;
743af6ab5fSopenharmony_ci    }
753af6ab5fSopenharmony_ci
763af6ab5fSopenharmony_ci    Expression *Key()
773af6ab5fSopenharmony_ci    {
783af6ab5fSopenharmony_ci        return key_;
793af6ab5fSopenharmony_ci    }
803af6ab5fSopenharmony_ci
813af6ab5fSopenharmony_ci    void SetKey(Expression *key)
823af6ab5fSopenharmony_ci    {
833af6ab5fSopenharmony_ci        key_ = key;
843af6ab5fSopenharmony_ci    }
853af6ab5fSopenharmony_ci
863af6ab5fSopenharmony_ci    const FunctionExpression *Value() const
873af6ab5fSopenharmony_ci    {
883af6ab5fSopenharmony_ci        return value_;
893af6ab5fSopenharmony_ci    }
903af6ab5fSopenharmony_ci
913af6ab5fSopenharmony_ci    bool Computed() const
923af6ab5fSopenharmony_ci    {
933af6ab5fSopenharmony_ci        return isComputed_;
943af6ab5fSopenharmony_ci    }
953af6ab5fSopenharmony_ci
963af6ab5fSopenharmony_ci    bool IsAbstract() const
973af6ab5fSopenharmony_ci    {
983af6ab5fSopenharmony_ci        return (modifiers_ & ModifierFlags::ABSTRACT) != 0;
993af6ab5fSopenharmony_ci    }
1003af6ab5fSopenharmony_ci
1013af6ab5fSopenharmony_ci    bool IsStatic() const
1023af6ab5fSopenharmony_ci    {
1033af6ab5fSopenharmony_ci        return (modifiers_ & ModifierFlags::STATIC) != 0;
1043af6ab5fSopenharmony_ci    }
1053af6ab5fSopenharmony_ci
1063af6ab5fSopenharmony_ci    bool IsAccessor() const
1073af6ab5fSopenharmony_ci    {
1083af6ab5fSopenharmony_ci        return (kind_ == MethodDefinitionKind::GET) || (kind_ == MethodDefinitionKind::SET);
1093af6ab5fSopenharmony_ci    }
1103af6ab5fSopenharmony_ci
1113af6ab5fSopenharmony_ci    bool IsOptional() const
1123af6ab5fSopenharmony_ci    {
1133af6ab5fSopenharmony_ci        return (modifiers_ & ModifierFlags::OPTIONAL) != 0;
1143af6ab5fSopenharmony_ci    }
1153af6ab5fSopenharmony_ci
1163af6ab5fSopenharmony_ci    bool IsPrivate() const
1173af6ab5fSopenharmony_ci    {
1183af6ab5fSopenharmony_ci        return key_->IsPrivateIdentifier();
1193af6ab5fSopenharmony_ci    }
1203af6ab5fSopenharmony_ci
1213af6ab5fSopenharmony_ci    const ArenaVector<MethodDefinition *> &Overloads() const
1223af6ab5fSopenharmony_ci    {
1233af6ab5fSopenharmony_ci        return overloads_;
1243af6ab5fSopenharmony_ci    }
1253af6ab5fSopenharmony_ci
1263af6ab5fSopenharmony_ci    const ArenaVector<Decorator *> &Decorators() const
1273af6ab5fSopenharmony_ci    {
1283af6ab5fSopenharmony_ci        return decorators_;
1293af6ab5fSopenharmony_ci    }
1303af6ab5fSopenharmony_ci
1313af6ab5fSopenharmony_ci    const ArenaVector<Annotation *> &Annotations() const
1323af6ab5fSopenharmony_ci    {
1333af6ab5fSopenharmony_ci        return annotations_;
1343af6ab5fSopenharmony_ci    }
1353af6ab5fSopenharmony_ci
1363af6ab5fSopenharmony_ci    void SetAnnotations(ArenaVector<Annotation *> &&annotations)
1373af6ab5fSopenharmony_ci    {
1383af6ab5fSopenharmony_ci        annotations_ = std::move(annotations);
1393af6ab5fSopenharmony_ci    }
1403af6ab5fSopenharmony_ci
1413af6ab5fSopenharmony_ci    const ArenaVector<ParamDecorators> &GetParamDecorators() const
1423af6ab5fSopenharmony_ci    {
1433af6ab5fSopenharmony_ci        return paramDecorators_;
1443af6ab5fSopenharmony_ci    }
1453af6ab5fSopenharmony_ci
1463af6ab5fSopenharmony_ci    bool HasParamDecorators() const
1473af6ab5fSopenharmony_ci    {
1483af6ab5fSopenharmony_ci        return !paramDecorators_.empty();
1493af6ab5fSopenharmony_ci    }
1503af6ab5fSopenharmony_ci
1513af6ab5fSopenharmony_ci    bool HasDecorators() const
1523af6ab5fSopenharmony_ci    {
1533af6ab5fSopenharmony_ci        return !decorators_.empty();
1543af6ab5fSopenharmony_ci    }
1553af6ab5fSopenharmony_ci
1563af6ab5fSopenharmony_ci    void SetOverloads(ArenaVector<MethodDefinition *> &&overloads)
1573af6ab5fSopenharmony_ci    {
1583af6ab5fSopenharmony_ci        overloads_ = std::move(overloads);
1593af6ab5fSopenharmony_ci    }
1603af6ab5fSopenharmony_ci
1613af6ab5fSopenharmony_ci    void AddOverload(MethodDefinition *overload)
1623af6ab5fSopenharmony_ci    {
1633af6ab5fSopenharmony_ci        overloads_.push_back(overload);
1643af6ab5fSopenharmony_ci    }
1653af6ab5fSopenharmony_ci
1663af6ab5fSopenharmony_ci    void SetKeyReg(compiler::VReg keyReg)
1673af6ab5fSopenharmony_ci    {
1683af6ab5fSopenharmony_ci        keyReg_ = keyReg;
1693af6ab5fSopenharmony_ci    }
1703af6ab5fSopenharmony_ci
1713af6ab5fSopenharmony_ci    compiler::VReg KeyReg() const
1723af6ab5fSopenharmony_ci    {
1733af6ab5fSopenharmony_ci        return keyReg_;
1743af6ab5fSopenharmony_ci    }
1753af6ab5fSopenharmony_ci
1763af6ab5fSopenharmony_ci    const ScriptFunction *Function() const;
1773af6ab5fSopenharmony_ci
1783af6ab5fSopenharmony_ci    ScriptFunction *Function();
1793af6ab5fSopenharmony_ci
1803af6ab5fSopenharmony_ci    void Iterate(const NodeTraverser &cb) const override;
1813af6ab5fSopenharmony_ci    void Dump(ir::AstDumper *dumper) const override;
1823af6ab5fSopenharmony_ci    void Compile([[maybe_unused]] compiler::PandaGen *pg) const override;
1833af6ab5fSopenharmony_ci    checker::Type *Check([[maybe_unused]] checker::Checker *checker) const override;
1843af6ab5fSopenharmony_ci    void UpdateSelf(const NodeUpdater &cb, [[maybe_unused]] binder::Binder *binder) override;
1853af6ab5fSopenharmony_ci
1863af6ab5fSopenharmony_ciprivate:
1873af6ab5fSopenharmony_ci    MethodDefinitionKind kind_;
1883af6ab5fSopenharmony_ci    Expression *key_;
1893af6ab5fSopenharmony_ci    compiler::VReg keyReg_ {0};
1903af6ab5fSopenharmony_ci    FunctionExpression *value_;
1913af6ab5fSopenharmony_ci    ModifierFlags modifiers_;
1923af6ab5fSopenharmony_ci    ArenaVector<MethodDefinition *> overloads_;
1933af6ab5fSopenharmony_ci    ArenaVector<Decorator *> decorators_;
1943af6ab5fSopenharmony_ci    ArenaVector<Annotation *> annotations_;
1953af6ab5fSopenharmony_ci    ArenaVector<ParamDecorators> paramDecorators_;
1963af6ab5fSopenharmony_ci    bool isComputed_;
1973af6ab5fSopenharmony_ci};
1983af6ab5fSopenharmony_ci
1993af6ab5fSopenharmony_ci}  // namespace panda::es2panda::ir
2003af6ab5fSopenharmony_ci
2013af6ab5fSopenharmony_ci#endif
202