• 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 
148 // CC-OFFNXT(huge_method,huge_cyclomatic_complexity,G.FUN.01-CPP) big switch-case, solid logic
TokenToString(TokenType type)149 const char *TokenToString(TokenType type)  // NOLINT(readability-function-size)
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_ARROW:
187             return "=>";
188         case TokenType::PUNCTUATOR_BACK_TICK:
189             return "`";
190         case TokenType::PUNCTUATOR_HASH_MARK:
191             return "#";
192         case TokenType::PUNCTUATOR_DIVIDE_EQUAL:
193             return "/=";
194         case TokenType::PUNCTUATOR_MOD_EQUAL:
195             return "%=";
196         case TokenType::PUNCTUATOR_MINUS_EQUAL:
197             return "-=";
198         case TokenType::PUNCTUATOR_LEFT_SHIFT_EQUAL:
199             return "<<=";
200         case TokenType::PUNCTUATOR_RIGHT_SHIFT_EQUAL:
201             return ">>=";
202         case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT:
203             return ">>>";
204         case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT_EQUAL:
205             return ">>>=";
206         case TokenType::PUNCTUATOR_BITWISE_AND_EQUAL:
207             return "&=";
208         case TokenType::PUNCTUATOR_BITWISE_OR_EQUAL:
209             return "|=";
210         case TokenType::PUNCTUATOR_LOGICAL_AND_EQUAL:
211             return "&&=";
212         case TokenType::PUNCTUATOR_NULLISH_COALESCING:
213             return "??";
214         case TokenType::PUNCTUATOR_LOGICAL_OR_EQUAL:
215             return "||=";
216         case TokenType::PUNCTUATOR_LOGICAL_NULLISH_EQUAL:
217             return "\?\?=";
218         case TokenType::PUNCTUATOR_BITWISE_XOR_EQUAL:
219             return "^=";
220         case TokenType::PUNCTUATOR_PLUS:
221             return "+";
222         case TokenType::PUNCTUATOR_PLUS_PLUS:
223             return "++";
224         case TokenType::PUNCTUATOR_PLUS_EQUAL:
225             return "+=";
226         case TokenType::PUNCTUATOR_LESS_THAN:
227             return "<";
228         case TokenType::PUNCTUATOR_GREATER_THAN:
229             return ">";
230         case TokenType::PUNCTUATOR_EQUAL:
231             return "==";
232         case TokenType::PUNCTUATOR_NOT_EQUAL:
233             return "!=";
234         case TokenType::PUNCTUATOR_STRICT_EQUAL:
235             return "===";
236         case TokenType::PUNCTUATOR_NOT_STRICT_EQUAL:
237             return "!==";
238         case TokenType::KEYW_INSTANCEOF:
239             return "instanceof";
240         case TokenType::KEYW_IN:
241             return "in";
242         case TokenType::PUNCTUATOR_LOGICAL_AND:
243             return "&&";
244         case TokenType::PUNCTUATOR_LOGICAL_OR:
245             return "||";
246         case TokenType::PUNCTUATOR_SUBSTITUTION:
247             return "=";
248         case TokenType::PUNCTUATOR_QUESTION_MARK:
249             return "?";
250         case TokenType::PUNCTUATOR_QUESTION_DOT:
251             return "?.";
252         case TokenType::PUNCTUATOR_AT:
253             return "@";
254         case TokenType::PUNCTUATOR_FORMAT:
255             return "@@";
256         case TokenType::PUNCTUATOR_RIGHT_PARENTHESIS:
257             return ")";
258         case TokenType::PUNCTUATOR_LEFT_PARENTHESIS:
259             return "(";
260         case TokenType::PUNCTUATOR_RIGHT_SQUARE_BRACKET:
261             return "]";
262         case TokenType::PUNCTUATOR_LEFT_SQUARE_BRACKET:
263             return "[";
264         case TokenType::PUNCTUATOR_RIGHT_BRACE:
265             return "}";
266         case TokenType::PUNCTUATOR_PERIOD:
267             return ".";
268         case TokenType::PUNCTUATOR_PERIOD_PERIOD_PERIOD:
269             return "...";
270         case TokenType::PUNCTUATOR_PERIOD_QUESTION:
271             return ".?";
272         case TokenType::PUNCTUATOR_LEFT_BRACE:
273             return "{";
274         case TokenType::PUNCTUATOR_SEMI_COLON:
275             return ";";
276         case TokenType::PUNCTUATOR_COLON:
277             return ":";
278         case TokenType::PUNCTUATOR_COMMA:
279             return ",";
280         case TokenType::KEYW_GET:
281             return "get";
282         case TokenType::KEYW_SET:
283             return "set";
284         case TokenType::KEYW_OF:
285             return "of";
286         case TokenType::KEYW_FROM:
287             return "from";
288         case TokenType::KEYW_AS:
289             return "as";
290         case TokenType::KEYW_META:
291             return "meta";
292         case TokenType::KEYW_ASSERT:
293             return "assert";
294         case TokenType::KEYW_REQUIRE:
295             return "require";
296         case TokenType::KEYW_ABSTRACT:
297             return "abstract";
298         case TokenType::KEYW_ANY:
299             return "any";
300         case TokenType::KEYW_AWAIT:
301             return "await";
302         case TokenType::KEYW_BIGINT:
303             return "bigint";
304         case TokenType::KEYW_BOOLEAN:
305             return "boolean";
306         case TokenType::KEYW_BREAK:
307             return "break";
308         case TokenType::KEYW_BYTE:
309             return "byte";
310         case TokenType::KEYW_CASE:
311             return "case";
312         case TokenType::KEYW_CATCH:
313             return "catch";
314         case TokenType::KEYW_CHAR:
315             return "char";
316         case TokenType::KEYW_CONST:
317             return "const";
318         case TokenType::KEYW_CONSTRUCTOR:
319             return "constructor";
320         case TokenType::KEYW_CONTINUE:
321             return "continue";
322         case TokenType::KEYW_DEBUGGER:
323             return "debugger";
324         case TokenType::KEYW_DEFAULT:
325             return "default";
326         case TokenType::KEYW_DO:
327             return "do";
328         case TokenType::KEYW_ENUM:
329             return "enum";
330         case TokenType::KEYW_DOUBLE:
331             return "double";
332         case TokenType::KEYW_EXPORT:
333             return "export";
334         case TokenType::KEYW_FINALLY:
335             return "finally";
336         case TokenType::KEYW_FLOAT:
337             return "float";
338         case TokenType::KEYW_FOR:
339             return "for";
340         case TokenType::KEYW_FUNCTION:
341             return "function";
342         case TokenType::KEYW_IF:
343             return "if";
344         case TokenType::KEYW_INT:
345             return "int";
346         case TokenType::KEYW_IMPORT:
347             return "import";
348         case TokenType::KEYW_LAUNCH:
349             return "launch";
350         case TokenType::KEYW_LONG:
351             return "long";
352         case TokenType::KEYW_NEVER:
353             return "never";
354         case TokenType::KEYW_NEW:
355             return "new";
356         case TokenType::LITERAL_NULL:
357             return "null";
358         case TokenType::KEYW_NUMBER:
359             return "number";
360         case TokenType::KEYW_OBJECT:
361             return "object";
362         case TokenType::KEYW_REGEXP:
363             return "regexp";
364         case TokenType::KEYW_RETURN:
365             return "return";
366         case TokenType::KEYW_STRING:
367             return "string";
368         case TokenType::KEYW_SHORT:
369             return "short";
370         case TokenType::KEYW_SUPER:
371             return "super";
372         case TokenType::KEYW_SWITCH:
373             return "switch";
374         case TokenType::KEYW_TRAP:
375             return "trap";
376         case TokenType::KEYW_THIS:
377             return "this";
378         case TokenType::KEYW_THROW:
379             return "throw";
380         case TokenType::KEYW_TYPE:
381             return "type";
382         case TokenType::KEYW_TRY:
383             return "try";
384         case TokenType::KEYW_TYPEOF:
385             return "typeof";
386         case TokenType::KEYW_UNDEFINED:
387             return "undefined";
388         case TokenType::KEYW_UNKNOWN:
389             return "unknown";
390         case TokenType::KEYW_VAR:
391             return "var";
392         case TokenType::KEYW_VOID:
393             return "void";
394         case TokenType::KEYW_WHILE:
395             return "while";
396         case TokenType::KEYW_WITH:
397             return "with";
398         case TokenType::KEYW_ASYNC:
399             return "async";
400         case TokenType::KEYW_READONLY:
401             return "readonly";
402         case TokenType::KEYW_KEYOF:
403             return "keyof";
404         case TokenType::KEYW_MODULE:
405             return "module";
406         case TokenType::KEYW_NAMESPACE:
407             return "namespace";
408         case TokenType::KEYW_INFER:
409             return "infer";
410         case TokenType::KEYW_DECLARE:
411             return "declare";
412         case TokenType::KEYW_ARGUMENTS:
413             return "arguments";
414         case TokenType::KEYW_EVAL:
415             return "eval";
416         case TokenType::KEYW_STATIC:
417             return "static";
418         case TokenType::KEYW_GLOBAL:
419             return "global";
420         case TokenType::KEYW_IS:
421             return "is";
422         case TokenType::KEYW_ASSERTS:
423             return "asserts";
424         case TokenType::KEYW_PRIVATE:
425             return "private";
426         case TokenType::KEYW_PROTECTED:
427             return "protected";
428         case TokenType::KEYW_PUBLIC:
429             return "public";
430         case TokenType::KEYW_INTERNAL:
431             return "internal";
432         case TokenType::KEYW_IMPLEMENTS:
433             return "implements";
434         case TokenType::KEYW_INTERFACE:
435             return "interface";
436         case TokenType::KEYW_PACKAGE:
437             return "package";
438         case TokenType::KEYW_LET:
439             return "let";
440         case TokenType::KEYW_YIELD:
441             return "yield";
442         case TokenType::KEYW_DELETE:
443             return "delete";
444         case TokenType::KEYW_ELSE:
445             return "else";
446         case TokenType::EOS:
447             return "eos";
448         case TokenType::KEYW_OUT:
449             return "out";
450         case TokenType::PUNCTUATOR_DOLLAR_DOLLAR:
451             return "$$";
452         case TokenType::KEYW_OVERRIDE:
453             return "override";
454         case TokenType::KEYW_NATIVE:
455             return "native";
456         case TokenType::LITERAL_IDENT:
457             return "identification literal";
458         case TokenType::LITERAL_NUMBER:
459             return "number literal";
460         case TokenType::LITERAL_STRING:
461             return "string literal";
462         default:
463             return "";
464     }
465 }
466 }  // namespace ark::es2panda::lexer
467