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 IsKeyword() const80bool Token::IsKeyword() const 81 { 82 return (type_ >= TokenType::FIRST_KEYW || type_ == TokenType::KEYW_IN || type_ == TokenType::KEYW_INSTANCEOF); 83 } 84 IsReservedTypeName() const85bool 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() const103bool 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)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,char32_t nextChar)143bool 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)149const 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