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_PARSER_CORE_PARSER_PRIVATE_CONTEXT_H
17#define ES2PANDA_PARSER_CORE_PARSER_PRIVATE_CONTEXT_H
18
19#include "util/enumbitops.h"
20#include "util/language.h"
21#include "util/ustring.h"
22
23namespace ark::es2panda::parser {
24class Program;
25
26using ENUMBITOPS_OPERATORS;
27
28enum class ParserStatus : uint64_t {
29    NO_OPTS = 0U,
30    DIRECT_EVAL = 1U << 0U,
31
32    FUNCTION = 1U << 1U,
33    ARROW_FUNCTION = 1U << 2U,
34    GENERATOR_FUNCTION = 1U << 3U,
35    ASYNC_FUNCTION = 1U << 4U,
36    CONSTRUCTOR_FUNCTION = 1U << 5U,
37    FUNCTION_PARAM = 1U << 6U,
38    IS_SPREAD = 1U << 7U,
39    ACCESSOR_FUNCTION = 1U << 8U,
40    FUNCTION_DECLARATION = 1U << 9U,
41
42    ALLOW_SUPER = 1U << 10U,
43    ALLOW_SUPER_CALL = 1U << 11U,
44
45    IN_ITERATION = 1U << 14U,
46    IN_LABELED = 1U << 15U,
47
48    EXPORT_DEFAULT_REACHED = 1U << 16U,
49    HAS_COMPLEX_PARAM = 1U << 17U,
50    IN_SWITCH = 1U << 18U,
51
52    MODULE = 1U << 19U,
53    ALLOW_NEW_TARGET = 1U << 20U,
54
55    IN_EXTENDS = 1U << 21U,
56    ALLOW_THIS_TYPE = 1U << 22U,
57    IN_METHOD_DEFINITION = 1U << 23U,
58    IN_AMBIENT_CONTEXT = 1U << 24U,
59    IN_CLASS_BODY = 1U << 25U,
60    NEED_RETURN_TYPE = 1U << 26U,
61
62    IN_DEFAULT_IMPORTS = 1U << 29U,
63    IN_EXTENSION_FUNCTION = 1U << 30U,
64    FUNCTION_HAS_RETURN_STATEMENT = 1U << 31U,
65    IN_NAMESPACE = 1ULL << 32ULL,
66
67    ALLOW_DEFAULT_VALUE = 1ULL << 33ULL,
68};
69
70}  // namespace ark::es2panda::parser
71
72template <>
73struct enumbitops::IsAllowedType<ark::es2panda::parser::ParserStatus> : std::true_type {
74};
75
76namespace ark::es2panda::parser {
77
78class ParserContext {
79public:
80    // NOLINTNEXTLINE(modernize-avoid-c-arrays)
81    inline static constexpr char const DEFAULT_SOURCE_FILE[] = "<auxiliary_tmp>.sts";
82
83    explicit ParserContext(const Program *program, ParserStatus status);
84
85    explicit ParserContext(ParserContext *current, ParserStatus newStatus, util::StringView label = "")
86        : program_(current->program_), prev_(current), label_(label), lang_(current->lang_)
87    {
88        ParserStatus currentStatus = current->status_;
89        currentStatus &= (ParserStatus::MODULE | ParserStatus::ALLOW_NEW_TARGET | ParserStatus::IN_EXTENDS |
90                          ParserStatus::ALLOW_THIS_TYPE | ParserStatus::IN_CLASS_BODY | ParserStatus::FUNCTION |
91                          ParserStatus::IN_AMBIENT_CONTEXT);
92        status_ = currentStatus | newStatus;
93    }
94
95    DEFAULT_COPY_SEMANTIC(ParserContext);
96    DEFAULT_MOVE_SEMANTIC(ParserContext);
97    ~ParserContext() = default;
98    ParserContext() = delete;
99
100    [[nodiscard]] const Program *GetProgram() const noexcept
101    {
102        return program_;
103    }
104
105    void SetProgram(Program *program) noexcept
106    {
107        program_ = program;
108    }
109
110    [[nodiscard]] Language GetLanguage() const noexcept
111    {
112        return lang_;
113    }
114
115    Language SetLanguage(Language lang) noexcept
116    {
117        auto res = lang_;
118        lang_ = lang;
119        return res;
120    }
121
122    [[nodiscard]] ParserContext *Prev() const noexcept
123    {
124        return prev_;
125    }
126
127    [[nodiscard]] const ParserStatus &Status() const noexcept
128    {
129        return status_;
130    }
131
132    [[nodiscard]] ParserStatus &Status() noexcept
133    {
134        return status_;
135    }
136
137    [[nodiscard]] bool IsGenerator() const noexcept
138    {
139        return (status_ & ParserStatus::GENERATOR_FUNCTION) != 0;
140    }
141
142    [[nodiscard]] bool IsFunctionOrParam() const noexcept
143    {
144        return (status_ & (ParserStatus::FUNCTION | ParserStatus::FUNCTION_PARAM)) != 0;
145    }
146
147    [[nodiscard]] bool IsAsync() const noexcept
148    {
149        return (status_ & ParserStatus::ASYNC_FUNCTION) != 0;
150    }
151
152    [[nodiscard]] bool IsModule() const noexcept
153    {
154        return (status_ & ParserStatus::MODULE) != 0;
155    }
156
157    [[nodiscard]] bool IsDynamic() const noexcept
158    {
159        return lang_.IsDynamic();
160    }
161
162    const ParserContext *FindLabel(const util::StringView &label) const;
163
164    [[nodiscard]] std::string_view FormattingFileName() const noexcept
165    {
166        return formattingFileName_;
167    }
168
169    template <typename T>
170    void SetFormattingFileName(T &&fileName)
171    {
172        formattingFileName_ = std::string_view {std::forward<T>(fileName)};
173    }
174
175private:
176    const Program *program_;
177    ParserContext *prev_ {};
178    ParserStatus status_ {};
179    util::StringView label_ {};
180    std::string_view formattingFileName_ {DEFAULT_SOURCE_FILE};
181    Language lang_;
182};
183}  // namespace ark::es2panda::parser
184
185#endif
186