1/*
2 * Copyright (c) 2021-2024 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_IR_AST_NODE_FLAGS_H
17#define ES2PANDA_IR_AST_NODE_FLAGS_H
18
19#include <cstdint>
20
21#include "util/enumbitops.h"
22
23namespace ark::es2panda::ir {
24
25using ENUMBITOPS_OPERATORS;
26
27enum class AstNodeFlags {
28    NO_OPTS = 0,
29    CHECKCAST = 1U << 0U,
30    CONVERT_TO_STRING = 1U << 1U,
31    ALLOW_REQUIRED_INSTANTIATION = 1U << 2U,
32    HAS_EXPORT_ALIAS = 1U << 3U,
33    GENERATE_VALUE_OF = 1U << 4U,
34    GENERATE_GET_NAME = 1U << 5U,  // Transform the Enum[enumVar] MemberExpression to enumVar.getName() call
35    RECHECK = 1U << 6U,
36};
37
38enum class ModifierFlags : uint32_t {
39    NONE = 0U,
40    STATIC = 1U << 0U,
41    ASYNC = 1U << 1U,
42    PUBLIC = 1U << 2U,
43    PROTECTED = 1U << 3U,
44    PRIVATE = 1U << 4U,
45    DECLARE = 1U << 5U,
46    READONLY = 1U << 6U,
47    OPTIONAL = 1U << 7U,
48    DEFINITE = 1U << 8U,
49    ABSTRACT = 1U << 9U,
50    CONST = 1U << 10U,
51    FINAL = 1U << 11U,
52    NATIVE = 1U << 12U,
53    OVERRIDE = 1U << 13U,
54    CONSTRUCTOR = 1U << 14U,
55    SYNCHRONIZED = 1U << 15U,
56    FUNCTIONAL = 1U << 16U,
57    IN = 1U << 17U,
58    OUT = 1U << 18U,
59    INTERNAL = 1U << 19U,
60    EXPORT = 1U << 20U,
61    GETTER = 1U << 21U,
62    SETTER = 1U << 22U,
63    DEFAULT_EXPORT = 1U << 23U,
64    EXPORT_TYPE = 1U << 24U,
65    SUPER_OWNER = 1U << 26U,
66    ACCESS = PUBLIC | PROTECTED | PRIVATE | INTERNAL,
67    ALL = STATIC | ASYNC | ACCESS | DECLARE | READONLY | ABSTRACT,
68    ALLOWED_IN_CTOR_PARAMETER = ACCESS | READONLY,
69    INTERNAL_PROTECTED = INTERNAL | PROTECTED,
70    ACCESSOR_MODIFIERS = ABSTRACT | FINAL,
71    GETTER_SETTER = GETTER | SETTER,
72    EXPORTED = EXPORT | DEFAULT_EXPORT | EXPORT_TYPE
73};
74
75enum class PrivateFieldKind { FIELD, METHOD, GET, SET, STATIC_FIELD, STATIC_METHOD, STATIC_GET, STATIC_SET };
76
77enum class ScriptFunctionFlags : uint32_t {
78    NONE = 0U,
79    GENERATOR = 1U << 0U,
80    ASYNC = 1U << 1U,
81    ARROW = 1U << 2U,
82    EXPRESSION = 1U << 3U,
83    OVERLOAD = 1U << 4U,
84    CONSTRUCTOR = 1U << 5U,
85    METHOD = 1U << 6U,
86    STATIC_BLOCK = 1U << 7U,
87    HIDDEN = 1U << 8U,
88    IMPLICIT_SUPER_CALL_NEEDED = 1U << 9U,
89    ENUM = 1U << 10U,
90    EXTERNAL = 1U << 11U,
91    PROXY = 1U << 12U,
92    THROWS = 1U << 13U,
93    RETHROWS = 1U << 14U,
94    GETTER = 1U << 15U,
95    SETTER = 1U << 16U,
96    ENTRY_POINT = 1U << 17U,
97    INSTANCE_EXTENSION_METHOD = 1U << 18U,
98    HAS_RETURN = 1U << 19U,
99    ASYNC_IMPL = 1U << 20U,
100    EXTERNAL_OVERLOAD = 1U << 21U,
101};
102
103enum class TSOperatorType { READONLY, KEYOF, UNIQUE };
104enum class MappedOption { NO_OPTS, PLUS, MINUS };
105
106enum class BoxingUnboxingFlags : uint32_t {
107    NONE = 0U,
108    BOX_TO_BOOLEAN = 1U << 0U,
109    BOX_TO_BYTE = 1U << 1U,
110    BOX_TO_SHORT = 1U << 2U,
111    BOX_TO_CHAR = 1U << 3U,
112    BOX_TO_INT = 1U << 4U,
113    BOX_TO_LONG = 1U << 5U,
114    BOX_TO_FLOAT = 1U << 6U,
115    BOX_TO_DOUBLE = 1U << 7U,
116    BOX_TO_ENUM = 1U << 8U,
117    UNBOX_TO_BOOLEAN = 1U << 9U,
118    UNBOX_TO_BYTE = 1U << 10U,
119    UNBOX_TO_SHORT = 1U << 11U,
120    UNBOX_TO_CHAR = 1U << 12U,
121    UNBOX_TO_INT = 1U << 13U,
122    UNBOX_TO_LONG = 1U << 14U,
123    UNBOX_TO_FLOAT = 1U << 15U,
124    UNBOX_TO_DOUBLE = 1U << 16U,
125    UNBOX_TO_ENUM = 1U << 17U,
126    BOXING_FLAG = BOX_TO_BOOLEAN | BOX_TO_BYTE | BOX_TO_SHORT | BOX_TO_CHAR | BOX_TO_INT | BOX_TO_LONG | BOX_TO_FLOAT |
127                  BOX_TO_DOUBLE | BOX_TO_ENUM,
128    UNBOXING_FLAG = UNBOX_TO_BOOLEAN | UNBOX_TO_BYTE | UNBOX_TO_SHORT | UNBOX_TO_CHAR | UNBOX_TO_INT | UNBOX_TO_LONG |
129                    UNBOX_TO_FLOAT | UNBOX_TO_DOUBLE | UNBOX_TO_ENUM,
130};
131}  // namespace ark::es2panda::ir
132
133namespace enumbitops {
134
135template <>
136struct IsAllowedType<ark::es2panda::ir::AstNodeFlags> : std::true_type {
137};
138
139template <>
140struct IsAllowedType<ark::es2panda::ir::ModifierFlags> : std::true_type {
141};
142
143template <>
144struct IsAllowedType<ark::es2panda::ir::ScriptFunctionFlags> : std::true_type {
145};
146
147template <>
148struct IsAllowedType<ark::es2panda::ir::BoxingUnboxingFlags> : std::true_type {
149};
150
151}  // namespace enumbitops
152
153#endif
154