• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
18 namespace ark::es2panda::lexer {
IsAccessability() const19 bool 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 
IsAsyncModifier() const27 bool Token::IsAsyncModifier() const
28 {
29     return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_ASYNC &&
30             (flags_ & TokenFlags::HAS_ESCAPE) == 0);
31 }
32 
IsForInOf() const33 bool Token::IsForInOf() const
34 {
35     return (keywordType_ == TokenType::KEYW_IN || keywordType_ == TokenType::KEYW_OF);
36 }
37 
IsStaticModifier() const38 bool Token::IsStaticModifier() const
39 {
40     return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_STATIC &&
41             (flags_ & TokenFlags::HAS_ESCAPE) == 0);
42 }
43 
IsDeclareModifier() const44 bool Token::IsDeclareModifier() const
45 {
46     return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_DECLARE &&
47             (flags_ & TokenFlags::HAS_ESCAPE) == 0);
48 }
49 
IsReadonlyModifier() const50 bool Token::IsReadonlyModifier() const
51 {
52     return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_READONLY &&
53             (flags_ & TokenFlags::HAS_ESCAPE) == 0);
54 }
55 
IsUpdate() const56 bool Token::IsUpdate() const
57 {
58     return (type_ == TokenType::PUNCTUATOR_MINUS_MINUS || type_ == TokenType::PUNCTUATOR_PLUS_PLUS);
59 }
60 
IsUnary() const61 bool 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 
IsPropNameLiteral() const70 bool 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 
IsKeyword() const76 bool Token::IsKeyword() const
77 {
78     return (type_ >= TokenType::FIRST_KEYW);
79 }
80 
IsReservedTypeName() const81 bool 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 
IsDefinableTypeName() const96 bool 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 
IsBinaryToken(TokenType type)123 bool Token::IsBinaryToken(TokenType type)
124 {
125     return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_EXPONENTIATION);
126 }
127 
IsBinaryLvalueToken(TokenType type)128 bool Token::IsBinaryLvalueToken(TokenType type)
129 {
130     return (type >= TokenType::PUNCTUATOR_SUBSTITUTION && type <= TokenType::PUNCTUATOR_EXPONENTIATION_EQUAL);
131 }
132 
IsUpdateToken(TokenType type)133 bool Token::IsUpdateToken(TokenType type)
134 {
135     return (type == TokenType::PUNCTUATOR_MINUS_MINUS || type == TokenType::PUNCTUATOR_PLUS_PLUS);
136 }
137 
IsPunctuatorToken(TokenType type)138 bool Token::IsPunctuatorToken(TokenType type)
139 {
140     return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_ARROW);
141 }
142 
IsTsParamToken(TokenType type)143 bool Token::IsTsParamToken(TokenType type)
144 {
145     return (type == TokenType::PUNCTUATOR_COLON || type == TokenType::PUNCTUATOR_QUESTION_MARK);
146 }
147 
TokenToString(TokenType type)148 const 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         default:
454             return "";
455     }
456 }
457 }  // namespace ark::es2panda::lexer
458