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 { 19 IsAccessability() const20bool Token::IsAccessability() const 21 { 22 return (type_ == TokenType::LITERAL_IDENT && 23 (keywordType_ == TokenType::KEYW_PUBLIC || keywordType_ == TokenType::KEYW_PROTECTED || 24 keywordType_ == TokenType::KEYW_PRIVATE) && 25 !(flags_ & TokenFlags::HAS_ESCAPE)); 26 } 27 IsAsyncModifier() const28bool Token::IsAsyncModifier() const 29 { 30 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_ASYNC && 31 !(flags_ & TokenFlags::HAS_ESCAPE)); 32 } 33 IsStaticModifier() const34bool Token::IsStaticModifier() const 35 { 36 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_STATIC && 37 !(flags_ & TokenFlags::HAS_ESCAPE)); 38 } 39 IsDeclareModifier() const40bool Token::IsDeclareModifier() const 41 { 42 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_DECLARE && 43 !(flags_ & TokenFlags::HAS_ESCAPE)); 44 } 45 IsReadonlyModifier() const46bool Token::IsReadonlyModifier() const 47 { 48 return (type_ == TokenType::LITERAL_IDENT && keywordType_ == TokenType::KEYW_READONLY && 49 !(flags_ & TokenFlags::HAS_ESCAPE)); 50 } 51 IsUpdate() const52bool Token::IsUpdate() const 53 { 54 return (type_ == TokenType::PUNCTUATOR_MINUS_MINUS || type_ == TokenType::PUNCTUATOR_PLUS_PLUS); 55 } 56 IsUnary() const57bool Token::IsUnary() const 58 { 59 return (type_ == TokenType::PUNCTUATOR_MINUS || type_ == TokenType::PUNCTUATOR_PLUS || 60 type_ == TokenType::PUNCTUATOR_TILDE || type_ == TokenType::PUNCTUATOR_EXCLAMATION_MARK || 61 type_ == TokenType::PUNCTUATOR_PLUS_PLUS || type_ == TokenType::PUNCTUATOR_MINUS_MINUS || 62 type_ == TokenType::KEYW_TYPEOF || type_ == TokenType::KEYW_VOID || type_ == TokenType::KEYW_DELETE || 63 type_ == TokenType::KEYW_AWAIT); 64 } 65 IsPropNameLiteral() const66bool Token::IsPropNameLiteral() const 67 { 68 return (type_ == TokenType::LITERAL_STRING || type_ == TokenType::LITERAL_NUMBER || 69 type_ == TokenType::LITERAL_TRUE || type_ == TokenType::LITERAL_FALSE); 70 } 71 IsKeyword() const72bool Token::IsKeyword() const 73 { 74 return (type_ >= TokenType::FIRST_KEYW); 75 } 76 IsReservedTypeName() const77bool Token::IsReservedTypeName() const 78 { 79 switch (keywordType_) { 80 case TokenType::KEYW_ANY: 81 case TokenType::KEYW_UNKNOWN: 82 case TokenType::KEYW_NEVER: 83 case TokenType::KEYW_NUMBER: 84 case TokenType::KEYW_BIGINT: 85 case TokenType::KEYW_BOOLEAN: 86 case TokenType::KEYW_STRING: 87 case TokenType::KEYW_VOID: 88 case TokenType::KEYW_OBJECT: 89 return true; 90 default: 91 return false; 92 } 93 } 94 IsJsStrictReservedWord() const95bool Token::IsJsStrictReservedWord() const 96 { 97 switch (keywordType_) { 98 case TokenType::KEYW_ARGUMENTS: 99 case TokenType::KEYW_EVAL: 100 case TokenType::KEYW_STATIC: 101 case TokenType::KEYW_PRIVATE: 102 case TokenType::KEYW_PROTECTED: 103 case TokenType::KEYW_PUBLIC: 104 case TokenType::KEYW_IMPLEMENTS: 105 case TokenType::KEYW_INTERFACE: 106 case TokenType::KEYW_PACKAGE: 107 case TokenType::KEYW_LET: 108 case TokenType::KEYW_YIELD: 109 return true; 110 default: 111 return false; 112 } 113 } 114 IsBinaryToken(TokenType type)115bool Token::IsBinaryToken(TokenType type) 116 { 117 return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_EXPONENTIATION); 118 } 119 IsBinaryLvalueToken(TokenType type)120bool Token::IsBinaryLvalueToken(TokenType type) 121 { 122 return (type >= TokenType::PUNCTUATOR_SUBSTITUTION && type <= TokenType::PUNCTUATOR_EXPONENTIATION_EQUAL); 123 } 124 IsUpdateToken(TokenType type)125bool Token::IsUpdateToken(TokenType type) 126 { 127 return (type == TokenType::PUNCTUATOR_MINUS_MINUS || type == TokenType::PUNCTUATOR_PLUS_PLUS); 128 } 129 IsPunctuatorToken(TokenType type)130bool Token::IsPunctuatorToken(TokenType type) 131 { 132 return (type >= TokenType::PUNCTUATOR_NULLISH_COALESCING && type <= TokenType::PUNCTUATOR_ARROW); 133 } 134 IsTsParamToken(TokenType type)135bool Token::IsTsParamToken(TokenType type) 136 { 137 return (type == TokenType::PUNCTUATOR_COLON || type == TokenType::PUNCTUATOR_QUESTION_MARK); 138 } 139 TokenToString(TokenType type)140const char *TokenToString(TokenType type) 141 { 142 switch (type) { 143 case TokenType::PUNCTUATOR_BITWISE_AND: 144 return "&"; 145 case TokenType::PUNCTUATOR_BITWISE_OR: 146 return "|"; 147 case TokenType::PUNCTUATOR_MULTIPLY: 148 return "*"; 149 case TokenType::PUNCTUATOR_DIVIDE: 150 return "/"; 151 case TokenType::PUNCTUATOR_MINUS: 152 return "-"; 153 case TokenType::PUNCTUATOR_EXCLAMATION_MARK: 154 return "!"; 155 case TokenType::PUNCTUATOR_TILDE: 156 return "~"; 157 case TokenType::PUNCTUATOR_MINUS_MINUS: 158 return "--"; 159 case TokenType::PUNCTUATOR_LEFT_SHIFT: 160 return "<<"; 161 case TokenType::PUNCTUATOR_RIGHT_SHIFT: 162 return ">>"; 163 case TokenType::PUNCTUATOR_LESS_THAN_EQUAL: 164 return "<="; 165 case TokenType::PUNCTUATOR_GREATER_THAN_EQUAL: 166 return ">="; 167 case TokenType::PUNCTUATOR_MOD: 168 return "%"; 169 case TokenType::PUNCTUATOR_BITWISE_XOR: 170 return "^"; 171 case TokenType::PUNCTUATOR_EXPONENTIATION: 172 return "**"; 173 case TokenType::PUNCTUATOR_MULTIPLY_EQUAL: 174 return "*="; 175 case TokenType::PUNCTUATOR_EXPONENTIATION_EQUAL: 176 return "**="; 177 case TokenType::PUNCTUATOR_DIVIDE_EQUAL: 178 return "/="; 179 case TokenType::PUNCTUATOR_MOD_EQUAL: 180 return "%="; 181 case TokenType::PUNCTUATOR_MINUS_EQUAL: 182 return "-="; 183 case TokenType::PUNCTUATOR_LEFT_SHIFT_EQUAL: 184 return "<<="; 185 case TokenType::PUNCTUATOR_RIGHT_SHIFT_EQUAL: 186 return ">>="; 187 case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT: 188 return ">>>"; 189 case TokenType::PUNCTUATOR_UNSIGNED_RIGHT_SHIFT_EQUAL: 190 return ">>>="; 191 case TokenType::PUNCTUATOR_BITWISE_AND_EQUAL: 192 return "&="; 193 case TokenType::PUNCTUATOR_BITWISE_OR_EQUAL: 194 return "|="; 195 case TokenType::PUNCTUATOR_LOGICAL_AND_EQUAL: 196 return "&&="; 197 case TokenType::PUNCTUATOR_NULLISH_COALESCING: 198 return "??"; 199 case TokenType::PUNCTUATOR_LOGICAL_OR_EQUAL: 200 return "||="; 201 case TokenType::PUNCTUATOR_LOGICAL_NULLISH_EQUAL: 202 return "\?\?="; 203 case TokenType::PUNCTUATOR_BITWISE_XOR_EQUAL: 204 return "^="; 205 case TokenType::PUNCTUATOR_PLUS: 206 return "+"; 207 case TokenType::PUNCTUATOR_PLUS_PLUS: 208 return "++"; 209 case TokenType::PUNCTUATOR_PLUS_EQUAL: 210 return "+="; 211 case TokenType::PUNCTUATOR_LESS_THAN: 212 return "<"; 213 case TokenType::PUNCTUATOR_GREATER_THAN: 214 return ">"; 215 case TokenType::PUNCTUATOR_EQUAL: 216 return "=="; 217 case TokenType::PUNCTUATOR_NOT_EQUAL: 218 return "!="; 219 case TokenType::PUNCTUATOR_STRICT_EQUAL: 220 return "==="; 221 case TokenType::PUNCTUATOR_NOT_STRICT_EQUAL: 222 return "!=="; 223 case TokenType::KEYW_INSTANCEOF: 224 return "instanceof"; 225 case TokenType::KEYW_IN: 226 return "in"; 227 case TokenType::PUNCTUATOR_LOGICAL_AND: 228 return "&&"; 229 case TokenType::PUNCTUATOR_LOGICAL_OR: 230 return "||"; 231 case TokenType::PUNCTUATOR_SUBSTITUTION: 232 return "="; 233 case TokenType::PUNCTUATOR_QUESTION_MARK: 234 return "?"; 235 case TokenType::PUNCTUATOR_AT: 236 return "@"; 237 case TokenType::KEYW_ANY: 238 return "any"; 239 case TokenType::KEYW_UNKNOWN: 240 return "unknown"; 241 case TokenType::KEYW_NEVER: 242 return "never"; 243 case TokenType::KEYW_NUMBER: 244 return "number"; 245 case TokenType::KEYW_BIGINT: 246 return "bigint"; 247 case TokenType::KEYW_BOOLEAN: 248 return "boolean"; 249 case TokenType::KEYW_STRING: 250 return "string"; 251 case TokenType::KEYW_VOID: 252 return "void"; 253 case TokenType::KEYW_OBJECT: 254 return "object"; 255 case TokenType::KEYW_TYPEOF: 256 return "typeof"; 257 case TokenType::KEYW_DELETE: 258 return "delete"; 259 default: 260 UNREACHABLE(); 261 } 262 } 263 264 } // namespace panda::es2panda::lexer 265