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