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