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() const19bool 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() const27bool Token::IsAsyncModifier() const 28 { 29 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_ASYNC && 30 (flags_ & TokenFlags::HAS_ESCAPE) == 0); 31 } 32 IsForInOf() const33bool Token::IsForInOf() const 34 { 35 return (keywordType_ == TokenType::KEYW_IN || keywordType_ == TokenType::KEYW_OF); 36 } 37 IsStaticModifier() const38bool Token::IsStaticModifier() const 39 { 40 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_STATIC && 41 (flags_ & TokenFlags::HAS_ESCAPE) == 0); 42 } 43 IsDeclareModifier() const44bool Token::IsDeclareModifier() const 45 { 46 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_DECLARE && 47 (flags_ & TokenFlags::HAS_ESCAPE) == 0); 48 } 49 IsReadonlyModifier() const50bool Token::IsReadonlyModifier() const 51 { 52 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_READONLY && 53 (flags_ & TokenFlags::HAS_ESCAPE) == 0); 54 } 55 IsUpdate() const56bool Token::IsUpdate() const 57 { 58 return (type_ == TokenType::PUNCTUATOR_MINUS_MINUS || type_ == TokenType::PUNCTUATOR_PLUS_PLUS); 59 } 60 IsUnary() const61bool 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() const70bool 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() const76bool Token::IsKeyword() const 77 { 78 return (type_ >= TokenType::FIRST_KEYW); 79 } 80 IsReservedTypeName() const81bool 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() const99bool 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)116bool Token::IsBinaryToken(TokenType type) 117 { 118 return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_EXPONENTIATION); 119 } 120 IsBinaryLvalueToken(TokenType type)121bool Token::IsBinaryLvalueToken(TokenType type) 122 { 123 return (type >= TokenType::PUNCTUATOR_SUBSTITUTION && type <= TokenType::PUNCTUATOR_EXPONENTIATION_EQUAL); 124 } 125 IsUpdateToken(TokenType type)126bool Token::IsUpdateToken(TokenType type) 127 { 128 return (type == TokenType::PUNCTUATOR_MINUS_MINUS || type == TokenType::PUNCTUATOR_PLUS_PLUS); 129 } 130 IsPunctuatorToken(TokenType type)131bool Token::IsPunctuatorToken(TokenType type) 132 { 133 return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_ARROW); 134 } 135 IsTsParamToken(TokenType type)136bool Token::IsTsParamToken(TokenType type) 137 { 138 return (type == TokenType::PUNCTUATOR_COLON || type == TokenType::PUNCTUATOR_QUESTION_MARK); 139 } 140 TokenToString(TokenType type)141const 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