• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 // 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     _(LOCAL_WITH_ALIAS, LocalScopeWithTypeAlias)  \
70     /* Variable Scopes */                         \
71     _(LOOP, LoopScope)                            \
72     _(LOOP_DECL, LoopDeclarationScope)            \
73     _(FUNCTION, FunctionScope)                    \
74     _(GLOBAL, GlobalScope)                        \
75     _(MODULE, ModuleScope)
76 
77 enum class ScopeType {
78 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
79 #define GEN_SCOPE_TYPES(type, class_name) type,
80     SCOPE_TYPES(GEN_SCOPE_TYPES)
81 #undef GEN_SCOPE_TYPES
82 };
83 
84 using ENUMBITOPS_OPERATORS;
85 
86 enum class ResolveBindingOptions : uint32_t {
87     BINDINGS = 1U << 0U,
88     INTERFACES = 1U << 1U,
89     VARIABLES = 1U << 2U,
90     METHODS = 1U << 3U,
91     DECLARATION = 1U << 4U,
92     STATIC_VARIABLES = 1U << 5U,
93     STATIC_METHODS = 1U << 6U,
94     STATIC_DECLARATION = 1U << 7U,
95     TYPE_ALIASES = 1U << 8U,
96     ALL_VARIABLES = VARIABLES | STATIC_VARIABLES,
97     ALL_METHOD = METHODS | STATIC_METHODS,
98     ALL_DECLARATION = DECLARATION | STATIC_DECLARATION,
99     ALL_STATIC = STATIC_VARIABLES | STATIC_METHODS | STATIC_DECLARATION,
100     ALL_NON_STATIC = VARIABLES | METHODS | DECLARATION,
101 
102     LAST = TYPE_ALIASES,
103     ALL = (LAST << 1U) - 1U,
104     ALL_NON_TYPE = ALL - TYPE_ALIASES,
105 };
106 
107 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
108 #define VARIABLE_TYPES(_)     \
109     _(LOCAL, LocalVariable)   \
110     _(GLOBAL, GlobalVariable) \
111     _(MODULE, ModuleVariable) \
112     _(ENUM, EnumVariable)
113 
114 enum class VariableType {
115 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
116 #define GEN_VARIABLE_TYPES(type, class_name) type,
117     VARIABLE_TYPES(GEN_VARIABLE_TYPES)
118 #undef GEN_VARIABLE_TYPES
119 };
120 
121 enum class VariableKind {
122     NONE,
123     VAR,
124     LEXICAL,
125     FUNCTION,
126     MODULE,
127 };
128 
129 enum class VariableFlags : uint64_t {
130     NONE = 0U,
131     OPTIONAL = 1U << 0U,
132     PROPERTY = 1U << 1U,
133     METHOD = 1U << 2U,
134     TYPE_ALIAS = 1U << 3U,
135     INTERFACE = 1U << 4U,
136     ENUM_LITERAL = 1U << 5U,
137     READONLY = 1U << 6U,
138     COMPUTED = 1U << 7U,
139     COMPUTED_IDENT = 1U << 8U,  // Remove
140     INFERRED_IN_PATTERN = 1U << 9U,
141     REST_ARG = 1U << 10U,
142     NUMERIC_NAME = 1U << 11U,
143     TYPE = 1U << 12U,
144     LOCAL_EXPORT = 1U << 13U,
145     TYPE_PARAMETER = 1U << 14U,
146     STATIC = 1U << 15U,
147     CLASS = 1U << 16U,
148     EXPLICIT_INIT_REQUIRED = 1U << 17U,
149     PUBLIC = 1U << 18U,
150     PROTECTED = 1U << 19U,
151     PRIVATE = 1U << 20U,
152     SYNTHETIC = 1U << 21U,
153     LOCAL = 1U << 22U,
154 
155     LEXICAL = 1U << 23U,
156     LOOP_DECL = 1U << 24U,
157     PER_ITERATION = 1U << 25U,
158     LEXICAL_VAR = 1U << 26U,
159     HOIST = 1U << 27U,
160     VAR = 1U << 28U,
161     INITIALIZED = 1U << 29U,
162     LEXICAL_BOUND = 1U << 30U,
163 
164     BUILTIN_TYPE = 1ULL << 31ULL,
165     CAPTURED_MODIFIED = 1ULL << 32ULL,
166     ANNOTATIONDECL = 1ULL << 33ULL,
167     ANNOTATIONUSAGE = 1ULL << 34ULL,
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