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_CORE_PARSER_PRIVATE_CONTEXT_H
173af6ab5fSopenharmony_ci#define ES2PANDA_PARSER_CORE_PARSER_PRIVATE_CONTEXT_H
183af6ab5fSopenharmony_ci
193af6ab5fSopenharmony_ci#include <macros.h>
203af6ab5fSopenharmony_ci#include <parser/program/program.h>
213af6ab5fSopenharmony_ci#include <util/enumbitops.h>
223af6ab5fSopenharmony_ci#include <util/ustring.h>
233af6ab5fSopenharmony_ci
243af6ab5fSopenharmony_ci#include <vector>
253af6ab5fSopenharmony_ci
263af6ab5fSopenharmony_cinamespace panda::es2panda::parser {
273af6ab5fSopenharmony_cienum class ParserStatus : uint64_t {
283af6ab5fSopenharmony_ci    NO_OPTS = 0,
293af6ab5fSopenharmony_ci    STRICT = (1 << 0),
303af6ab5fSopenharmony_ci
313af6ab5fSopenharmony_ci    FUNCTION = (1 << 1),
323af6ab5fSopenharmony_ci    ARROW_FUNCTION = (1 << 2),
333af6ab5fSopenharmony_ci    GENERATOR_FUNCTION = (1 << 3),
343af6ab5fSopenharmony_ci    ASYNC_FUNCTION = (1 << 4),
353af6ab5fSopenharmony_ci    CONSTRUCTOR_FUNCTION = (1 << 5),
363af6ab5fSopenharmony_ci    FUNCTION_PARAM = (1 << 6),
373af6ab5fSopenharmony_ci    IS_SPREAD = (1 << 7),
383af6ab5fSopenharmony_ci    ACCESSOR_FUNCTION = (1 << 8),
393af6ab5fSopenharmony_ci    FUNCTION_DECLARATION = (1 << 9),
403af6ab5fSopenharmony_ci
413af6ab5fSopenharmony_ci    ALLOW_SUPER = (1 << 10),
423af6ab5fSopenharmony_ci    ALLOW_SUPER_CALL = (1 << 11),
433af6ab5fSopenharmony_ci
443af6ab5fSopenharmony_ci    DISALLOW_AWAIT = (1 << 12),
453af6ab5fSopenharmony_ci    ALLOW_YIELD = (1 << 13),
463af6ab5fSopenharmony_ci    IN_ITERATION = (1 << 14),
473af6ab5fSopenharmony_ci    IN_LABELED = (1 << 15),
483af6ab5fSopenharmony_ci
493af6ab5fSopenharmony_ci    EXPORT_REACHED = (1 << 16),
503af6ab5fSopenharmony_ci    HAS_COMPLEX_PARAM = (1 << 17),
513af6ab5fSopenharmony_ci    IN_SWITCH = (1 << 18),
523af6ab5fSopenharmony_ci
533af6ab5fSopenharmony_ci    MODULE = (1 << 19),
543af6ab5fSopenharmony_ci    ALLOW_NEW_TARGET = (1 << 20),
553af6ab5fSopenharmony_ci
563af6ab5fSopenharmony_ci    IN_EXTENDS = (1 << 21),
573af6ab5fSopenharmony_ci    ALLOW_THIS_TYPE = (1 << 22),
583af6ab5fSopenharmony_ci    IN_METHOD_DEFINITION = (1 << 23),
593af6ab5fSopenharmony_ci    IN_AMBIENT_CONTEXT = (1 << 24),
603af6ab5fSopenharmony_ci    IN_CLASS_BODY = (1 << 25),
613af6ab5fSopenharmony_ci    IN_DECORATOR = (1 << 26),
623af6ab5fSopenharmony_ci    DISALLOW_CONTINUE = (1 << 27),
633af6ab5fSopenharmony_ci
643af6ab5fSopenharmony_ci    TS_MODULE = (1 << 28),
653af6ab5fSopenharmony_ci    DISALLOW_CONDITIONAL_TYPES = (1 << 29),
663af6ab5fSopenharmony_ci    STATIC_BLOCK = (1 << 30),
673af6ab5fSopenharmony_ci    DISALLOW_ARGUMENTS = (1 << 31),
683af6ab5fSopenharmony_ci};
693af6ab5fSopenharmony_ci
703af6ab5fSopenharmony_ciDEFINE_BITOPS(ParserStatus)
713af6ab5fSopenharmony_ci
723af6ab5fSopenharmony_ciclass ParserContext {
733af6ab5fSopenharmony_cipublic:
743af6ab5fSopenharmony_ci    explicit ParserContext(const Program *program) : program_(program) {}
753af6ab5fSopenharmony_ci    explicit ParserContext(ParserContext *current, ParserStatus newStatus, util::StringView label = "")
763af6ab5fSopenharmony_ci        : program_(current->program_), prev_(current), label_(label)
773af6ab5fSopenharmony_ci    {
783af6ab5fSopenharmony_ci        ParserStatus currentStatus = current->status_;
793af6ab5fSopenharmony_ci        currentStatus &= (ParserStatus::MODULE | ParserStatus::ALLOW_NEW_TARGET | ParserStatus::IN_EXTENDS |
803af6ab5fSopenharmony_ci                          ParserStatus::ALLOW_THIS_TYPE | ParserStatus::IN_CLASS_BODY | ParserStatus::FUNCTION);
813af6ab5fSopenharmony_ci        status_ = currentStatus | newStatus;
823af6ab5fSopenharmony_ci    }
833af6ab5fSopenharmony_ci
843af6ab5fSopenharmony_ci    DEFAULT_COPY_SEMANTIC(ParserContext);
853af6ab5fSopenharmony_ci    DEFAULT_MOVE_SEMANTIC(ParserContext);
863af6ab5fSopenharmony_ci    ~ParserContext() = default;
873af6ab5fSopenharmony_ci
883af6ab5fSopenharmony_ci    const Program *GetProgram() const
893af6ab5fSopenharmony_ci    {
903af6ab5fSopenharmony_ci        return program_;
913af6ab5fSopenharmony_ci    }
923af6ab5fSopenharmony_ci
933af6ab5fSopenharmony_ci    ParserContext *Prev() const
943af6ab5fSopenharmony_ci    {
953af6ab5fSopenharmony_ci        return prev_;
963af6ab5fSopenharmony_ci    }
973af6ab5fSopenharmony_ci
983af6ab5fSopenharmony_ci    const ParserStatus &Status() const
993af6ab5fSopenharmony_ci    {
1003af6ab5fSopenharmony_ci        return status_;
1013af6ab5fSopenharmony_ci    }
1023af6ab5fSopenharmony_ci
1033af6ab5fSopenharmony_ci    ParserStatus &Status()
1043af6ab5fSopenharmony_ci    {
1053af6ab5fSopenharmony_ci        return status_;
1063af6ab5fSopenharmony_ci    }
1073af6ab5fSopenharmony_ci
1083af6ab5fSopenharmony_ci    bool IsGenerator() const
1093af6ab5fSopenharmony_ci    {
1103af6ab5fSopenharmony_ci        return (status_ & ParserStatus::GENERATOR_FUNCTION) != 0;
1113af6ab5fSopenharmony_ci    }
1123af6ab5fSopenharmony_ci
1133af6ab5fSopenharmony_ci    bool AllowYield() const
1143af6ab5fSopenharmony_ci    {
1153af6ab5fSopenharmony_ci        return (status_ & ParserStatus::ALLOW_YIELD) != 0;
1163af6ab5fSopenharmony_ci    }
1173af6ab5fSopenharmony_ci
1183af6ab5fSopenharmony_ci    bool DisallowAwait() const
1193af6ab5fSopenharmony_ci    {
1203af6ab5fSopenharmony_ci        return (status_ & ParserStatus::DISALLOW_AWAIT) != 0;
1213af6ab5fSopenharmony_ci    }
1223af6ab5fSopenharmony_ci
1233af6ab5fSopenharmony_ci    bool IsAsync() const
1243af6ab5fSopenharmony_ci    {
1253af6ab5fSopenharmony_ci        return (status_ & ParserStatus::ASYNC_FUNCTION) != 0;
1263af6ab5fSopenharmony_ci    }
1273af6ab5fSopenharmony_ci
1283af6ab5fSopenharmony_ci    bool IsModule() const
1293af6ab5fSopenharmony_ci    {
1303af6ab5fSopenharmony_ci        return (status_ & ParserStatus::MODULE) != 0;
1313af6ab5fSopenharmony_ci    }
1323af6ab5fSopenharmony_ci
1333af6ab5fSopenharmony_ci    bool IsTsModule() const
1343af6ab5fSopenharmony_ci    {
1353af6ab5fSopenharmony_ci        return (status_ & ParserStatus::TS_MODULE) != 0;
1363af6ab5fSopenharmony_ci    }
1373af6ab5fSopenharmony_ci
1383af6ab5fSopenharmony_ci    bool IsStaticBlock() const
1393af6ab5fSopenharmony_ci    {
1403af6ab5fSopenharmony_ci        return (status_ & ParserStatus::STATIC_BLOCK) != 0;
1413af6ab5fSopenharmony_ci    }
1423af6ab5fSopenharmony_ci
1433af6ab5fSopenharmony_ci    bool DisallowArguments() const
1443af6ab5fSopenharmony_ci    {
1453af6ab5fSopenharmony_ci        return (status_ & ParserStatus::DISALLOW_ARGUMENTS) != 0;
1463af6ab5fSopenharmony_ci    }
1473af6ab5fSopenharmony_ci
1483af6ab5fSopenharmony_ci    const ParserContext *FindLabel(const util::StringView &label) const;
1493af6ab5fSopenharmony_ci
1503af6ab5fSopenharmony_ciprivate:
1513af6ab5fSopenharmony_ci    const Program *program_;
1523af6ab5fSopenharmony_ci    ParserContext *prev_ {};
1533af6ab5fSopenharmony_ci    ParserStatus status_ {};
1543af6ab5fSopenharmony_ci    util::StringView label_ {};
1553af6ab5fSopenharmony_ci};
1563af6ab5fSopenharmony_ci}  // namespace panda::es2panda::parser
1573af6ab5fSopenharmony_ci
1583af6ab5fSopenharmony_ci#endif
159