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