1/**
2 * Copyright (c) 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_COMPILER_SCOPES_VARIABLE_FLAGS_H
17#define ES2PANDA_COMPILER_SCOPES_VARIABLE_FLAGS_H
18
19#include <cstdint>
20#include "util/enumbitops.h"
21
22namespace ark::es2panda::varbinder {
23// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
24#define DECLARATION_KINDS(_)             \
25    _(VAR, VarDecl)                      \
26    _(LET, LetDecl)                      \
27    _(CONST, ConstDecl)                  \
28    _(LABEL, LabelDecl)                  \
29    _(READONLY, ReadonlyDecl)            \
30    _(FUNC, FunctionDecl)                \
31    _(PARAM, ParameterDecl)              \
32    _(IMPORT, ImportDecl)                \
33    _(DYNAMIC_IMPORT, DynamicImportDecl) \
34    _(EXPORT, ExportDecl)                \
35    /* TS */                             \
36    _(TYPE_ALIAS, TypeAliasDecl)         \
37    _(NAMESPACE, NameSpaceDecl)          \
38    _(INTERFACE, InterfaceDecl)          \
39    _(ENUM_LITERAL, EnumLiteralDecl)     \
40    _(TYPE_PARAMETER, TypeParameterDecl) \
41    _(PROPERTY, PropertyDecl)            \
42    _(CLASS, ClassDecl)                  \
43    _(METHOD, MethodDecl)                \
44    _(ENUM, EnumDecl)
45
46enum class DeclType {
47    NONE,
48// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
49#define DECLARE_TYPES(decl_kind, class_name) decl_kind,
50    DECLARATION_KINDS(DECLARE_TYPES)
51#undef DECLARE_TYPES
52};
53
54// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
55#define SCOPE_TYPES(_)                           \
56    _(PARAM, ParamScope)                         \
57    _(CATCH_PARAM, CatchParamScope)              \
58    _(FUNCTION_PARAM, FunctionParamScope)        \
59    _(CATCH, CatchScope)                         \
60    _(CLASS, ClassScope)                         \
61    _(LOCAL, LocalScope)                         \
62    _(LOCAL_WITH_ALIAS, LocalScopeWithTypeAlias) \
63    /* Variable Scopes */                        \
64    _(LOOP, LoopScope)                           \
65    _(LOOP_DECL, LoopDeclarationScope)           \
66    _(FUNCTION, FunctionScope)                   \
67    _(GLOBAL, GlobalScope)                       \
68    _(MODULE, ModuleScope)
69
70enum class ScopeType {
71// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
72#define GEN_SCOPE_TYPES(type, class_name) type,
73    SCOPE_TYPES(GEN_SCOPE_TYPES)
74#undef GEN_SCOPE_TYPES
75};
76
77using ENUMBITOPS_OPERATORS;
78
79enum class ResolveBindingOptions : uint32_t {
80    BINDINGS = 1U << 0U,
81    INTERFACES = 1U << 1U,
82    VARIABLES = 1U << 2U,
83    METHODS = 1U << 3U,
84    DECLARATION = 1U << 4U,
85    STATIC_VARIABLES = 1U << 5U,
86    STATIC_METHODS = 1U << 6U,
87    STATIC_DECLARATION = 1U << 7U,
88    TYPE_ALIASES = 1U << 8U,
89    ALL_VARIABLES = VARIABLES | STATIC_VARIABLES,
90    ALL_METHOD = METHODS | STATIC_METHODS,
91    ALL_DECLARATION = DECLARATION | STATIC_DECLARATION,
92    ALL_STATIC = STATIC_VARIABLES | STATIC_METHODS | STATIC_DECLARATION,
93    ALL_NON_STATIC = VARIABLES | METHODS | DECLARATION,
94
95    LAST = TYPE_ALIASES,
96    ALL = (LAST << 1U) - 1U,
97    ALL_NON_TYPE = ALL - TYPE_ALIASES,
98};
99
100// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
101#define VARIABLE_TYPES(_)     \
102    _(LOCAL, LocalVariable)   \
103    _(GLOBAL, GlobalVariable) \
104    _(MODULE, ModuleVariable) \
105    _(ENUM, EnumVariable)
106
107enum class VariableType {
108// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
109#define GEN_VARIABLE_TYPES(type, class_name) type,
110    VARIABLE_TYPES(GEN_VARIABLE_TYPES)
111#undef GEN_VARIABLE_TYPES
112};
113
114enum class VariableKind {
115    NONE,
116    VAR,
117    LEXICAL,
118    FUNCTION,
119    MODULE,
120};
121
122enum class VariableFlags : uint64_t {
123    NONE = 0U,
124    OPTIONAL = 1U << 0U,
125    PROPERTY = 1U << 1U,
126    METHOD = 1U << 2U,
127    TYPE_ALIAS = 1U << 3U,
128    INTERFACE = 1U << 4U,
129    ENUM_LITERAL = 1U << 5U,
130    READONLY = 1U << 6U,
131    COMPUTED = 1U << 7U,
132    COMPUTED_IDENT = 1U << 8U,  // Remove
133    INFERRED_IN_PATTERN = 1U << 9U,
134    REST_ARG = 1U << 10U,
135    NUMERIC_NAME = 1U << 11U,
136    TYPE = 1U << 12U,
137    LOCAL_EXPORT = 1U << 13U,
138    TYPE_PARAMETER = 1U << 14U,
139    STATIC = 1U << 15U,
140    CLASS = 1U << 16U,
141    EXPLICIT_INIT_REQUIRED = 1U << 17U,
142    PUBLIC = 1U << 18U,
143    PROTECTED = 1U << 19U,
144    PRIVATE = 1U << 20U,
145    SYNTHETIC = 1U << 21U,
146    LOCAL = 1U << 22U,
147
148    LEXICAL = 1U << 23U,
149    LOOP_DECL = 1U << 24U,
150    PER_ITERATION = 1U << 25U,
151    LEXICAL_VAR = 1U << 26U,
152    HOIST = 1U << 27U,
153    VAR = 1U << 28U,
154    INITIALIZED = 1U << 29U,
155    LEXICAL_BOUND = 1U << 30U,
156
157    BUILTIN_TYPE = 1ULL << 31ULL,
158    CAPTURED_MODIFIED = 1ULL << 32ULL,
159
160    HOIST_VAR = HOIST | VAR,
161    CLASS_OR_INTERFACE = CLASS | INTERFACE,
162    CLASS_OR_INTERFACE_OR_ENUM = CLASS_OR_INTERFACE | ENUM_LITERAL,
163};
164
165enum class LetOrConstStatus {
166    INITIALIZED,
167    UNINITIALIZED,
168};
169
170enum class ScopeFlags : uint32_t {
171    NONE = 0U,
172    SET_LEXICAL_FUNCTION = 1U << 0U,
173    USE_ARGS = 1U << 2U,
174    USE_SUPER = 1U << 3U,
175    INNER_ARROW = 1U << 4U,
176    NO_REG_STORE = 1U << 5U,
177    DECL_SCOPE = 1U << 6U,
178    FIELD_SCOPE = 1U << 7U,
179    METHOD_SCOPE = 1U << 8U,
180    STATIC = 1U << 9U,
181    TYPE_ALIAS = 1U << 10U,
182    LOOP_SCOPE = 1U << 11U,
183
184    STATIC_DECL_SCOPE = DECL_SCOPE | STATIC,
185    STATIC_FIELD_SCOPE = FIELD_SCOPE | STATIC,
186    STATIC_METHOD_SCOPE = METHOD_SCOPE | STATIC,
187};
188
189}  // namespace ark::es2panda::varbinder
190
191namespace enumbitops {
192
193template <>
194struct IsAllowedType<ark::es2panda::varbinder::ResolveBindingOptions> : std::true_type {
195};
196
197template <>
198struct IsAllowedType<ark::es2panda::varbinder::VariableFlags> : std::true_type {
199};
200
201template <>
202struct IsAllowedType<ark::es2panda::varbinder::ScopeFlags> : std::true_type {
203};
204
205}  // namespace enumbitops
206
207#endif
208