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() const22bool 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() const30bool Token::IsAsyncModifier() const 31 { 32 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_ASYNC && 33 !(flags_ & TokenFlags::HAS_ESCAPE)); 34 } 35 IsStaticModifier() const36bool Token::IsStaticModifier() const 37 { 38 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_STATIC && 39 !(flags_ & TokenFlags::HAS_ESCAPE)); 40 } 41 IsDeclareModifier() const42bool Token::IsDeclareModifier() const 43 { 44 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_DECLARE && 45 !(flags_ & TokenFlags::HAS_ESCAPE)); 46 } 47 IsReadonlyModifier() const48bool Token::IsReadonlyModifier() const 49 { 50 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_READONLY && 51 !(flags_ & TokenFlags::HAS_ESCAPE)); 52 } 53 IsAccessorModifier() const54bool Token::IsAccessorModifier() const 55 { 56 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_ACCESSOR && 57 !(flags_ & TokenFlags::HAS_ESCAPE)); 58 } 59 IsUpdate() const60bool Token::IsUpdate() const 61 { 62 return (type_ == TokenType::PUNCTUATOR_MINUS_MINUS || type_ == TokenType::PUNCTUATOR_PLUS_PLUS); 63 } 64 IsUnary() const65bool 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() const74bool 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() const80bool Token::IsBooleanOrNullLiteral() const 81 { 82 return (type_ == TokenType::LITERAL_NULL || type_ == TokenType::LITERAL_TRUE || type_ == TokenType::LITERAL_FALSE); 83 } 84 IsKeyword() const85bool Token::IsKeyword() const 86 { 87 return (type_ >= TokenType::FIRST_KEYW || type_ == TokenType::KEYW_IN || type_ == TokenType::KEYW_INSTANCEOF); 88 } 89 IsReservedTypeName() const90bool 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() const108bool 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)128bool Token::IsBinaryToken(TokenType type) 129 { 130 return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_EXPONENTIATION); 131 } 132 IsBinaryLvalueToken(TokenType type)133bool Token::IsBinaryLvalueToken(TokenType type) 134 { 135 return (type >= TokenType::PUNCTUATOR_SUBSTITUTION && type <= TokenType::PUNCTUATOR_EXPONENTIATION_EQUAL); 136 } 137 IsUpdateToken(TokenType type)138bool Token::IsUpdateToken(TokenType type) 139 { 140 return (type == TokenType::PUNCTUATOR_MINUS_MINUS || type == TokenType::PUNCTUATOR_PLUS_PLUS); 141 } 142 IsPunctuatorToken(TokenType type)143bool Token::IsPunctuatorToken(TokenType type) 144 { 145 return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_ARROW); 146 } 147 IsTsParamToken(TokenType type,char32_t nextChar)148bool 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)154const 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