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#include "token.h"
17
18namespace ark::es2panda::lexer {
19bool Token::IsAccessability() const
20{
21    return (type_ == TokenType::LITERAL_IDENT &&
22            (keywordType_ == TokenType::KEYW_PUBLIC || keywordType_ == TokenType::KEYW_PROTECTED ||
23             keywordType_ == TokenType::KEYW_PRIVATE || keywordType_ == TokenType::KEYW_INTERNAL) &&
24            ((flags_ & TokenFlags::HAS_ESCAPE) == 0));
25}
26
27bool Token::IsAsyncModifier() const
28{
29    return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_ASYNC &&
30            (flags_ & TokenFlags::HAS_ESCAPE) == 0);
31}
32
33bool Token::IsForInOf() const
34{
35    return (keywordType_ == TokenType::KEYW_IN || keywordType_ == TokenType::KEYW_OF);
36}
37
38bool Token::IsStaticModifier() const
39{
40    return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_STATIC &&
41            (flags_ & TokenFlags::HAS_ESCAPE) == 0);
42}
43
44bool Token::IsDeclareModifier() const
45{
46    return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_DECLARE &&
47            (flags_ & TokenFlags::HAS_ESCAPE) == 0);
48}
49
50bool Token::IsReadonlyModifier() const
51{
52    return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_READONLY &&
53            (flags_ & TokenFlags::HAS_ESCAPE) == 0);
54}
55
56bool Token::IsUpdate() const
57{
58    return (type_ == TokenType::PUNCTUATOR_MINUS_MINUS || type_ == TokenType::PUNCTUATOR_PLUS_PLUS);
59}
60
61bool Token::IsUnary() const
62{
63    return (type_ == TokenType::PUNCTUATOR_MINUS || type_ == TokenType::PUNCTUATOR_PLUS ||
64            type_ == TokenType::PUNCTUATOR_TILDE || type_ == TokenType::PUNCTUATOR_EXCLAMATION_MARK ||
65            type_ == TokenType::PUNCTUATOR_PLUS_PLUS || type_ == TokenType::PUNCTUATOR_MINUS_MINUS ||
66            type_ == TokenType::KEYW_TYPEOF || type_ == TokenType::KEYW_VOID || type_ == TokenType::KEYW_DELETE ||
67            type_ == TokenType::KEYW_AWAIT || type_ == TokenType::PUNCTUATOR_DOLLAR_DOLLAR);
68}
69
70bool Token::IsPropNameLiteral() const
71{
72    return (type_ == TokenType::LITERAL_STRING || type_ == TokenType::LITERAL_NUMBER ||
73            type_ == TokenType::LITERAL_TRUE || type_ == TokenType::LITERAL_FALSE);
74}
75
76bool Token::IsKeyword() const
77{
78    return (type_ >= TokenType::FIRST_KEYW);
79}
80
81bool Token::IsReservedTypeName() const
82{
83    switch (keywordType_) {
84        case TokenType::KEYW_ANY:
85        case TokenType::KEYW_UNKNOWN:
86        case TokenType::KEYW_NEVER:
87        case TokenType::KEYW_BOOLEAN:
88        case TokenType::KEYW_VOID:
89        case TokenType::KEYW_OBJECT:
90            return true;
91        default:
92            return false;
93    }
94}
95
96bool Token::IsDefinableTypeName() const
97{
98    switch (keywordType_) {
99        case TokenType::KEYW_BOOLEAN:
100        case TokenType::KEYW_DOUBLE:
101        case TokenType::KEYW_BYTE:
102        case TokenType::KEYW_FLOAT:
103        case TokenType::KEYW_SHORT:
104        case TokenType::KEYW_INT:
105        case TokenType::KEYW_CHAR:
106        case TokenType::KEYW_LONG:
107        case TokenType::KEYW_TYPE:
108        case TokenType::KEYW_UNDEFINED:
109        case TokenType::KEYW_VAR:
110        case TokenType::KEYW_IS:
111        case TokenType::KEYW_TYPEOF:
112        case TokenType::KEYW_YIELD:
113        case TokenType::KEYW_STRING:
114        case TokenType::KEYW_NUMBER:
115        case TokenType::KEYW_BIGINT:
116        case TokenType::KEYW_VOID:
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)
144{
145    return (type == TokenType::PUNCTUATOR_COLON || type == TokenType::PUNCTUATOR_QUESTION_MARK);
146}
147
148const char *TokenToString(TokenType type)  // NOLINT(readability-function-size)
149{
150    switch (type) {
151        case TokenType::PUNCTUATOR_BITWISE_AND:
152            return "&";
153        case TokenType::PUNCTUATOR_BITWISE_OR:
154            return "|";
155        case TokenType::PUNCTUATOR_MULTIPLY:
156            return "*";
157        case TokenType::PUNCTUATOR_DIVIDE:
158            return "/";
159        case TokenType::PUNCTUATOR_MINUS:
160            return "-";
161        case TokenType::PUNCTUATOR_EXCLAMATION_MARK:
162            return "!";
163        case TokenType::PUNCTUATOR_TILDE:
164            return "~";
165        case TokenType::PUNCTUATOR_MINUS_MINUS:
166            return "--";
167        case TokenType::PUNCTUATOR_LEFT_SHIFT:
168            return "<<";
169        case TokenType::PUNCTUATOR_RIGHT_SHIFT:
170            return ">>";
171        case TokenType::PUNCTUATOR_LESS_THAN_EQUAL:
172            return "<=";
173        case TokenType::PUNCTUATOR_GREATER_THAN_EQUAL:
174            return ">=";
175        case TokenType::PUNCTUATOR_MOD:
176            return "%";
177        case TokenType::PUNCTUATOR_BITWISE_XOR:
178            return "^";
179        case TokenType::PUNCTUATOR_EXPONENTIATION:
180            return "**";
181        case TokenType::PUNCTUATOR_MULTIPLY_EQUAL:
182            return "*=";
183        case TokenType::PUNCTUATOR_EXPONENTIATION_EQUAL:
184            return "**=";
185        case TokenType::PUNCTUATOR_ARROW:
186            return "=>";
187        case TokenType::PUNCTUATOR_BACK_TICK:
188            return "`";
189        case TokenType::PUNCTUATOR_HASH_MARK:
190            return "#";
191        case TokenType::PUNCTUATOR_DIVIDE_EQUAL:
192            return "/=";
193        case TokenType::PUNCTUATOR_MOD_EQUAL:
194            return "%=";
195        case TokenType::PUNCTUATOR_MINUS_EQUAL:
196            return "-=";
197        case TokenType::PUNCTUATOR_LEFT_SHIFT_EQUAL:
198            return "<<=";
199        case TokenType::PUNCTUATOR_RIGHT_SHIFT_EQUAL:
200            return ">>=";
201        case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT:
202            return ">>>";
203        case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT_EQUAL:
204            return ">>>=";
205        case TokenType::PUNCTUATOR_BITWISE_AND_EQUAL:
206            return "&=";
207        case TokenType::PUNCTUATOR_BITWISE_OR_EQUAL:
208            return "|=";
209        case TokenType::PUNCTUATOR_LOGICAL_AND_EQUAL:
210            return "&&=";
211        case TokenType::PUNCTUATOR_NULLISH_COALESCING:
212            return "??";
213        case TokenType::PUNCTUATOR_LOGICAL_OR_EQUAL:
214            return "||=";
215        case TokenType::PUNCTUATOR_LOGICAL_NULLISH_EQUAL:
216            return "\?\?=";
217        case TokenType::PUNCTUATOR_BITWISE_XOR_EQUAL:
218            return "^=";
219        case TokenType::PUNCTUATOR_PLUS:
220            return "+";
221        case TokenType::PUNCTUATOR_PLUS_PLUS:
222            return "++";
223        case TokenType::PUNCTUATOR_PLUS_EQUAL:
224            return "+=";
225        case TokenType::PUNCTUATOR_LESS_THAN:
226            return "<";
227        case TokenType::PUNCTUATOR_GREATER_THAN:
228            return ">";
229        case TokenType::PUNCTUATOR_EQUAL:
230            return "==";
231        case TokenType::PUNCTUATOR_NOT_EQUAL:
232            return "!=";
233        case TokenType::PUNCTUATOR_STRICT_EQUAL:
234            return "===";
235        case TokenType::PUNCTUATOR_NOT_STRICT_EQUAL:
236            return "!==";
237        case TokenType::KEYW_INSTANCEOF:
238            return "instanceof";
239        case TokenType::KEYW_IN:
240            return "in";
241        case TokenType::PUNCTUATOR_LOGICAL_AND:
242            return "&&";
243        case TokenType::PUNCTUATOR_LOGICAL_OR:
244            return "||";
245        case TokenType::PUNCTUATOR_SUBSTITUTION:
246            return "=";
247        case TokenType::PUNCTUATOR_QUESTION_MARK:
248            return "?";
249        case TokenType::PUNCTUATOR_QUESTION_DOT:
250            return "?.";
251        case TokenType::PUNCTUATOR_AT:
252            return "@";
253        case TokenType::PUNCTUATOR_FORMAT:
254            return "@@";
255        case TokenType::PUNCTUATOR_RIGHT_PARENTHESIS:
256            return ")";
257        case TokenType::PUNCTUATOR_LEFT_PARENTHESIS:
258            return "(";
259        case TokenType::PUNCTUATOR_RIGHT_SQUARE_BRACKET:
260            return "]";
261        case TokenType::PUNCTUATOR_LEFT_SQUARE_BRACKET:
262            return "[";
263        case TokenType::PUNCTUATOR_RIGHT_BRACE:
264            return "}";
265        case TokenType::PUNCTUATOR_PERIOD:
266            return ".";
267        case TokenType::PUNCTUATOR_PERIOD_PERIOD_PERIOD:
268            return "...";
269        case TokenType::PUNCTUATOR_PERIOD_QUESTION:
270            return ".?";
271        case TokenType::PUNCTUATOR_LEFT_BRACE:
272            return "{";
273        case TokenType::PUNCTUATOR_SEMI_COLON:
274            return ";";
275        case TokenType::PUNCTUATOR_COLON:
276            return ":";
277        case TokenType::PUNCTUATOR_COMMA:
278            return ",";
279        case TokenType::KEYW_GET:
280            return "get";
281        case TokenType::KEYW_SET:
282            return "set";
283        case TokenType::KEYW_OF:
284            return "of";
285        case TokenType::KEYW_FROM:
286            return "from";
287        case TokenType::KEYW_AS:
288            return "as";
289        case TokenType::KEYW_META:
290            return "meta";
291        case TokenType::KEYW_ASSERT:
292            return "assert";
293        case TokenType::KEYW_REQUIRE:
294            return "require";
295        case TokenType::KEYW_ABSTRACT:
296            return "abstract";
297        case TokenType::KEYW_ANY:
298            return "any";
299        case TokenType::KEYW_AWAIT:
300            return "await";
301        case TokenType::KEYW_BIGINT:
302            return "bigint";
303        case TokenType::KEYW_BOOLEAN:
304            return "boolean";
305        case TokenType::KEYW_BREAK:
306            return "break";
307        case TokenType::KEYW_BYTE:
308            return "byte";
309        case TokenType::KEYW_CASE:
310            return "case";
311        case TokenType::KEYW_CATCH:
312            return "catch";
313        case TokenType::KEYW_CHAR:
314            return "char";
315        case TokenType::KEYW_CONST:
316            return "const";
317        case TokenType::KEYW_CONSTRUCTOR:
318            return "constructor";
319        case TokenType::KEYW_CONTINUE:
320            return "continue";
321        case TokenType::KEYW_DEBUGGER:
322            return "debugger";
323        case TokenType::KEYW_DEFAULT:
324            return "default";
325        case TokenType::KEYW_DO:
326            return "do";
327        case TokenType::KEYW_ENUM:
328            return "enum";
329        case TokenType::KEYW_DOUBLE:
330            return "double";
331        case TokenType::KEYW_EXPORT:
332            return "export";
333        case TokenType::KEYW_FINALLY:
334            return "finally";
335        case TokenType::KEYW_FLOAT:
336            return "float";
337        case TokenType::KEYW_FOR:
338            return "for";
339        case TokenType::KEYW_FUNCTION:
340            return "function";
341        case TokenType::KEYW_IF:
342            return "if";
343        case TokenType::KEYW_INT:
344            return "int";
345        case TokenType::KEYW_IMPORT:
346            return "import";
347        case TokenType::KEYW_LAUNCH:
348            return "launch";
349        case TokenType::KEYW_LONG:
350            return "long";
351        case TokenType::KEYW_NEVER:
352            return "never";
353        case TokenType::KEYW_NEW:
354            return "new";
355        case TokenType::LITERAL_NULL:
356            return "null";
357        case TokenType::KEYW_NUMBER:
358            return "number";
359        case TokenType::KEYW_OBJECT:
360            return "object";
361        case TokenType::KEYW_REGEXP:
362            return "regexp";
363        case TokenType::KEYW_RETURN:
364            return "return";
365        case TokenType::KEYW_STRING:
366            return "string";
367        case TokenType::KEYW_SHORT:
368            return "short";
369        case TokenType::KEYW_SUPER:
370            return "super";
371        case TokenType::KEYW_SWITCH:
372            return "switch";
373        case TokenType::KEYW_TRAP:
374            return "trap";
375        case TokenType::KEYW_THIS:
376            return "this";
377        case TokenType::KEYW_THROW:
378            return "throw";
379        case TokenType::KEYW_TYPE:
380            return "type";
381        case TokenType::KEYW_TRY:
382            return "try";
383        case TokenType::KEYW_TYPEOF:
384            return "typeof";
385        case TokenType::KEYW_UNDEFINED:
386            return "undefined";
387        case TokenType::KEYW_UNKNOWN:
388            return "unknown";
389        case TokenType::KEYW_VAR:
390            return "var";
391        case TokenType::KEYW_VOID:
392            return "void";
393        case TokenType::KEYW_WHILE:
394            return "while";
395        case TokenType::KEYW_WITH:
396            return "with";
397        case TokenType::KEYW_ASYNC:
398            return "async";
399        case TokenType::KEYW_READONLY:
400            return "readonly";
401        case TokenType::KEYW_KEYOF:
402            return "keyof";
403        case TokenType::KEYW_MODULE:
404            return "module";
405        case TokenType::KEYW_NAMESPACE:
406            return "namespace";
407        case TokenType::KEYW_INFER:
408            return "infer";
409        case TokenType::KEYW_DECLARE:
410            return "declare";
411        case TokenType::KEYW_ARGUMENTS:
412            return "arguments";
413        case TokenType::KEYW_EVAL:
414            return "eval";
415        case TokenType::KEYW_STATIC:
416            return "static";
417        case TokenType::KEYW_GLOBAL:
418            return "global";
419        case TokenType::KEYW_IS:
420            return "is";
421        case TokenType::KEYW_ASSERTS:
422            return "asserts";
423        case TokenType::KEYW_PRIVATE:
424            return "private";
425        case TokenType::KEYW_PROTECTED:
426            return "protected";
427        case TokenType::KEYW_PUBLIC:
428            return "public";
429        case TokenType::KEYW_INTERNAL:
430            return "internal";
431        case TokenType::KEYW_IMPLEMENTS:
432            return "implements";
433        case TokenType::KEYW_INTERFACE:
434            return "interface";
435        case TokenType::KEYW_PACKAGE:
436            return "package";
437        case TokenType::KEYW_LET:
438            return "let";
439        case TokenType::KEYW_YIELD:
440            return "yield";
441        case TokenType::KEYW_DELETE:
442            return "delete";
443        case TokenType::KEYW_ELSE:
444            return "else";
445        case TokenType::EOS:
446            return "eos";
447        case TokenType::KEYW_OUT:
448            return "out";
449        case TokenType::PUNCTUATOR_DOLLAR_DOLLAR:
450            return "$$";
451        case TokenType::KEYW_OVERRIDE:
452            return "override";
453        case TokenType::LITERAL_IDENT:
454            return "identification literal";
455        case TokenType::LITERAL_NUMBER:
456            return "number literal";
457        case TokenType::LITERAL_STRING:
458            return "string literal";
459        default:
460            return "";
461    }
462}
463}  // namespace ark::es2panda::lexer
464