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