1/**
2 * Copyright (c) 2021-2022 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#include "token.h"
17
18#include "letters.h"
19
20namespace panda::es2panda::lexer {
21
22bool Token::IsAccessability() const
23{
24    return (type_ == TokenType::LITERAL_IDENT &&
25            (keywordType_ == TokenType::KEYW_PUBLIC || keywordType_ == TokenType::KEYW_PROTECTED ||
26             keywordType_ == TokenType::KEYW_PRIVATE) &&
27            !(flags_ & TokenFlags::HAS_ESCAPE));
28}
29
30bool Token::IsAsyncModifier() const
31{
32    return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_ASYNC &&
33            !(flags_ & TokenFlags::HAS_ESCAPE));
34}
35
36bool Token::IsStaticModifier() const
37{
38    return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_STATIC &&
39            !(flags_ & TokenFlags::HAS_ESCAPE));
40}
41
42bool Token::IsDeclareModifier() const
43{
44    return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_DECLARE &&
45            !(flags_ & TokenFlags::HAS_ESCAPE));
46}
47
48bool Token::IsReadonlyModifier() const
49{
50    return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_READONLY &&
51            !(flags_ & TokenFlags::HAS_ESCAPE));
52}
53
54bool Token::IsAccessorModifier() const
55{
56    return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_ACCESSOR &&
57            !(flags_ & TokenFlags::HAS_ESCAPE));
58}
59
60bool Token::IsUpdate() const
61{
62    return (type_ == TokenType::PUNCTUATOR_MINUS_MINUS || type_ == TokenType::PUNCTUATOR_PLUS_PLUS);
63}
64
65bool Token::IsUnary() const
66{
67    return (type_ == TokenType::PUNCTUATOR_MINUS || type_ == TokenType::PUNCTUATOR_PLUS ||
68            type_ == TokenType::PUNCTUATOR_TILDE || type_ == TokenType::PUNCTUATOR_EXCLAMATION_MARK ||
69            type_ == TokenType::PUNCTUATOR_PLUS_PLUS || type_ == TokenType::PUNCTUATOR_MINUS_MINUS ||
70            type_ == TokenType::KEYW_TYPEOF || type_ == TokenType::KEYW_VOID || type_ == TokenType::KEYW_DELETE ||
71            type_ == TokenType::KEYW_AWAIT);
72}
73
74bool Token::IsPropNameLiteral() const
75{
76    return (type_ == TokenType::LITERAL_STRING || type_ == TokenType::LITERAL_NUMBER ||
77            type_ == TokenType::LITERAL_TRUE || type_ == TokenType::LITERAL_FALSE);
78}
79
80bool Token::IsKeyword() const
81{
82    return (type_ >= TokenType::FIRST_KEYW || type_ == TokenType::KEYW_IN || type_ == TokenType::KEYW_INSTANCEOF);
83}
84
85bool Token::IsReservedTypeName() const
86{
87    switch (keywordType_) {
88        case TokenType::KEYW_ANY:
89        case TokenType::KEYW_UNKNOWN:
90        case TokenType::KEYW_NEVER:
91        case TokenType::KEYW_NUMBER:
92        case TokenType::KEYW_BIGINT:
93        case TokenType::KEYW_BOOLEAN:
94        case TokenType::KEYW_STRING:
95        case TokenType::KEYW_VOID:
96        case TokenType::KEYW_OBJECT:
97            return true;
98        default:
99            return false;
100    }
101}
102
103bool Token::IsJsStrictReservedWord() const
104{
105    switch (keywordType_) {
106        case TokenType::KEYW_ARGUMENTS:
107        case TokenType::KEYW_EVAL:
108        case TokenType::KEYW_STATIC:
109        case TokenType::KEYW_PRIVATE:
110        case TokenType::KEYW_PROTECTED:
111        case TokenType::KEYW_PUBLIC:
112        case TokenType::KEYW_IMPLEMENTS:
113        case TokenType::KEYW_INTERFACE:
114        case TokenType::KEYW_PACKAGE:
115        case TokenType::KEYW_LET:
116        case TokenType::KEYW_YIELD:
117            return true;
118        default:
119            return false;
120    }
121}
122
123bool Token::IsBinaryToken(TokenType type)
124{
125    return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_EXPONENTIATION);
126}
127
128bool Token::IsBinaryLvalueToken(TokenType type)
129{
130    return (type >= TokenType::PUNCTUATOR_SUBSTITUTION && type <= TokenType::PUNCTUATOR_EXPONENTIATION_EQUAL);
131}
132
133bool Token::IsUpdateToken(TokenType type)
134{
135    return (type == TokenType::PUNCTUATOR_MINUS_MINUS || type == TokenType::PUNCTUATOR_PLUS_PLUS);
136}
137
138bool Token::IsPunctuatorToken(TokenType type)
139{
140    return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_ARROW);
141}
142
143bool Token::IsTsParamToken(TokenType type, char32_t nextChar)
144{
145    return (type == TokenType::PUNCTUATOR_COLON || (type == TokenType::PUNCTUATOR_QUESTION_MARK &&
146        (nextChar == LEX_CHAR_COMMA || nextChar == LEX_CHAR_COLON || nextChar == LEX_CHAR_RIGHT_PAREN)));
147}
148
149const char *TokenToString(TokenType type)
150{
151    switch (type) {
152        case TokenType::PUNCTUATOR_BITWISE_AND:
153            return "&";
154        case TokenType::PUNCTUATOR_BITWISE_OR:
155            return "|";
156        case TokenType::PUNCTUATOR_MULTIPLY:
157            return "*";
158        case TokenType::PUNCTUATOR_DIVIDE:
159            return "/";
160        case TokenType::PUNCTUATOR_MINUS:
161            return "-";
162        case TokenType::PUNCTUATOR_EXCLAMATION_MARK:
163            return "!";
164        case TokenType::PUNCTUATOR_TILDE:
165            return "~";
166        case TokenType::PUNCTUATOR_MINUS_MINUS:
167            return "--";
168        case TokenType::PUNCTUATOR_LEFT_SHIFT:
169            return "<<";
170        case TokenType::PUNCTUATOR_RIGHT_SHIFT:
171            return ">>";
172        case TokenType::PUNCTUATOR_LESS_THAN_EQUAL:
173            return "<=";
174        case TokenType::PUNCTUATOR_GREATER_THAN_EQUAL:
175            return ">=";
176        case TokenType::PUNCTUATOR_MOD:
177            return "%";
178        case TokenType::PUNCTUATOR_BITWISE_XOR:
179            return "^";
180        case TokenType::PUNCTUATOR_EXPONENTIATION:
181            return "**";
182        case TokenType::PUNCTUATOR_MULTIPLY_EQUAL:
183            return "*=";
184        case TokenType::PUNCTUATOR_EXPONENTIATION_EQUAL:
185            return "**=";
186        case TokenType::PUNCTUATOR_DIVIDE_EQUAL:
187            return "/=";
188        case TokenType::PUNCTUATOR_MOD_EQUAL:
189            return "%=";
190        case TokenType::PUNCTUATOR_MINUS_EQUAL:
191            return "-=";
192        case TokenType::PUNCTUATOR_LEFT_SHIFT_EQUAL:
193            return "<<=";
194        case TokenType::PUNCTUATOR_RIGHT_SHIFT_EQUAL:
195            return ">>=";
196        case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT:
197            return ">>>";
198        case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT_EQUAL:
199            return ">>>=";
200        case TokenType::PUNCTUATOR_BITWISE_AND_EQUAL:
201            return "&=";
202        case TokenType::PUNCTUATOR_BITWISE_OR_EQUAL:
203            return "|=";
204        case TokenType::PUNCTUATOR_LOGICAL_AND_EQUAL:
205            return "&&=";
206        case TokenType::PUNCTUATOR_NULLISH_COALESCING:
207            return "??";
208        case TokenType::PUNCTUATOR_LOGICAL_OR_EQUAL:
209            return "||=";
210        case TokenType::PUNCTUATOR_LOGICAL_NULLISH_EQUAL:
211            return "\?\?=";
212        case TokenType::PUNCTUATOR_BITWISE_XOR_EQUAL:
213            return "^=";
214        case TokenType::PUNCTUATOR_PLUS:
215            return "+";
216        case TokenType::PUNCTUATOR_PLUS_PLUS:
217            return "++";
218        case TokenType::PUNCTUATOR_PLUS_EQUAL:
219            return "+=";
220        case TokenType::PUNCTUATOR_LESS_THAN:
221            return "<";
222        case TokenType::PUNCTUATOR_GREATER_THAN:
223            return ">";
224        case TokenType::PUNCTUATOR_EQUAL:
225            return "==";
226        case TokenType::PUNCTUATOR_NOT_EQUAL:
227            return "!=";
228        case TokenType::PUNCTUATOR_STRICT_EQUAL:
229            return "===";
230        case TokenType::PUNCTUATOR_NOT_STRICT_EQUAL:
231            return "!==";
232        case TokenType::KEYW_INSTANCEOF:
233            return "instanceof";
234        case TokenType::KEYW_IN:
235            return "in";
236        case TokenType::PUNCTUATOR_LOGICAL_AND:
237            return "&&";
238        case TokenType::PUNCTUATOR_LOGICAL_OR:
239            return "||";
240        case TokenType::PUNCTUATOR_SUBSTITUTION:
241            return "=";
242        case TokenType::PUNCTUATOR_QUESTION_MARK:
243            return "?";
244        case TokenType::PUNCTUATOR_AT:
245            return "@";
246        case TokenType::KEYW_ANY:
247            return "any";
248        case TokenType::KEYW_UNKNOWN:
249            return "unknown";
250        case TokenType::KEYW_NEVER:
251            return "never";
252        case TokenType::KEYW_NUMBER:
253            return "number";
254        case TokenType::KEYW_BIGINT:
255            return "bigint";
256        case TokenType::KEYW_BOOLEAN:
257            return "boolean";
258        case TokenType::KEYW_STRING:
259            return "string";
260        case TokenType::KEYW_VOID:
261            return "void";
262        case TokenType::KEYW_OBJECT:
263            return "object";
264        case TokenType::KEYW_TYPEOF:
265            return "typeof";
266        case TokenType::KEYW_DELETE:
267            return "delete";
268        case TokenType::KEYW_OUT:
269            return "out";
270
271        default:
272            UNREACHABLE();
273    }
274}
275
276}  // namespace panda::es2panda::lexer
277