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