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