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