• 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 #include "letters.h"
19 
20 namespace panda::es2panda::lexer {
21 
IsAccessability() const22 bool Token::IsAccessability() const
23 {
24     return (type_ == TokenType::LITERAL_IDENT &&
25             (keywordType_ == TokenType::KEYW_PUBLIC || keywordType_ == TokenType::KEYW_PROTECTED ||
26              keywordType_ == TokenType::KEYW_PRIVATE) &&
27             !(flags_ & TokenFlags::HAS_ESCAPE));
28 }
29 
IsAsyncModifier() const30 bool Token::IsAsyncModifier() const
31 {
32     return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_ASYNC &&
33             !(flags_ & TokenFlags::HAS_ESCAPE));
34 }
35 
IsStaticModifier() const36 bool Token::IsStaticModifier() const
37 {
38     return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_STATIC &&
39             !(flags_ & TokenFlags::HAS_ESCAPE));
40 }
41 
IsDeclareModifier() const42 bool Token::IsDeclareModifier() const
43 {
44     return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_DECLARE &&
45             !(flags_ & TokenFlags::HAS_ESCAPE));
46 }
47 
IsReadonlyModifier() const48 bool Token::IsReadonlyModifier() const
49 {
50     return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_READONLY &&
51             !(flags_ & TokenFlags::HAS_ESCAPE));
52 }
53 
IsAccessorModifier() const54 bool Token::IsAccessorModifier() const
55 {
56     return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_ACCESSOR &&
57             !(flags_ & TokenFlags::HAS_ESCAPE));
58 }
59 
IsUpdate() const60 bool Token::IsUpdate() const
61 {
62     return (type_ == TokenType::PUNCTUATOR_MINUS_MINUS || type_ == TokenType::PUNCTUATOR_PLUS_PLUS);
63 }
64 
IsUnary() const65 bool Token::IsUnary() const
66 {
67     return (type_ == TokenType::PUNCTUATOR_MINUS || type_ == TokenType::PUNCTUATOR_PLUS ||
68             type_ == TokenType::PUNCTUATOR_TILDE || type_ == TokenType::PUNCTUATOR_EXCLAMATION_MARK ||
69             type_ == TokenType::PUNCTUATOR_PLUS_PLUS || type_ == TokenType::PUNCTUATOR_MINUS_MINUS ||
70             type_ == TokenType::KEYW_TYPEOF || type_ == TokenType::KEYW_VOID || type_ == TokenType::KEYW_DELETE ||
71             type_ == TokenType::KEYW_AWAIT);
72 }
73 
IsPropNameLiteral() const74 bool Token::IsPropNameLiteral() const
75 {
76     return (type_ == TokenType::LITERAL_STRING || type_ == TokenType::LITERAL_NUMBER ||
77             type_ == TokenType::LITERAL_TRUE || type_ == TokenType::LITERAL_FALSE);
78 }
79 
IsBooleanOrNullLiteral() const80 bool Token::IsBooleanOrNullLiteral() const
81 {
82     return (type_ == TokenType::LITERAL_NULL || type_ == TokenType::LITERAL_TRUE || type_ == TokenType::LITERAL_FALSE);
83 }
84 
IsKeyword() const85 bool Token::IsKeyword() const
86 {
87     return (type_ >= TokenType::FIRST_KEYW || type_ == TokenType::KEYW_IN || type_ == TokenType::KEYW_INSTANCEOF);
88 }
89 
IsReservedTypeName() const90 bool Token::IsReservedTypeName() const
91 {
92     switch (keywordType_) {
93         case TokenType::KEYW_ANY:
94         case TokenType::KEYW_UNKNOWN:
95         case TokenType::KEYW_NEVER:
96         case TokenType::KEYW_NUMBER:
97         case TokenType::KEYW_BIGINT:
98         case TokenType::KEYW_BOOLEAN:
99         case TokenType::KEYW_STRING:
100         case TokenType::KEYW_VOID:
101         case TokenType::KEYW_OBJECT:
102             return true;
103         default:
104             return false;
105     }
106 }
107 
IsJsStrictReservedWord() const108 bool Token::IsJsStrictReservedWord() const
109 {
110     switch (keywordType_) {
111         case TokenType::KEYW_ARGUMENTS:
112         case TokenType::KEYW_EVAL:
113         case TokenType::KEYW_STATIC:
114         case TokenType::KEYW_PRIVATE:
115         case TokenType::KEYW_PROTECTED:
116         case TokenType::KEYW_PUBLIC:
117         case TokenType::KEYW_IMPLEMENTS:
118         case TokenType::KEYW_INTERFACE:
119         case TokenType::KEYW_PACKAGE:
120         case TokenType::KEYW_LET:
121         case TokenType::KEYW_YIELD:
122             return true;
123         default:
124             return false;
125     }
126 }
127 
IsBinaryToken(TokenType type)128 bool Token::IsBinaryToken(TokenType type)
129 {
130     return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_EXPONENTIATION);
131 }
132 
IsBinaryLvalueToken(TokenType type)133 bool Token::IsBinaryLvalueToken(TokenType type)
134 {
135     return (type >= TokenType::PUNCTUATOR_SUBSTITUTION && type <= TokenType::PUNCTUATOR_EXPONENTIATION_EQUAL);
136 }
137 
IsUpdateToken(TokenType type)138 bool Token::IsUpdateToken(TokenType type)
139 {
140     return (type == TokenType::PUNCTUATOR_MINUS_MINUS || type == TokenType::PUNCTUATOR_PLUS_PLUS);
141 }
142 
IsPunctuatorToken(TokenType type)143 bool Token::IsPunctuatorToken(TokenType type)
144 {
145     return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_ARROW);
146 }
147 
IsTsParamToken(TokenType type,char32_t nextChar)148 bool Token::IsTsParamToken(TokenType type, char32_t nextChar)
149 {
150     return (type == TokenType::PUNCTUATOR_COLON || (type == TokenType::PUNCTUATOR_QUESTION_MARK &&
151         (nextChar == LEX_CHAR_COMMA || nextChar == LEX_CHAR_COLON || nextChar == LEX_CHAR_RIGHT_PAREN)));
152 }
153 
TokenToString(TokenType type)154 const char *TokenToString(TokenType type)
155 {
156     switch (type) {
157         case TokenType::PUNCTUATOR_BITWISE_AND:
158             return "&";
159         case TokenType::PUNCTUATOR_BITWISE_OR:
160             return "|";
161         case TokenType::PUNCTUATOR_MULTIPLY:
162             return "*";
163         case TokenType::PUNCTUATOR_DIVIDE:
164             return "/";
165         case TokenType::PUNCTUATOR_MINUS:
166             return "-";
167         case TokenType::PUNCTUATOR_EXCLAMATION_MARK:
168             return "!";
169         case TokenType::PUNCTUATOR_TILDE:
170             return "~";
171         case TokenType::PUNCTUATOR_MINUS_MINUS:
172             return "--";
173         case TokenType::PUNCTUATOR_LEFT_SHIFT:
174             return "<<";
175         case TokenType::PUNCTUATOR_RIGHT_SHIFT:
176             return ">>";
177         case TokenType::PUNCTUATOR_LESS_THAN_EQUAL:
178             return "<=";
179         case TokenType::PUNCTUATOR_GREATER_THAN_EQUAL:
180             return ">=";
181         case TokenType::PUNCTUATOR_MOD:
182             return "%";
183         case TokenType::PUNCTUATOR_BITWISE_XOR:
184             return "^";
185         case TokenType::PUNCTUATOR_EXPONENTIATION:
186             return "**";
187         case TokenType::PUNCTUATOR_MULTIPLY_EQUAL:
188             return "*=";
189         case TokenType::PUNCTUATOR_EXPONENTIATION_EQUAL:
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_AT:
250             return "@";
251         case TokenType::KEYW_ANY:
252             return "any";
253         case TokenType::KEYW_UNKNOWN:
254             return "unknown";
255         case TokenType::KEYW_NEVER:
256             return "never";
257         case TokenType::KEYW_NUMBER:
258             return "number";
259         case TokenType::KEYW_BIGINT:
260             return "bigint";
261         case TokenType::KEYW_BOOLEAN:
262             return "boolean";
263         case TokenType::KEYW_STRING:
264             return "string";
265         case TokenType::KEYW_VOID:
266             return "void";
267         case TokenType::KEYW_OBJECT:
268             return "object";
269         case TokenType::KEYW_TYPEOF:
270             return "typeof";
271         case TokenType::KEYW_DELETE:
272             return "delete";
273         case TokenType::KEYW_OUT:
274             return "out";
275 
276         default:
277             UNREACHABLE();
278     }
279 }
280 
281 }  // namespace panda::es2panda::lexer
282