• 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 
IsKeyword() const80 bool Token::IsKeyword() const
81 {
82     return (type_ >= TokenType::FIRST_KEYW || type_ == TokenType::KEYW_IN || type_ == TokenType::KEYW_INSTANCEOF);
83 }
84 
IsReservedTypeName() const85 bool Token::IsReservedTypeName() const
86 {
87     switch (keywordType_) {
88         case TokenType::KEYW_ANY:
89         case TokenType::KEYW_UNKNOWN:
90         case TokenType::KEYW_NEVER:
91         case TokenType::KEYW_NUMBER:
92         case TokenType::KEYW_BIGINT:
93         case TokenType::KEYW_BOOLEAN:
94         case TokenType::KEYW_STRING:
95         case TokenType::KEYW_VOID:
96         case TokenType::KEYW_OBJECT:
97             return true;
98         default:
99             return false;
100     }
101 }
102 
IsJsStrictReservedWord() const103 bool Token::IsJsStrictReservedWord() const
104 {
105     switch (keywordType_) {
106         case TokenType::KEYW_ARGUMENTS:
107         case TokenType::KEYW_EVAL:
108         case TokenType::KEYW_STATIC:
109         case TokenType::KEYW_PRIVATE:
110         case TokenType::KEYW_PROTECTED:
111         case TokenType::KEYW_PUBLIC:
112         case TokenType::KEYW_IMPLEMENTS:
113         case TokenType::KEYW_INTERFACE:
114         case TokenType::KEYW_PACKAGE:
115         case TokenType::KEYW_LET:
116         case TokenType::KEYW_YIELD:
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,char32_t nextChar)143 bool Token::IsTsParamToken(TokenType type, char32_t nextChar)
144 {
145     return (type == TokenType::PUNCTUATOR_COLON || (type == TokenType::PUNCTUATOR_QUESTION_MARK &&
146         (nextChar == LEX_CHAR_COMMA || nextChar == LEX_CHAR_COLON || nextChar == LEX_CHAR_RIGHT_PAREN)));
147 }
148 
TokenToString(TokenType type)149 const char *TokenToString(TokenType type)
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_DIVIDE_EQUAL:
187             return "/=";
188         case TokenType::PUNCTUATOR_MOD_EQUAL:
189             return "%=";
190         case TokenType::PUNCTUATOR_MINUS_EQUAL:
191             return "-=";
192         case TokenType::PUNCTUATOR_LEFT_SHIFT_EQUAL:
193             return "<<=";
194         case TokenType::PUNCTUATOR_RIGHT_SHIFT_EQUAL:
195             return ">>=";
196         case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT:
197             return ">>>";
198         case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT_EQUAL:
199             return ">>>=";
200         case TokenType::PUNCTUATOR_BITWISE_AND_EQUAL:
201             return "&=";
202         case TokenType::PUNCTUATOR_BITWISE_OR_EQUAL:
203             return "|=";
204         case TokenType::PUNCTUATOR_LOGICAL_AND_EQUAL:
205             return "&&=";
206         case TokenType::PUNCTUATOR_NULLISH_COALESCING:
207             return "??";
208         case TokenType::PUNCTUATOR_LOGICAL_OR_EQUAL:
209             return "||=";
210         case TokenType::PUNCTUATOR_LOGICAL_NULLISH_EQUAL:
211             return "\?\?=";
212         case TokenType::PUNCTUATOR_BITWISE_XOR_EQUAL:
213             return "^=";
214         case TokenType::PUNCTUATOR_PLUS:
215             return "+";
216         case TokenType::PUNCTUATOR_PLUS_PLUS:
217             return "++";
218         case TokenType::PUNCTUATOR_PLUS_EQUAL:
219             return "+=";
220         case TokenType::PUNCTUATOR_LESS_THAN:
221             return "<";
222         case TokenType::PUNCTUATOR_GREATER_THAN:
223             return ">";
224         case TokenType::PUNCTUATOR_EQUAL:
225             return "==";
226         case TokenType::PUNCTUATOR_NOT_EQUAL:
227             return "!=";
228         case TokenType::PUNCTUATOR_STRICT_EQUAL:
229             return "===";
230         case TokenType::PUNCTUATOR_NOT_STRICT_EQUAL:
231             return "!==";
232         case TokenType::KEYW_INSTANCEOF:
233             return "instanceof";
234         case TokenType::KEYW_IN:
235             return "in";
236         case TokenType::PUNCTUATOR_LOGICAL_AND:
237             return "&&";
238         case TokenType::PUNCTUATOR_LOGICAL_OR:
239             return "||";
240         case TokenType::PUNCTUATOR_SUBSTITUTION:
241             return "=";
242         case TokenType::PUNCTUATOR_QUESTION_MARK:
243             return "?";
244         case TokenType::PUNCTUATOR_AT:
245             return "@";
246         case TokenType::KEYW_ANY:
247             return "any";
248         case TokenType::KEYW_UNKNOWN:
249             return "unknown";
250         case TokenType::KEYW_NEVER:
251             return "never";
252         case TokenType::KEYW_NUMBER:
253             return "number";
254         case TokenType::KEYW_BIGINT:
255             return "bigint";
256         case TokenType::KEYW_BOOLEAN:
257             return "boolean";
258         case TokenType::KEYW_STRING:
259             return "string";
260         case TokenType::KEYW_VOID:
261             return "void";
262         case TokenType::KEYW_OBJECT:
263             return "object";
264         case TokenType::KEYW_TYPEOF:
265             return "typeof";
266         case TokenType::KEYW_DELETE:
267             return "delete";
268         case TokenType::KEYW_OUT:
269             return "out";
270 
271         default:
272             UNREACHABLE();
273     }
274 }
275 
276 }  // namespace panda::es2panda::lexer
277