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 _(LOOP, LoopScope) \ 57 _(FUNCTION, FunctionScope) \ 58 _(GLOBAL, GlobalScope) \ 59 _(MODULE, ModuleScope) \ 60 _(TSMODULE, TSModuleScope) 61 62 63 enum class ScopeType { 64 #define GEN_SCOPE_TYPES(type, class_name) type, 65 SCOPE_TYPES(GEN_SCOPE_TYPES) 66 #undef GEN_SCOPE_TYPES 67 }; 68 69 enum class ResolveBindingOptions { 70 BINDINGS = 1U << 0U, 71 INTERFACES = 1U << 1U, 72 73 ALL = BINDINGS | INTERFACES, 74 }; 75 76 DEFINE_BITOPS(ResolveBindingOptions) 77 78 enum class ResolveBindingFlags { 79 ALL = 1U << 0U, 80 TS_BEFORE_TRANSFORM = 1U << 1U, 81 }; 82 83 DEFINE_BITOPS(ResolveBindingFlags) 84 85 #define VARIABLE_TYPES(_) \ 86 _(LOCAL, LocalVariable) \ 87 _(GLOBAL, GlobalVariable) \ 88 _(MODULE, ModuleVariable) \ 89 _(ENUM, EnumVariable) \ 90 _(NAMESPACE, NamespaceVariable) \ 91 _(IMPORT_EQUALS, ImportEqualsVariable) 92 93 enum class VariableType { 94 #define GEN_VARIABLE_TYPES(type, class_name) type, 95 VARIABLE_TYPES(GEN_VARIABLE_TYPES) 96 #undef GEN_VARIABLE_TYPES 97 }; 98 99 enum class VariableKind { 100 NONE, 101 VAR, 102 LEXICAL, 103 FUNCTION, 104 MODULE, 105 }; 106 107 enum class VariableFlags { 108 NONE = 0, 109 OPTIONAL = 1 << 0, 110 PROPERTY = 1 << 1, 111 METHOD = 1 << 2, 112 TYPE_ALIAS = 1 << 3, 113 INTERFACE = 1 << 4, 114 ENUM_LITERAL = 1 << 5, 115 READONLY = 1 << 6, 116 COMPUTED = 1 << 7, 117 COMPUTED_IDENT = 1 << 8, 118 COMPUTED_INDEX = 1 << 9, 119 INDEX_NAME = 1 << 10, 120 IMPORT = 1 << 11, 121 LOCAL_EXPORT = 1 << 12, 122 INFERED_IN_PATTERN = 1 << 13, 123 REST_ARG = 1 << 14, 124 NUMERIC_NAME = 1 << 15, 125 TYPE = 1 << 16, 126 NAMESPACE = 1 << 17, 127 IMPORT_EQUALS = 1 << 18, 128 129 INDEX_LIKE = COMPUTED_INDEX | INDEX_NAME, 130 131 LOOP_DECL = 1 << 25, 132 PER_ITERATION = 1 << 26, 133 HOIST = 1 << 27, 134 VAR = 1 << 28, 135 INITIALIZED = 1 << 29, 136 LEXICAL_BOUND = 1 << 30, 137 138 HOIST_VAR = HOIST | VAR, 139 }; 140 141 DEFINE_BITOPS(VariableFlags) 142 143 enum class LetOrConstStatus { 144 INITIALIZED, 145 UNINITIALIZED, 146 }; 147 148 enum class VariableScopeFlags { 149 NONE = 0, 150 SET_LEXICAL_FUNCTION = 1U << 0U, 151 USE_ARGS = 1U << 2U, 152 USE_SUPER = 1U << 3U, 153 INNER_ARROW = 1U << 4U, 154 }; 155 156 DEFINE_BITOPS(VariableScopeFlags) 157 158 enum class DeclarationFlags { 159 NONE = 0, 160 IMPORT = 1 << 0, 161 EXPORT = 1 << 1, 162 NAMESPACE_IMPORT = 1 << 2, 163 }; 164 165 DEFINE_BITOPS(DeclarationFlags) 166 167 enum class TSBindingType : size_t { 168 NAMESPACE = 0, 169 ENUM, 170 INTERFACE, 171 IMPORT_EQUALS, 172 COUNT, 173 }; 174 175 } // namespace panda::es2panda::binder 176 177 #endif 178