13af6ab5fSopenharmony_ci/** 23af6ab5fSopenharmony_ci * Copyright (c) 2021-2024 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 "util/enumbitops.h" 203af6ab5fSopenharmony_ci#include "util/language.h" 213af6ab5fSopenharmony_ci#include "util/ustring.h" 223af6ab5fSopenharmony_ci 233af6ab5fSopenharmony_cinamespace ark::es2panda::parser { 243af6ab5fSopenharmony_ciclass Program; 253af6ab5fSopenharmony_ci 263af6ab5fSopenharmony_ciusing ENUMBITOPS_OPERATORS; 273af6ab5fSopenharmony_ci 283af6ab5fSopenharmony_cienum class ParserStatus : uint64_t { 293af6ab5fSopenharmony_ci NO_OPTS = 0U, 303af6ab5fSopenharmony_ci DIRECT_EVAL = 1U << 0U, 313af6ab5fSopenharmony_ci 323af6ab5fSopenharmony_ci FUNCTION = 1U << 1U, 333af6ab5fSopenharmony_ci ARROW_FUNCTION = 1U << 2U, 343af6ab5fSopenharmony_ci GENERATOR_FUNCTION = 1U << 3U, 353af6ab5fSopenharmony_ci ASYNC_FUNCTION = 1U << 4U, 363af6ab5fSopenharmony_ci CONSTRUCTOR_FUNCTION = 1U << 5U, 373af6ab5fSopenharmony_ci FUNCTION_PARAM = 1U << 6U, 383af6ab5fSopenharmony_ci IS_SPREAD = 1U << 7U, 393af6ab5fSopenharmony_ci ACCESSOR_FUNCTION = 1U << 8U, 403af6ab5fSopenharmony_ci FUNCTION_DECLARATION = 1U << 9U, 413af6ab5fSopenharmony_ci 423af6ab5fSopenharmony_ci ALLOW_SUPER = 1U << 10U, 433af6ab5fSopenharmony_ci ALLOW_SUPER_CALL = 1U << 11U, 443af6ab5fSopenharmony_ci 453af6ab5fSopenharmony_ci IN_ITERATION = 1U << 14U, 463af6ab5fSopenharmony_ci IN_LABELED = 1U << 15U, 473af6ab5fSopenharmony_ci 483af6ab5fSopenharmony_ci EXPORT_DEFAULT_REACHED = 1U << 16U, 493af6ab5fSopenharmony_ci HAS_COMPLEX_PARAM = 1U << 17U, 503af6ab5fSopenharmony_ci IN_SWITCH = 1U << 18U, 513af6ab5fSopenharmony_ci 523af6ab5fSopenharmony_ci MODULE = 1U << 19U, 533af6ab5fSopenharmony_ci ALLOW_NEW_TARGET = 1U << 20U, 543af6ab5fSopenharmony_ci 553af6ab5fSopenharmony_ci IN_EXTENDS = 1U << 21U, 563af6ab5fSopenharmony_ci ALLOW_THIS_TYPE = 1U << 22U, 573af6ab5fSopenharmony_ci IN_METHOD_DEFINITION = 1U << 23U, 583af6ab5fSopenharmony_ci IN_AMBIENT_CONTEXT = 1U << 24U, 593af6ab5fSopenharmony_ci IN_CLASS_BODY = 1U << 25U, 603af6ab5fSopenharmony_ci NEED_RETURN_TYPE = 1U << 26U, 613af6ab5fSopenharmony_ci 623af6ab5fSopenharmony_ci IN_DEFAULT_IMPORTS = 1U << 29U, 633af6ab5fSopenharmony_ci IN_EXTENSION_FUNCTION = 1U << 30U, 643af6ab5fSopenharmony_ci FUNCTION_HAS_RETURN_STATEMENT = 1U << 31U, 653af6ab5fSopenharmony_ci IN_NAMESPACE = 1ULL << 32ULL, 663af6ab5fSopenharmony_ci 673af6ab5fSopenharmony_ci ALLOW_DEFAULT_VALUE = 1ULL << 33ULL, 683af6ab5fSopenharmony_ci}; 693af6ab5fSopenharmony_ci 703af6ab5fSopenharmony_ci} // namespace ark::es2panda::parser 713af6ab5fSopenharmony_ci 723af6ab5fSopenharmony_citemplate <> 733af6ab5fSopenharmony_cistruct enumbitops::IsAllowedType<ark::es2panda::parser::ParserStatus> : std::true_type { 743af6ab5fSopenharmony_ci}; 753af6ab5fSopenharmony_ci 763af6ab5fSopenharmony_cinamespace ark::es2panda::parser { 773af6ab5fSopenharmony_ci 783af6ab5fSopenharmony_ciclass ParserContext { 793af6ab5fSopenharmony_cipublic: 803af6ab5fSopenharmony_ci // NOLINTNEXTLINE(modernize-avoid-c-arrays) 813af6ab5fSopenharmony_ci inline static constexpr char const DEFAULT_SOURCE_FILE[] = "<auxiliary_tmp>.sts"; 823af6ab5fSopenharmony_ci 833af6ab5fSopenharmony_ci explicit ParserContext(const Program *program, ParserStatus status); 843af6ab5fSopenharmony_ci 853af6ab5fSopenharmony_ci explicit ParserContext(ParserContext *current, ParserStatus newStatus, util::StringView label = "") 863af6ab5fSopenharmony_ci : program_(current->program_), prev_(current), label_(label), lang_(current->lang_) 873af6ab5fSopenharmony_ci { 883af6ab5fSopenharmony_ci ParserStatus currentStatus = current->status_; 893af6ab5fSopenharmony_ci currentStatus &= (ParserStatus::MODULE | ParserStatus::ALLOW_NEW_TARGET | ParserStatus::IN_EXTENDS | 903af6ab5fSopenharmony_ci ParserStatus::ALLOW_THIS_TYPE | ParserStatus::IN_CLASS_BODY | ParserStatus::FUNCTION | 913af6ab5fSopenharmony_ci ParserStatus::IN_AMBIENT_CONTEXT); 923af6ab5fSopenharmony_ci status_ = currentStatus | newStatus; 933af6ab5fSopenharmony_ci } 943af6ab5fSopenharmony_ci 953af6ab5fSopenharmony_ci DEFAULT_COPY_SEMANTIC(ParserContext); 963af6ab5fSopenharmony_ci DEFAULT_MOVE_SEMANTIC(ParserContext); 973af6ab5fSopenharmony_ci ~ParserContext() = default; 983af6ab5fSopenharmony_ci ParserContext() = delete; 993af6ab5fSopenharmony_ci 1003af6ab5fSopenharmony_ci [[nodiscard]] const Program *GetProgram() const noexcept 1013af6ab5fSopenharmony_ci { 1023af6ab5fSopenharmony_ci return program_; 1033af6ab5fSopenharmony_ci } 1043af6ab5fSopenharmony_ci 1053af6ab5fSopenharmony_ci void SetProgram(Program *program) noexcept 1063af6ab5fSopenharmony_ci { 1073af6ab5fSopenharmony_ci program_ = program; 1083af6ab5fSopenharmony_ci } 1093af6ab5fSopenharmony_ci 1103af6ab5fSopenharmony_ci [[nodiscard]] Language GetLanguage() const noexcept 1113af6ab5fSopenharmony_ci { 1123af6ab5fSopenharmony_ci return lang_; 1133af6ab5fSopenharmony_ci } 1143af6ab5fSopenharmony_ci 1153af6ab5fSopenharmony_ci Language SetLanguage(Language lang) noexcept 1163af6ab5fSopenharmony_ci { 1173af6ab5fSopenharmony_ci auto res = lang_; 1183af6ab5fSopenharmony_ci lang_ = lang; 1193af6ab5fSopenharmony_ci return res; 1203af6ab5fSopenharmony_ci } 1213af6ab5fSopenharmony_ci 1223af6ab5fSopenharmony_ci [[nodiscard]] ParserContext *Prev() const noexcept 1233af6ab5fSopenharmony_ci { 1243af6ab5fSopenharmony_ci return prev_; 1253af6ab5fSopenharmony_ci } 1263af6ab5fSopenharmony_ci 1273af6ab5fSopenharmony_ci [[nodiscard]] const ParserStatus &Status() const noexcept 1283af6ab5fSopenharmony_ci { 1293af6ab5fSopenharmony_ci return status_; 1303af6ab5fSopenharmony_ci } 1313af6ab5fSopenharmony_ci 1323af6ab5fSopenharmony_ci [[nodiscard]] ParserStatus &Status() noexcept 1333af6ab5fSopenharmony_ci { 1343af6ab5fSopenharmony_ci return status_; 1353af6ab5fSopenharmony_ci } 1363af6ab5fSopenharmony_ci 1373af6ab5fSopenharmony_ci [[nodiscard]] bool IsGenerator() const noexcept 1383af6ab5fSopenharmony_ci { 1393af6ab5fSopenharmony_ci return (status_ & ParserStatus::GENERATOR_FUNCTION) != 0; 1403af6ab5fSopenharmony_ci } 1413af6ab5fSopenharmony_ci 1423af6ab5fSopenharmony_ci [[nodiscard]] bool IsFunctionOrParam() const noexcept 1433af6ab5fSopenharmony_ci { 1443af6ab5fSopenharmony_ci return (status_ & (ParserStatus::FUNCTION | ParserStatus::FUNCTION_PARAM)) != 0; 1453af6ab5fSopenharmony_ci } 1463af6ab5fSopenharmony_ci 1473af6ab5fSopenharmony_ci [[nodiscard]] bool IsAsync() const noexcept 1483af6ab5fSopenharmony_ci { 1493af6ab5fSopenharmony_ci return (status_ & ParserStatus::ASYNC_FUNCTION) != 0; 1503af6ab5fSopenharmony_ci } 1513af6ab5fSopenharmony_ci 1523af6ab5fSopenharmony_ci [[nodiscard]] bool IsModule() const noexcept 1533af6ab5fSopenharmony_ci { 1543af6ab5fSopenharmony_ci return (status_ & ParserStatus::MODULE) != 0; 1553af6ab5fSopenharmony_ci } 1563af6ab5fSopenharmony_ci 1573af6ab5fSopenharmony_ci [[nodiscard]] bool IsDynamic() const noexcept 1583af6ab5fSopenharmony_ci { 1593af6ab5fSopenharmony_ci return lang_.IsDynamic(); 1603af6ab5fSopenharmony_ci } 1613af6ab5fSopenharmony_ci 1623af6ab5fSopenharmony_ci const ParserContext *FindLabel(const util::StringView &label) const; 1633af6ab5fSopenharmony_ci 1643af6ab5fSopenharmony_ci [[nodiscard]] std::string_view FormattingFileName() const noexcept 1653af6ab5fSopenharmony_ci { 1663af6ab5fSopenharmony_ci return formattingFileName_; 1673af6ab5fSopenharmony_ci } 1683af6ab5fSopenharmony_ci 1693af6ab5fSopenharmony_ci template <typename T> 1703af6ab5fSopenharmony_ci void SetFormattingFileName(T &&fileName) 1713af6ab5fSopenharmony_ci { 1723af6ab5fSopenharmony_ci formattingFileName_ = std::string_view {std::forward<T>(fileName)}; 1733af6ab5fSopenharmony_ci } 1743af6ab5fSopenharmony_ci 1753af6ab5fSopenharmony_ciprivate: 1763af6ab5fSopenharmony_ci const Program *program_; 1773af6ab5fSopenharmony_ci ParserContext *prev_ {}; 1783af6ab5fSopenharmony_ci ParserStatus status_ {}; 1793af6ab5fSopenharmony_ci util::StringView label_ {}; 1803af6ab5fSopenharmony_ci std::string_view formattingFileName_ {DEFAULT_SOURCE_FILE}; 1813af6ab5fSopenharmony_ci Language lang_; 1823af6ab5fSopenharmony_ci}; 1833af6ab5fSopenharmony_ci} // namespace ark::es2panda::parser 1843af6ab5fSopenharmony_ci 1853af6ab5fSopenharmony_ci#endif 186