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 
22 namespace 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 
46 enum 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 
70 enum 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 
77 using ENUMBITOPS_OPERATORS;
78 
79 enum 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 
107 enum 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 
114 enum class VariableKind {
115     NONE,
116     VAR,
117     LEXICAL,
118     FUNCTION,
119     MODULE,
120 };
121 
122 enum 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 
165 enum class LetOrConstStatus {
166     INITIALIZED,
167     UNINITIALIZED,
168 };
169 
170 enum 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 
191 namespace enumbitops {
192 
193 template <>
194 struct IsAllowedType<ark::es2panda::varbinder::ResolveBindingOptions> : std::true_type {
195 };
196 
197 template <>
198 struct IsAllowedType<ark::es2panda::varbinder::VariableFlags> : std::true_type {
199 };
200 
201 template <>
202 struct IsAllowedType<ark::es2panda::varbinder::ScopeFlags> : std::true_type {
203 };
204 
205 }  // namespace enumbitops
206 
207 #endif
208