13af6ab5fSopenharmony_ci/**
23af6ab5fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ci#ifndef ES2PANDA_COMPILER_SCOPES_VARIABLE_FLAGS_H
173af6ab5fSopenharmony_ci#define ES2PANDA_COMPILER_SCOPES_VARIABLE_FLAGS_H
183af6ab5fSopenharmony_ci
193af6ab5fSopenharmony_ci#include <cstdint>
203af6ab5fSopenharmony_ci#include "util/enumbitops.h"
213af6ab5fSopenharmony_ci
223af6ab5fSopenharmony_cinamespace ark::es2panda::varbinder {
233af6ab5fSopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
243af6ab5fSopenharmony_ci#define DECLARATION_KINDS(_)             \
253af6ab5fSopenharmony_ci    _(VAR, VarDecl)                      \
263af6ab5fSopenharmony_ci    _(LET, LetDecl)                      \
273af6ab5fSopenharmony_ci    _(CONST, ConstDecl)                  \
283af6ab5fSopenharmony_ci    _(LABEL, LabelDecl)                  \
293af6ab5fSopenharmony_ci    _(READONLY, ReadonlyDecl)            \
303af6ab5fSopenharmony_ci    _(FUNC, FunctionDecl)                \
313af6ab5fSopenharmony_ci    _(PARAM, ParameterDecl)              \
323af6ab5fSopenharmony_ci    _(IMPORT, ImportDecl)                \
333af6ab5fSopenharmony_ci    _(DYNAMIC_IMPORT, DynamicImportDecl) \
343af6ab5fSopenharmony_ci    _(EXPORT, ExportDecl)                \
353af6ab5fSopenharmony_ci    /* TS */                             \
363af6ab5fSopenharmony_ci    _(TYPE_ALIAS, TypeAliasDecl)         \
373af6ab5fSopenharmony_ci    _(NAMESPACE, NameSpaceDecl)          \
383af6ab5fSopenharmony_ci    _(INTERFACE, InterfaceDecl)          \
393af6ab5fSopenharmony_ci    _(ENUM_LITERAL, EnumLiteralDecl)     \
403af6ab5fSopenharmony_ci    _(TYPE_PARAMETER, TypeParameterDecl) \
413af6ab5fSopenharmony_ci    _(PROPERTY, PropertyDecl)            \
423af6ab5fSopenharmony_ci    _(CLASS, ClassDecl)                  \
433af6ab5fSopenharmony_ci    _(METHOD, MethodDecl)                \
443af6ab5fSopenharmony_ci    _(ENUM, EnumDecl)
453af6ab5fSopenharmony_ci
463af6ab5fSopenharmony_cienum class DeclType {
473af6ab5fSopenharmony_ci    NONE,
483af6ab5fSopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
493af6ab5fSopenharmony_ci#define DECLARE_TYPES(decl_kind, class_name) decl_kind,
503af6ab5fSopenharmony_ci    DECLARATION_KINDS(DECLARE_TYPES)
513af6ab5fSopenharmony_ci#undef DECLARE_TYPES
523af6ab5fSopenharmony_ci};
533af6ab5fSopenharmony_ci
543af6ab5fSopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
553af6ab5fSopenharmony_ci#define SCOPE_TYPES(_)                           \
563af6ab5fSopenharmony_ci    _(PARAM, ParamScope)                         \
573af6ab5fSopenharmony_ci    _(CATCH_PARAM, CatchParamScope)              \
583af6ab5fSopenharmony_ci    _(FUNCTION_PARAM, FunctionParamScope)        \
593af6ab5fSopenharmony_ci    _(CATCH, CatchScope)                         \
603af6ab5fSopenharmony_ci    _(CLASS, ClassScope)                         \
613af6ab5fSopenharmony_ci    _(LOCAL, LocalScope)                         \
623af6ab5fSopenharmony_ci    _(LOCAL_WITH_ALIAS, LocalScopeWithTypeAlias) \
633af6ab5fSopenharmony_ci    /* Variable Scopes */                        \
643af6ab5fSopenharmony_ci    _(LOOP, LoopScope)                           \
653af6ab5fSopenharmony_ci    _(LOOP_DECL, LoopDeclarationScope)           \
663af6ab5fSopenharmony_ci    _(FUNCTION, FunctionScope)                   \
673af6ab5fSopenharmony_ci    _(GLOBAL, GlobalScope)                       \
683af6ab5fSopenharmony_ci    _(MODULE, ModuleScope)
693af6ab5fSopenharmony_ci
703af6ab5fSopenharmony_cienum class ScopeType {
713af6ab5fSopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
723af6ab5fSopenharmony_ci#define GEN_SCOPE_TYPES(type, class_name) type,
733af6ab5fSopenharmony_ci    SCOPE_TYPES(GEN_SCOPE_TYPES)
743af6ab5fSopenharmony_ci#undef GEN_SCOPE_TYPES
753af6ab5fSopenharmony_ci};
763af6ab5fSopenharmony_ci
773af6ab5fSopenharmony_ciusing ENUMBITOPS_OPERATORS;
783af6ab5fSopenharmony_ci
793af6ab5fSopenharmony_cienum class ResolveBindingOptions : uint32_t {
803af6ab5fSopenharmony_ci    BINDINGS = 1U << 0U,
813af6ab5fSopenharmony_ci    INTERFACES = 1U << 1U,
823af6ab5fSopenharmony_ci    VARIABLES = 1U << 2U,
833af6ab5fSopenharmony_ci    METHODS = 1U << 3U,
843af6ab5fSopenharmony_ci    DECLARATION = 1U << 4U,
853af6ab5fSopenharmony_ci    STATIC_VARIABLES = 1U << 5U,
863af6ab5fSopenharmony_ci    STATIC_METHODS = 1U << 6U,
873af6ab5fSopenharmony_ci    STATIC_DECLARATION = 1U << 7U,
883af6ab5fSopenharmony_ci    TYPE_ALIASES = 1U << 8U,
893af6ab5fSopenharmony_ci    ALL_VARIABLES = VARIABLES | STATIC_VARIABLES,
903af6ab5fSopenharmony_ci    ALL_METHOD = METHODS | STATIC_METHODS,
913af6ab5fSopenharmony_ci    ALL_DECLARATION = DECLARATION | STATIC_DECLARATION,
923af6ab5fSopenharmony_ci    ALL_STATIC = STATIC_VARIABLES | STATIC_METHODS | STATIC_DECLARATION,
933af6ab5fSopenharmony_ci    ALL_NON_STATIC = VARIABLES | METHODS | DECLARATION,
943af6ab5fSopenharmony_ci
953af6ab5fSopenharmony_ci    LAST = TYPE_ALIASES,
963af6ab5fSopenharmony_ci    ALL = (LAST << 1U) - 1U,
973af6ab5fSopenharmony_ci    ALL_NON_TYPE = ALL - TYPE_ALIASES,
983af6ab5fSopenharmony_ci};
993af6ab5fSopenharmony_ci
1003af6ab5fSopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1013af6ab5fSopenharmony_ci#define VARIABLE_TYPES(_)     \
1023af6ab5fSopenharmony_ci    _(LOCAL, LocalVariable)   \
1033af6ab5fSopenharmony_ci    _(GLOBAL, GlobalVariable) \
1043af6ab5fSopenharmony_ci    _(MODULE, ModuleVariable) \
1053af6ab5fSopenharmony_ci    _(ENUM, EnumVariable)
1063af6ab5fSopenharmony_ci
1073af6ab5fSopenharmony_cienum class VariableType {
1083af6ab5fSopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
1093af6ab5fSopenharmony_ci#define GEN_VARIABLE_TYPES(type, class_name) type,
1103af6ab5fSopenharmony_ci    VARIABLE_TYPES(GEN_VARIABLE_TYPES)
1113af6ab5fSopenharmony_ci#undef GEN_VARIABLE_TYPES
1123af6ab5fSopenharmony_ci};
1133af6ab5fSopenharmony_ci
1143af6ab5fSopenharmony_cienum class VariableKind {
1153af6ab5fSopenharmony_ci    NONE,
1163af6ab5fSopenharmony_ci    VAR,
1173af6ab5fSopenharmony_ci    LEXICAL,
1183af6ab5fSopenharmony_ci    FUNCTION,
1193af6ab5fSopenharmony_ci    MODULE,
1203af6ab5fSopenharmony_ci};
1213af6ab5fSopenharmony_ci
1223af6ab5fSopenharmony_cienum class VariableFlags : uint64_t {
1233af6ab5fSopenharmony_ci    NONE = 0U,
1243af6ab5fSopenharmony_ci    OPTIONAL = 1U << 0U,
1253af6ab5fSopenharmony_ci    PROPERTY = 1U << 1U,
1263af6ab5fSopenharmony_ci    METHOD = 1U << 2U,
1273af6ab5fSopenharmony_ci    TYPE_ALIAS = 1U << 3U,
1283af6ab5fSopenharmony_ci    INTERFACE = 1U << 4U,
1293af6ab5fSopenharmony_ci    ENUM_LITERAL = 1U << 5U,
1303af6ab5fSopenharmony_ci    READONLY = 1U << 6U,
1313af6ab5fSopenharmony_ci    COMPUTED = 1U << 7U,
1323af6ab5fSopenharmony_ci    COMPUTED_IDENT = 1U << 8U,  // Remove
1333af6ab5fSopenharmony_ci    INFERRED_IN_PATTERN = 1U << 9U,
1343af6ab5fSopenharmony_ci    REST_ARG = 1U << 10U,
1353af6ab5fSopenharmony_ci    NUMERIC_NAME = 1U << 11U,
1363af6ab5fSopenharmony_ci    TYPE = 1U << 12U,
1373af6ab5fSopenharmony_ci    LOCAL_EXPORT = 1U << 13U,
1383af6ab5fSopenharmony_ci    TYPE_PARAMETER = 1U << 14U,
1393af6ab5fSopenharmony_ci    STATIC = 1U << 15U,
1403af6ab5fSopenharmony_ci    CLASS = 1U << 16U,
1413af6ab5fSopenharmony_ci    EXPLICIT_INIT_REQUIRED = 1U << 17U,
1423af6ab5fSopenharmony_ci    PUBLIC = 1U << 18U,
1433af6ab5fSopenharmony_ci    PROTECTED = 1U << 19U,
1443af6ab5fSopenharmony_ci    PRIVATE = 1U << 20U,
1453af6ab5fSopenharmony_ci    SYNTHETIC = 1U << 21U,
1463af6ab5fSopenharmony_ci    LOCAL = 1U << 22U,
1473af6ab5fSopenharmony_ci
1483af6ab5fSopenharmony_ci    LEXICAL = 1U << 23U,
1493af6ab5fSopenharmony_ci    LOOP_DECL = 1U << 24U,
1503af6ab5fSopenharmony_ci    PER_ITERATION = 1U << 25U,
1513af6ab5fSopenharmony_ci    LEXICAL_VAR = 1U << 26U,
1523af6ab5fSopenharmony_ci    HOIST = 1U << 27U,
1533af6ab5fSopenharmony_ci    VAR = 1U << 28U,
1543af6ab5fSopenharmony_ci    INITIALIZED = 1U << 29U,
1553af6ab5fSopenharmony_ci    LEXICAL_BOUND = 1U << 30U,
1563af6ab5fSopenharmony_ci
1573af6ab5fSopenharmony_ci    BUILTIN_TYPE = 1ULL << 31ULL,
1583af6ab5fSopenharmony_ci    CAPTURED_MODIFIED = 1ULL << 32ULL,
1593af6ab5fSopenharmony_ci
1603af6ab5fSopenharmony_ci    HOIST_VAR = HOIST | VAR,
1613af6ab5fSopenharmony_ci    CLASS_OR_INTERFACE = CLASS | INTERFACE,
1623af6ab5fSopenharmony_ci    CLASS_OR_INTERFACE_OR_ENUM = CLASS_OR_INTERFACE | ENUM_LITERAL,
1633af6ab5fSopenharmony_ci};
1643af6ab5fSopenharmony_ci
1653af6ab5fSopenharmony_cienum class LetOrConstStatus {
1663af6ab5fSopenharmony_ci    INITIALIZED,
1673af6ab5fSopenharmony_ci    UNINITIALIZED,
1683af6ab5fSopenharmony_ci};
1693af6ab5fSopenharmony_ci
1703af6ab5fSopenharmony_cienum class ScopeFlags : uint32_t {
1713af6ab5fSopenharmony_ci    NONE = 0U,
1723af6ab5fSopenharmony_ci    SET_LEXICAL_FUNCTION = 1U << 0U,
1733af6ab5fSopenharmony_ci    USE_ARGS = 1U << 2U,
1743af6ab5fSopenharmony_ci    USE_SUPER = 1U << 3U,
1753af6ab5fSopenharmony_ci    INNER_ARROW = 1U << 4U,
1763af6ab5fSopenharmony_ci    NO_REG_STORE = 1U << 5U,
1773af6ab5fSopenharmony_ci    DECL_SCOPE = 1U << 6U,
1783af6ab5fSopenharmony_ci    FIELD_SCOPE = 1U << 7U,
1793af6ab5fSopenharmony_ci    METHOD_SCOPE = 1U << 8U,
1803af6ab5fSopenharmony_ci    STATIC = 1U << 9U,
1813af6ab5fSopenharmony_ci    TYPE_ALIAS = 1U << 10U,
1823af6ab5fSopenharmony_ci    LOOP_SCOPE = 1U << 11U,
1833af6ab5fSopenharmony_ci
1843af6ab5fSopenharmony_ci    STATIC_DECL_SCOPE = DECL_SCOPE | STATIC,
1853af6ab5fSopenharmony_ci    STATIC_FIELD_SCOPE = FIELD_SCOPE | STATIC,
1863af6ab5fSopenharmony_ci    STATIC_METHOD_SCOPE = METHOD_SCOPE | STATIC,
1873af6ab5fSopenharmony_ci};
1883af6ab5fSopenharmony_ci
1893af6ab5fSopenharmony_ci}  // namespace ark::es2panda::varbinder
1903af6ab5fSopenharmony_ci
1913af6ab5fSopenharmony_cinamespace enumbitops {
1923af6ab5fSopenharmony_ci
1933af6ab5fSopenharmony_citemplate <>
1943af6ab5fSopenharmony_cistruct IsAllowedType<ark::es2panda::varbinder::ResolveBindingOptions> : std::true_type {
1953af6ab5fSopenharmony_ci};
1963af6ab5fSopenharmony_ci
1973af6ab5fSopenharmony_citemplate <>
1983af6ab5fSopenharmony_cistruct IsAllowedType<ark::es2panda::varbinder::VariableFlags> : std::true_type {
1993af6ab5fSopenharmony_ci};
2003af6ab5fSopenharmony_ci
2013af6ab5fSopenharmony_citemplate <>
2023af6ab5fSopenharmony_cistruct IsAllowedType<ark::es2panda::varbinder::ScopeFlags> : std::true_type {
2033af6ab5fSopenharmony_ci};
2043af6ab5fSopenharmony_ci
2053af6ab5fSopenharmony_ci}  // namespace enumbitops
2063af6ab5fSopenharmony_ci
2073af6ab5fSopenharmony_ci#endif
208