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