1 /**
2  * Copyright (c) 2021 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 <cstdlib>
20 #include <cstdint>
21 #include <util/enumbitops.h>
22 
23 namespace panda::es2panda::binder {
24 
25 #define DECLARATION_KINDS(_)             \
26     _(VAR, VarDecl)                      \
27     _(LET, LetDecl)                      \
28     _(CONST, ConstDecl)                  \
29     _(CLASS, ClassDecl)                  \
30     _(FUNC, FunctionDecl)                \
31     _(PARAM, ParameterDecl)              \
32     /* TS */                             \
33     _(TYPE_ALIAS, TypeAliasDecl)         \
34     _(NAMESPACE, NamespaceDecl)          \
35     _(INTERFACE, InterfaceDecl)          \
36     _(ENUM_LITERAL, EnumLiteralDecl)     \
37     _(TYPE_PARAMETER, TypeParameterDecl) \
38     _(PROPERTY, PropertyDecl)            \
39     _(METHOD, MethodDecl)                \
40     _(ENUM, EnumDecl)                    \
41     _(IMPORT_EQUALS, ImportEqualsDecl)
42 
43 enum class DeclType {
44     NONE,
45 #define DECLARE_TYPES(decl_kind, class_name) decl_kind,
46     DECLARATION_KINDS(DECLARE_TYPES)
47 #undef DECLARE_TYPES
48 };
49 
50 #define SCOPE_TYPES(_)                    \
51     _(PARAM, ParamScope)                  \
52     _(CATCH_PARAM, CatchParamScope)       \
53     _(FUNCTION_PARAM, FunctionParamScope) \
54     _(CATCH, CatchScope)                  \
55     _(LOCAL, LocalScope)                  \
56     /* Variable Scopes */                 \
57     _(CLASS, ClassScope)                  \
58     _(LOOP, LoopScope)                    \
59     _(FUNCTION, FunctionScope)            \
60     _(STATIC_BLOCK, StaticBlockScope)     \
61     _(GLOBAL, GlobalScope)                \
62     _(MODULE, ModuleScope)                \
63     _(TSMODULE, TSModuleScope)            \
64     _(TSENUM, TSEnumScope)
65 
66 
67 enum class ScopeType {
68 #define GEN_SCOPE_TYPES(type, class_name) type,
69     SCOPE_TYPES(GEN_SCOPE_TYPES)
70 #undef GEN_SCOPE_TYPES
71 };
72 
73 enum class ResolveBindingOptions : uint8_t {
74     BINDINGS = 1U << 0U,
75     INTERFACES = 1U << 1U,
76 
77     ALL = BINDINGS | INTERFACES,
78 };
79 
80 DEFINE_BITOPS(ResolveBindingOptions)
81 
82 enum class ResolveBindingFlags : uint8_t {
83     ALL = 1U << 0U,
84     TS_BEFORE_TRANSFORM = 1U << 1U,
85     TS_AFTER_TRANSFORM = 1U << 2U,
86 };
87 
88 DEFINE_BITOPS(ResolveBindingFlags)
89 
90 #define VARIABLE_TYPES(_)                  \
91     _(LOCAL, LocalVariable)                \
92     _(GLOBAL, GlobalVariable)              \
93     _(MODULE, ModuleVariable)              \
94     _(ENUM, EnumVariable)                  \
95     _(NAMESPACE, NamespaceVariable)        \
96     _(IMPORT_EQUALS, ImportEqualsVariable) \
97     _(ENUMLITERAL, EnumLiteralVariable)
98 
99 enum class VariableType {
100 #define GEN_VARIABLE_TYPES(type, class_name) type,
101     VARIABLE_TYPES(GEN_VARIABLE_TYPES)
102 #undef GEN_VARIABLE_TYPES
103 };
104 
105 enum class VariableKind {
106     NONE,
107     VAR,
108     LEXICAL,
109     FUNCTION,
110     MODULE,
111 };
112 
113 enum class VariableFlags : uint64_t {
114     NONE = 0,
115     OPTIONAL = 1 << 0,
116     PROPERTY = 1 << 1,
117     METHOD = 1 << 2,
118     TYPE_ALIAS = 1 << 3,
119     INTERFACE = 1 << 4,
120     ENUM_LITERAL = 1 << 5,
121     READONLY = 1 << 6,
122     COMPUTED = 1 << 7,
123     COMPUTED_IDENT = 1 << 8,
124     COMPUTED_INDEX = 1 << 9,
125     INDEX_NAME = 1 << 10,
126     IMPORT = 1 << 11,
127     LOCAL_EXPORT = 1 << 12,
128     INFERED_IN_PATTERN = 1 << 13,
129     REST_ARG = 1 << 14,
130     NUMERIC_NAME = 1 << 15,
131     TYPE = 1 << 16,
132     NAMESPACE = 1 << 17,
133     IMPORT_EQUALS = 1 << 18,
134 
135     INDEX_LIKE = COMPUTED_INDEX | INDEX_NAME,
136 
137     LOOP_DECL = 1 << 25,
138     PER_ITERATION = 1 << 26,
139     HOIST = 1 << 27,
140     VAR = 1 << 28,
141     INITIALIZED = 1 << 29,
142     LEXICAL_BOUND = 1 << 30,
143     IN_SENDABLE_ENV = 1 << 31,
144 
145     HOIST_VAR = HOIST | VAR,
146 };
147 
148 DEFINE_BITOPS(VariableFlags)
149 
150 enum class LetOrConstStatus {
151     INITIALIZED,
152     UNINITIALIZED,
153 };
154 
155 enum class VariableScopeFlags : uint8_t {
156     NONE = 0,
157     SET_LEXICAL_FUNCTION = 1U << 0U,
158     USE_ARGS = 1U << 2U,
159     USE_SUPER = 1U << 3U,
160     INNER_ARROW = 1U << 4U,
161 };
162 
163 DEFINE_BITOPS(VariableScopeFlags)
164 
165 enum class DeclarationFlags : uint8_t {
166     NONE = 0,
167     IMPORT = 1 << 0,
168     EXPORT = 1 << 1,
169     NAMESPACE_IMPORT = 1 << 2,
170     EXPORT_IN_TSMODULE = 1 << 3,
171 };
172 
173 DEFINE_BITOPS(DeclarationFlags)
174 
175 enum class TSBindingType : size_t {
176     NAMESPACE = 0,
177     ENUMLITERAL,
178     INTERFACE,
179     IMPORT_EQUALS,
180     COUNT,
181 };
182 
183 }  // namespace panda::es2panda::binder
184 
185 #endif
186