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 148 // CC-OFFNXT(huge_method,huge_cyclomatic_complexity,G.FUN.01-CPP) big switch-case, solid logic TokenToString(TokenType type)149const char *TokenToString(TokenType type) // NOLINT(readability-function-size) 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_ARROW: 187 return "=>"; 188 case TokenType::PUNCTUATOR_BACK_TICK: 189 return "`"; 190 case TokenType::PUNCTUATOR_HASH_MARK: 191 return "#"; 192 case TokenType::PUNCTUATOR_DIVIDE_EQUAL: 193 return "/="; 194 case TokenType::PUNCTUATOR_MOD_EQUAL: 195 return "%="; 196 case TokenType::PUNCTUATOR_MINUS_EQUAL: 197 return "-="; 198 case TokenType::PUNCTUATOR_LEFT_SHIFT_EQUAL: 199 return "<<="; 200 case TokenType::PUNCTUATOR_RIGHT_SHIFT_EQUAL: 201 return ">>="; 202 case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT: 203 return ">>>"; 204 case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT_EQUAL: 205 return ">>>="; 206 case TokenType::PUNCTUATOR_BITWISE_AND_EQUAL: 207 return "&="; 208 case TokenType::PUNCTUATOR_BITWISE_OR_EQUAL: 209 return "|="; 210 case TokenType::PUNCTUATOR_LOGICAL_AND_EQUAL: 211 return "&&="; 212 case TokenType::PUNCTUATOR_NULLISH_COALESCING: 213 return "??"; 214 case TokenType::PUNCTUATOR_LOGICAL_OR_EQUAL: 215 return "||="; 216 case TokenType::PUNCTUATOR_LOGICAL_NULLISH_EQUAL: 217 return "\?\?="; 218 case TokenType::PUNCTUATOR_BITWISE_XOR_EQUAL: 219 return "^="; 220 case TokenType::PUNCTUATOR_PLUS: 221 return "+"; 222 case TokenType::PUNCTUATOR_PLUS_PLUS: 223 return "++"; 224 case TokenType::PUNCTUATOR_PLUS_EQUAL: 225 return "+="; 226 case TokenType::PUNCTUATOR_LESS_THAN: 227 return "<"; 228 case TokenType::PUNCTUATOR_GREATER_THAN: 229 return ">"; 230 case TokenType::PUNCTUATOR_EQUAL: 231 return "=="; 232 case TokenType::PUNCTUATOR_NOT_EQUAL: 233 return "!="; 234 case TokenType::PUNCTUATOR_STRICT_EQUAL: 235 return "==="; 236 case TokenType::PUNCTUATOR_NOT_STRICT_EQUAL: 237 return "!=="; 238 case TokenType::KEYW_INSTANCEOF: 239 return "instanceof"; 240 case TokenType::KEYW_IN: 241 return "in"; 242 case TokenType::PUNCTUATOR_LOGICAL_AND: 243 return "&&"; 244 case TokenType::PUNCTUATOR_LOGICAL_OR: 245 return "||"; 246 case TokenType::PUNCTUATOR_SUBSTITUTION: 247 return "="; 248 case TokenType::PUNCTUATOR_QUESTION_MARK: 249 return "?"; 250 case TokenType::PUNCTUATOR_QUESTION_DOT: 251 return "?."; 252 case TokenType::PUNCTUATOR_AT: 253 return "@"; 254 case TokenType::PUNCTUATOR_FORMAT: 255 return "@@"; 256 case TokenType::PUNCTUATOR_RIGHT_PARENTHESIS: 257 return ")"; 258 case TokenType::PUNCTUATOR_LEFT_PARENTHESIS: 259 return "("; 260 case TokenType::PUNCTUATOR_RIGHT_SQUARE_BRACKET: 261 return "]"; 262 case TokenType::PUNCTUATOR_LEFT_SQUARE_BRACKET: 263 return "["; 264 case TokenType::PUNCTUATOR_RIGHT_BRACE: 265 return "}"; 266 case TokenType::PUNCTUATOR_PERIOD: 267 return "."; 268 case TokenType::PUNCTUATOR_PERIOD_PERIOD_PERIOD: 269 return "..."; 270 case TokenType::PUNCTUATOR_PERIOD_QUESTION: 271 return ".?"; 272 case TokenType::PUNCTUATOR_LEFT_BRACE: 273 return "{"; 274 case TokenType::PUNCTUATOR_SEMI_COLON: 275 return ";"; 276 case TokenType::PUNCTUATOR_COLON: 277 return ":"; 278 case TokenType::PUNCTUATOR_COMMA: 279 return ","; 280 case TokenType::KEYW_GET: 281 return "get"; 282 case TokenType::KEYW_SET: 283 return "set"; 284 case TokenType::KEYW_OF: 285 return "of"; 286 case TokenType::KEYW_FROM: 287 return "from"; 288 case TokenType::KEYW_AS: 289 return "as"; 290 case TokenType::KEYW_META: 291 return "meta"; 292 case TokenType::KEYW_ASSERT: 293 return "assert"; 294 case TokenType::KEYW_REQUIRE: 295 return "require"; 296 case TokenType::KEYW_ABSTRACT: 297 return "abstract"; 298 case TokenType::KEYW_ANY: 299 return "any"; 300 case TokenType::KEYW_AWAIT: 301 return "await"; 302 case TokenType::KEYW_BIGINT: 303 return "bigint"; 304 case TokenType::KEYW_BOOLEAN: 305 return "boolean"; 306 case TokenType::KEYW_BREAK: 307 return "break"; 308 case TokenType::KEYW_BYTE: 309 return "byte"; 310 case TokenType::KEYW_CASE: 311 return "case"; 312 case TokenType::KEYW_CATCH: 313 return "catch"; 314 case TokenType::KEYW_CHAR: 315 return "char"; 316 case TokenType::KEYW_CONST: 317 return "const"; 318 case TokenType::KEYW_CONSTRUCTOR: 319 return "constructor"; 320 case TokenType::KEYW_CONTINUE: 321 return "continue"; 322 case TokenType::KEYW_DEBUGGER: 323 return "debugger"; 324 case TokenType::KEYW_DEFAULT: 325 return "default"; 326 case TokenType::KEYW_DO: 327 return "do"; 328 case TokenType::KEYW_ENUM: 329 return "enum"; 330 case TokenType::KEYW_DOUBLE: 331 return "double"; 332 case TokenType::KEYW_EXPORT: 333 return "export"; 334 case TokenType::KEYW_FINALLY: 335 return "finally"; 336 case TokenType::KEYW_FLOAT: 337 return "float"; 338 case TokenType::KEYW_FOR: 339 return "for"; 340 case TokenType::KEYW_FUNCTION: 341 return "function"; 342 case TokenType::KEYW_IF: 343 return "if"; 344 case TokenType::KEYW_INT: 345 return "int"; 346 case TokenType::KEYW_IMPORT: 347 return "import"; 348 case TokenType::KEYW_LAUNCH: 349 return "launch"; 350 case TokenType::KEYW_LONG: 351 return "long"; 352 case TokenType::KEYW_NEVER: 353 return "never"; 354 case TokenType::KEYW_NEW: 355 return "new"; 356 case TokenType::LITERAL_NULL: 357 return "null"; 358 case TokenType::KEYW_NUMBER: 359 return "number"; 360 case TokenType::KEYW_OBJECT: 361 return "object"; 362 case TokenType::KEYW_REGEXP: 363 return "regexp"; 364 case TokenType::KEYW_RETURN: 365 return "return"; 366 case TokenType::KEYW_STRING: 367 return "string"; 368 case TokenType::KEYW_SHORT: 369 return "short"; 370 case TokenType::KEYW_SUPER: 371 return "super"; 372 case TokenType::KEYW_SWITCH: 373 return "switch"; 374 case TokenType::KEYW_TRAP: 375 return "trap"; 376 case TokenType::KEYW_THIS: 377 return "this"; 378 case TokenType::KEYW_THROW: 379 return "throw"; 380 case TokenType::KEYW_TYPE: 381 return "type"; 382 case TokenType::KEYW_TRY: 383 return "try"; 384 case TokenType::KEYW_TYPEOF: 385 return "typeof"; 386 case TokenType::KEYW_UNDEFINED: 387 return "undefined"; 388 case TokenType::KEYW_UNKNOWN: 389 return "unknown"; 390 case TokenType::KEYW_VAR: 391 return "var"; 392 case TokenType::KEYW_VOID: 393 return "void"; 394 case TokenType::KEYW_WHILE: 395 return "while"; 396 case TokenType::KEYW_WITH: 397 return "with"; 398 case TokenType::KEYW_ASYNC: 399 return "async"; 400 case TokenType::KEYW_READONLY: 401 return "readonly"; 402 case TokenType::KEYW_KEYOF: 403 return "keyof"; 404 case TokenType::KEYW_MODULE: 405 return "module"; 406 case TokenType::KEYW_NAMESPACE: 407 return "namespace"; 408 case TokenType::KEYW_INFER: 409 return "infer"; 410 case TokenType::KEYW_DECLARE: 411 return "declare"; 412 case TokenType::KEYW_ARGUMENTS: 413 return "arguments"; 414 case TokenType::KEYW_EVAL: 415 return "eval"; 416 case TokenType::KEYW_STATIC: 417 return "static"; 418 case TokenType::KEYW_GLOBAL: 419 return "global"; 420 case TokenType::KEYW_IS: 421 return "is"; 422 case TokenType::KEYW_ASSERTS: 423 return "asserts"; 424 case TokenType::KEYW_PRIVATE: 425 return "private"; 426 case TokenType::KEYW_PROTECTED: 427 return "protected"; 428 case TokenType::KEYW_PUBLIC: 429 return "public"; 430 case TokenType::KEYW_INTERNAL: 431 return "internal"; 432 case TokenType::KEYW_IMPLEMENTS: 433 return "implements"; 434 case TokenType::KEYW_INTERFACE: 435 return "interface"; 436 case TokenType::KEYW_PACKAGE: 437 return "package"; 438 case TokenType::KEYW_LET: 439 return "let"; 440 case TokenType::KEYW_YIELD: 441 return "yield"; 442 case TokenType::KEYW_DELETE: 443 return "delete"; 444 case TokenType::KEYW_ELSE: 445 return "else"; 446 case TokenType::EOS: 447 return "eos"; 448 case TokenType::KEYW_OUT: 449 return "out"; 450 case TokenType::PUNCTUATOR_DOLLAR_DOLLAR: 451 return "$$"; 452 case TokenType::KEYW_OVERRIDE: 453 return "override"; 454 case TokenType::KEYW_NATIVE: 455 return "native"; 456 case TokenType::LITERAL_IDENT: 457 return "identification literal"; 458 case TokenType::LITERAL_NUMBER: 459 return "number literal"; 460 case TokenType::LITERAL_STRING: 461 return "string literal"; 462 default: 463 return ""; 464 } 465 } 466 } // namespace ark::es2panda::lexer 467