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