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