Lines Matching refs:lexer_
89 ASSERT(lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_DECLARE);
91 const auto startPos = lexer_->Save();
92 lexer_->NextToken(); // eat 'declare'
93 if (lexer_->GetToken().NewLine()) {
94 lexer_->Rewind(startPos);
97 switch (lexer_->GetToken().Type()) {
106 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_TYPE ||
107 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_MODULE ||
108 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_GLOBAL ||
109 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_NAMESPACE ||
110 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_ENUM ||
111 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_ABSTRACT ||
112 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_INTERFACE) {
119 lexer_->Rewind(startPos);
125 lexer_->Rewind(startPos);
134 lexer_->NextToken();
136 switch (lexer_->GetToken().Type()) {
143 if (lexer_->Lookahead() == LEX_CHAR_COLON) {
144 lexer_->NextToken();
158 const auto startPos = lexer_->Save();
161 auto keywordType = lexer_->GetToken().KeywordType();
162 lexer_->NextToken();
163 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_AWAIT) {
164 lexer_->GetToken().SetTokenType(lexer::TokenType::LITERAL_IDENT);
169 isTsDeclarationStatement = !lexer_->GetToken().NewLine() &&
170 (lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT ||
171 lexer_->GetToken().Type() == lexer::TokenType::LITERAL_STRING);
175 isTsDeclarationStatement = lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT ||
176 lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_BRACE ||
177 lexer_->GetToken().Type() == lexer::TokenType::KEYW_EXPORT;
182 isTsDeclarationStatement = !lexer_->GetToken().NewLine() &&
183 lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT;
195 lexer_->Rewind(startPos);
207 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_DECLARE) {
211 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_AT) {
212 lexer_->NextToken(); // eat @ symbol
213 if (lexer_->GetToken().KeywordType() != lexer::TokenType::KEYW_INTERFACE) {
227 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_ABSTRACT) {
228 const auto startPos = lexer_->Save();
229 lexer_->NextToken(); // eat abstract keyword
231 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_DECLARE) {
235 lexer_->NextToken();
243 if (lexer_->GetToken().Type() != lexer::TokenType::KEYW_CLASS) {
244 lexer_->Rewind(startPos);
250 if ((lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_GLOBAL ||
251 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_MODULE ||
252 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_NAMESPACE) &&
264 switch (lexer_->GetToken().Type()) {
338 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
341 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_GLOBAL) {
345 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_NAMESPACE) {
346 lexer_->NextToken();
347 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_AWAIT) {
348 lexer_->GetToken().SetTokenType(lexer::TokenType::LITERAL_IDENT);
351 ASSERT(lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_MODULE);
352 lexer_->NextToken();
353 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_AWAIT) {
354 lexer_->GetToken().SetTokenType(lexer::TokenType::LITERAL_IDENT);
356 if (lexer_->GetToken().Type() == lexer::TokenType::LITERAL_STRING) {
370 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_GLOBAL) {
372 name = AllocNode<ir::Identifier>(lexer_->GetToken().Ident());
374 ASSERT(lexer_->GetToken().Type() == lexer::TokenType::LITERAL_STRING);
380 name = AllocNode<ir::StringLiteral>(lexer_->GetToken().String());
383 name->SetRange(lexer_->GetToken().Loc());
385 lexer_->NextToken();
391 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_BRACE) {
393 } else if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
394 lexer_->NextToken();
395 } else if (!lexer_->GetToken().NewLine()) {
400 moduleDecl->SetRange({startLoc, lexer_->GetToken().End()});
409 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) {
413 auto name = lexer_->GetToken().Ident();
423 Binder()->AddTsDecl<binder::NamespaceDecl>(lexer_->GetToken().Start(), isDeclare, Allocator(), name);
433 identNode->SetRange(lexer_->GetToken().Loc());
435 lexer_->NextToken();
455 moduleDecl->SetRange({startLoc, lexer_->GetToken().End()});
465 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_PERIOD) {
466 lexer_->NextToken();
467 lexer::SourcePosition moduleStart = lexer_->GetToken().Start();
492 ASSERT(lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_IMPORT);
493 lexer_->NextToken();
494 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) {
498 auto *id = AllocNode<ir::Identifier>(lexer_->GetToken().Ident());
499 id->SetRange(lexer_->GetToken().Loc());
500 lexer_->NextToken(); // eat id name
502 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_SUBSTITUTION) {
505 lexer_->NextToken(); // eat substitution
507 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) {
511 if (lexer_->GetToken().KeywordType() != lexer::TokenType::KEYW_REQUIRE ||
512 lexer_->Lookahead() != LEX_CHAR_LEFT_PAREN) {
527 importEqualsDecl->SetRange({startLoc, lexer_->GetToken().End()});
539 ASSERT(lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_AS);
540 lexer_->NextToken(); // eat as keyword
541 if (lexer_->GetToken().KeywordType() != lexer::TokenType::KEYW_NAMESPACE) {
544 lexer_->NextToken(); // eat namespace keyword
545 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) {
549 auto *id = AllocNode<ir::Identifier>(lexer_->GetToken().Ident());
550 id->SetRange(lexer_->GetToken().Loc());
551 lexer_->NextToken(); // eat identifier
554 namespaceExportDecl->SetRange({startLoc, lexer_->GetToken().End()});
563 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_BRACE) {
567 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
568 lexer_->NextToken();
571 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) {
576 blockNode->SetRange({startLoc, lexer_->GetToken().End()});
578 lexer_->NextToken();
602 lexer::SourcePosition constVarStar = lexer_->GetToken().Start();
603 lexer_->NextToken();
605 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_ENUM) {
627 empty->SetRange(lexer_->GetToken().Loc());
628 lexer_->NextToken();
635 debuggerNode->SetRange(lexer_->GetToken().Loc());
636 lexer_->NextToken();
663 if (lexer_->Lookahead() == LEX_CHAR_COLON) {
664 const auto pos = lexer_->Save();
665 lexer_->NextToken();
670 switch (lexer_->GetToken().KeywordType()) {
704 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
732 ASSERT(lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_TYPE);
733 lexer::SourcePosition typeStart = lexer_->GetToken().Start();
734 lexer_->NextToken(); // eat type keyword
736 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT &&
737 !(lexer_->GetToken().Type() == lexer::TokenType::KEYW_AWAIT && isDeclare)) {
741 if (lexer_->GetToken().IsReservedTypeName()) {
743 errMsg.append(TokenToString(lexer_->GetToken().KeywordType()));
748 const util::StringView &ident = lexer_->GetToken().Ident();
750 auto *decl = Binder()->AddTsDecl<binder::TypeAliasDecl>(lexer_->GetToken().Start(), isDeclare, tsBinding.View());
753 id->SetRange(lexer_->GetToken().Loc());
754 lexer_->NextToken();
757 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) {
761 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_SUBSTITUTION) {
765 lexer_->NextToken(); // eat '='
771 typeAliasDecl->SetRange({typeStart, lexer_->GetToken().End()});
780 ASSERT(lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_INTERFACE);
782 lexer::SourcePosition interfaceStart = lexer_->GetToken().Start();
783 lexer_->NextToken(); // eat interface keyword
787 const util::StringView &ident = lexer_->GetToken().Ident();
795 decl = Binder()->AddTsDecl<binder::InterfaceDecl>(lexer_->GetToken().Start(), isDeclare,
798 Binder()->ThrowRedeclaration(lexer_->GetToken().Start(), ident);
803 auto *id = AllocNode<ir::Identifier>(lexer_->GetToken().Ident());
804 id->SetRange(lexer_->GetToken().Loc());
806 lexer_->NextToken();
811 if (Extension() == ScriptExtension::TS && lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) {
817 lexer::SourcePosition bodyStart = lexer_->GetToken().Start();
821 body->SetRange({bodyStart, lexer_->GetToken().End()});
825 interfaceDecl->SetRange({interfaceStart, lexer_->GetToken().End()});
834 lexer_->NextToken();
842 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT &&
843 !(lexer_->GetToken().Type() == lexer::TokenType::KEYW_AWAIT && isDeclare)) {
847 if (lexer_->GetToken().IsReservedTypeName()) {
849 errMsg.append(TokenToString(lexer_->GetToken().KeywordType()));
859 if (lexer_->GetToken().KeywordType() != lexer::TokenType::KEYW_EXTENDS) {
863 lexer_->NextToken(); // eat extends keyword
865 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) {
868 const lexer::SourcePosition &heritageStart = lexer_->GetToken().Start();
869 lexer::SourcePosition heritageEnd = lexer_->GetToken().End();
870 ir::Expression *expr = AllocNode<ir::Identifier>(lexer_->GetToken().Ident());
872 expr->SetRange(lexer_->GetToken().Loc());
873 if (lexer_->Lookahead() == LEX_CHAR_LESS_THAN) {
874 lexer_->ForwardToken(lexer::TokenType::PUNCTUATOR_LESS_THAN, 1);
876 lexer_->NextToken();
878 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_PERIOD) {
882 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LESS_THAN) {
891 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_BRACE) {
894 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_COMMA) {
897 lexer_->NextToken();
909 if (lexer_->Lookahead() == LEX_CHAR_ASTERISK) {
922 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
923 statement->SetEnd(lexer_->GetToken().End());
924 lexer_->NextToken();
928 if (!lexer_->GetToken().NewLine()) {
929 if (lexer_->GetToken().Type() != lexer::TokenType::EOS &&
930 lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) {
944 while (lexer_->GetToken().Type() != endType) {
953 ASSERT(lexer_->GetToken().Type() == lexer::TokenType::LITERAL_STRING);
955 const util::StringView &str = lexer_->GetToken().String();
980 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_STRING || !ParseDirective(statements)) {
988 ASSERT(lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_BRACE);
990 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
991 lexer_->NextToken();
994 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) {
999 blockNode->SetRange({startLoc, lexer_->GetToken().End()});
1009 lexer_->NextToken();
1017 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
1018 lexer_->NextToken();
1020 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON ||
1021 lexer_->GetToken().Type() == lexer::TokenType::EOS || lexer_->GetToken().NewLine() ||
1022 lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) {
1039 breakStatement->SetRange({startLoc, lexer_->GetToken().End()});
1040 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1041 lexer_->NextToken();
1047 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) {
1051 const auto &label = lexer_->GetToken().Ident();
1058 identNode->SetRange(lexer_->GetToken().Loc());
1061 breakStatement->SetRange({startLoc, lexer_->GetToken().End()});
1063 lexer_->NextToken();
1088 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
1089 lexer::SourcePosition endLoc = lexer_->GetToken().End();
1090 lexer_->NextToken();
1092 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1094 continueStatement->SetRange({startLoc, lexer_->GetToken().End()});
1095 lexer_->NextToken();
1099 if (lexer_->GetToken().NewLine() || lexer_->GetToken().Type() == lexer::TokenType::EOS ||
1100 lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) {
1106 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) {
1110 const auto &label = lexer_->GetToken().Ident();
1119 identNode->SetRange(lexer_->GetToken().Loc());
1122 continueStatement->SetRange({startLoc, lexer_->GetToken().End()});
1124 lexer_->NextToken();
1135 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
1136 lexer_->NextToken();
1139 if (lexer_->GetToken().Type() != lexer::TokenType::KEYW_WHILE) {
1143 lexer_->NextToken();
1144 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS) {
1148 lexer_->NextToken();
1157 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) {
1162 doWhileStatement->SetRange({startLoc, lexer_->GetToken().End()});
1165 lexer_->NextToken();
1167 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1168 doWhileStatement->SetEnd(lexer_->GetToken().End());
1169 lexer_->NextToken();
1178 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
1180 ASSERT(lexer_->GetToken().Type() == lexer::TokenType::KEYW_FUNCTION);
1183 lexer_->NextToken();
1185 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_MULTIPLY) {
1187 lexer_->NextToken();
1193 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT &&
1194 lexer_->GetToken().Type() != lexer::TokenType::KEYW_AWAIT) {
1198 lexer_->NextToken();
1221 util::StringView ident = lexer_->GetToken().Ident();
1224 identNode->SetRange(lexer_->GetToken().Loc());
1225 lexer_->NextToken();
1230 lexer_->NextToken();
1240 if (func->IsOverload() && lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1241 lexer_->NextToken();
1305 const auto startPos = lexer_->Save();
1308 if (lexer_->GetToken().IsAsyncModifier()) {
1310 lexer_->NextToken();
1312 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_FUNCTION && !lexer_->GetToken().NewLine()) {
1323 lexer_->Rewind(startPos);
1344 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_IN ||
1345 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_OF) {
1348 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_IN) {
1362 lexer_->NextToken();
1369 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) {
1371 } else if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1372 lexer_->NextToken();
1375 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1378 lexer_->NextToken();
1381 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) {
1397 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_IN ||
1398 (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_OF)) {
1399 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_IN) {
1437 lexer_->NextToken();
1450 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COMMA) {
1466 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) {
1470 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1474 lexer_->NextToken();
1476 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1477 lexer_->NextToken();
1481 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1484 lexer_->NextToken();
1487 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) {
1503 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1504 lexer_->NextToken();
1507 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1510 lexer_->NextToken();
1513 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) {
1522 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
1530 lexer_->NextToken();
1534 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_AWAIT) {
1537 lexer_->NextToken();
1540 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS) {
1543 lexer_->NextToken();
1547 switch (lexer_->GetToken().Type()) {
1567 lexer_->NextToken();
1578 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SEMI_COLON) {
1579 lexer_->NextToken();
1600 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) {
1603 lexer_->NextToken();
1627 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
1628 lexer::SourcePosition endLoc = lexer_->GetToken().End();
1629 lexer_->NextToken();
1631 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS) {
1635 lexer_->NextToken();
1638 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) {
1642 lexer_->NextToken();
1652 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_ELSE) {
1653 lexer_->NextToken(); // eat ELSE keyword
1665 const auto savedPos = lexer_->Save();
1667 lexer_->Rewind(savedPos);
1671 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_AWAIT && context_.IsModule()) {
1689 lexer_->NextToken();
1705 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
1706 lexer::SourcePosition endLoc = lexer_->GetToken().End();
1707 lexer_->NextToken();
1709 bool hasArgument = (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_SEMI_COLON &&
1710 lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE &&
1711 lexer_->GetToken().Type() != lexer::TokenType::EOS && !lexer_->GetToken().NewLine());
1731 lexer::SourcePosition caseStartLoc = lexer_->GetToken().Start();
1734 switch (lexer_->GetToken().Type()) {
1736 lexer_->NextToken();
1751 lexer_->NextToken();
1759 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_COLON) {
1764 lexer::SourcePosition caseEndLoc = lexer_->GetToken().End();
1766 lexer_->NextToken();
1768 while (lexer_->GetToken().Type() != lexer::TokenType::KEYW_CASE &&
1769 lexer_->GetToken().Type() != lexer::TokenType::KEYW_DEFAULT &&
1770 lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) {
1783 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
1784 lexer_->NextToken();
1785 if (!(lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS)) {
1789 lexer_->NextToken();
1792 if (!(lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS)) {
1796 lexer_->NextToken();
1799 if (!(lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_BRACE)) {
1803 lexer_->NextToken();
1808 while (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) {
1813 switchStatement->SetRange({startLoc, lexer_->GetToken().End()});
1816 lexer_->NextToken();
1823 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
1824 lexer_->NextToken();
1826 if (lexer_->GetToken().NewLine()) {
1850 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS) {
1854 lexer_->NextToken(); // eat left paren
1856 if (lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT) {
1857 switch (lexer_->GetToken().KeywordType()) {
1869 param = AllocNode<ir::Identifier>(lexer_->GetToken().Ident());
1870 param->SetRange(lexer_->GetToken().Loc());
1872 lexer_->NextToken();
1873 } else if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_SQUARE_BRACKET) {
1875 } else if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_BRACE) {
1884 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COLON) {
1885 lexer_->NextToken(); // eat ':'
1891 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SUBSTITUTION) {
1896 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) {
1900 lexer_->NextToken();
1907 lexer::SourcePosition catchStartLoc = lexer_->GetToken().Start();
1908 lexer_->NextToken(); // eat 'catch' keyword
1916 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_BRACE) {
1925 lexer_->NextToken();
1937 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
1938 lexer::SourcePosition endLoc = lexer_->GetToken().End();
1940 lexer_->NextToken();
1942 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_BRACE) {
1948 if (lexer_->GetToken().Type() != lexer::TokenType::KEYW_CATCH &&
1949 lexer_->GetToken().Type() != lexer::TokenType::KEYW_FINALLY) {
1956 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_CATCH) {
1961 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_FINALLY) {
1962 lexer_->NextToken(); // eat 'finally' keyword
1964 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_BRACE) {
1983 switch (lexer_->GetToken().KeywordType()) {
2024 lexer_->NextToken();
2044 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
2051 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SUBSTITUTION) {
2098 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_AWAIT && isDeclare) {
2099 lexer_->GetToken().SetTokenType(lexer::TokenType::LITERAL_IDENT);
2103 switch (lexer_->GetToken().Type()) {
2108 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_LET) {
2112 const util::StringView &identStr = lexer_->GetToken().Ident();
2114 init->SetRange(lexer_->GetToken().Loc());
2120 lexer_->NextToken();
2137 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_EXCLAMATION_MARK) {
2138 lexer_->NextToken(); // eat '!'
2141 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COLON) {
2142 lexer_->NextToken(); // eat ':'
2153 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
2155 lexer_->NextToken();
2158 if ((flags & VariableParsingFlags::LET) && util::Helpers::IsGlobalIdentifier(lexer_->GetToken().Ident())) {
2160 + lexer_->GetToken().Ident().Mutf8() + "'.");
2163 if (Extension() == ScriptExtension::TS && lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_ENUM) {
2177 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_COMMA) {
2180 lexer_->NextToken();
2200 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
2201 lexer_->NextToken();
2202 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_PARENTHESIS) {
2206 lexer_->NextToken();
2209 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) {
2213 lexer_->NextToken();
2483 lexer_->NextToken(); // eat `default` keyword or `=`
2488 if (!decorators.empty() && lexer_->GetToken().Type() != lexer::TokenType::KEYW_CLASS &&
2493 if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_FUNCTION) {
2495 } else if (lexer_->GetToken().Type() == lexer::TokenType::KEYW_CLASS) {
2497 } else if (lexer_->GetToken().IsAsyncModifier()) {
2498 lexer_->NextToken(); // eat `async` keyword
2501 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_INTERFACE) {
2504 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_ABSTRACT) {
2505 lexer_->NextToken();
2506 if (lexer_->GetToken().Type() != lexer::TokenType::KEYW_CLASS) {
2554 lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); // eat `*` character
2558 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_AS) {
2559 lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT);
2560 exported = ParseNamedExport(lexer_->GetToken());
2561 lexer_->NextToken(); // eat exported name
2571 if (Extension() == ScriptExtension::TS && !lexer_->GetToken().NewLine() &&
2572 lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT &&
2573 lexer_->GetToken().Ident().Is("assert")) {
2593 lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); // eat `{` character
2597 while (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) {
2599 if (Extension() == ScriptExtension::TS && lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_TYPE) {
2602 lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); // eat type
2611 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) {
2615 lexer::Token localToken = lexer_->GetToken();
2616 auto *local = AllocNode<ir::Identifier>(lexer_->GetToken().Ident());
2617 local->SetRange(lexer_->GetToken().Loc());
2623 lexer_->NextToken(); // eat local name
2627 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_AS) {
2628 lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); // eat `as` literal
2629 exported = ParseNamedExport(lexer_->GetToken());
2630 lexer_->NextToken(); // eat exported name
2640 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COMMA) {
2641 lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); // eat comma
2645 lexer::SourcePosition endPos = lexer_->GetToken().End();
2646 lexer_->NextToken(); // eat right brace
2650 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_FROM) {
2658 if (Extension() == ScriptExtension::TS && !lexer_->GetToken().NewLine() &&
2659 lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT &&
2660 lexer_->GetToken().Ident().Is("assert")) {
2687 if (Extension() == ScriptExtension::TS && lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_DECLARE) {
2691 if (!decorators.empty() && lexer_->GetToken().Type() != lexer::TokenType::KEYW_CLASS &&
2693 !(lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT &&
2694 (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_ABSTRACT))) {
2698 if (!annotations.empty() && lexer_->GetToken().Type() != lexer::TokenType::KEYW_CLASS &&
2707 switch (lexer_->GetToken().Type()) {
2730 lexer_->NextToken(); // eat @ symbol
2731 if (lexer_->GetToken().KeywordType() != lexer::TokenType::KEYW_INTERFACE) {
2749 switch (lexer_->GetToken().KeywordType()) {
2778 lexer_->NextToken(); // eat abstract keyword
2780 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_DECLARE) {
2784 lexer_->NextToken();
2788 if (lexer_->GetToken().Type() != lexer::TokenType::KEYW_CLASS) {
2812 if (!lexer_->GetToken().IsAsyncModifier()) {
2816 lexer_->NextToken(); // eat `async` keyword
2849 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
2850 lexer_->NextToken(); // eat `export` keyword
2855 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_TYPE) {
2856 const auto savedPos = lexer_->Save();
2857 lexer_->NextToken(); // eat type
2858 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_BRACE) {
2861 lexer_->Rewind(savedPos);
2865 switch (lexer_->GetToken().Type()) {
2891 if (Extension() == ScriptExtension::TS && lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_AS) {
2914 lexer::SourcePosition namespaceStart = lexer_->GetToken().Start();
2915 lexer_->NextToken(); // eat `*` character
2917 if (lexer_->GetToken().KeywordType() != lexer::TokenType::KEYW_AS) {
2921 lexer_->NextToken(); // eat `as` literal
2923 ir::Identifier *local = ParseNamedImport(lexer_->GetToken());
2926 specifier->SetRange({namespaceStart, lexer_->GetToken().End()});
2933 lexer_->NextToken(); // eat local name
2974 lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); // eat `{` character
2976 while (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) {
2978 if (Extension() == ScriptExtension::TS && lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_TYPE) {
2981 lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); // eat type
2990 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT ||
2991 (Extension() == ScriptExtension::TS && lexer_->GetToken().Ident().Is("await"))) {
2995 lexer::Token importedToken = lexer_->GetToken();
2998 imported->SetRange(lexer_->GetToken().Loc());
3000 lexer_->NextToken(); // eat import name
3002 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_AS) {
3003 lexer_->NextToken(); // eat `as` literal
3004 local = ParseNamedImport(lexer_->GetToken());
3005 lexer_->NextToken(); // eat local name
3018 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COMMA) {
3019 lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); // eat comma
3020 } else if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) {
3025 lexer_->NextToken(); // eat right brace
3031 const auto savedPos = lexer_->Save();
3033 lexer_->NextToken(lexer::LexerNextTokenFlags::KEYWORD_TO_IDENT); // eat type
3035 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_AS) {
3037 lexer_->NextToken(); // eat first as
3038 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_AS) {
3040 lexer_->NextToken(); // eat second as
3041 if (lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT) {
3048 } else if (lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT) {
3055 } else if (lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT) {
3063 lexer_->Rewind(savedPos);
3071 if (lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT &&
3072 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_REQUIRE &&
3073 lexer_->Lookahead() == LEX_CHAR_LEFT_PAREN) {
3074 lexer::SourcePosition start = lexer_->GetToken().Start();
3075 lexer_->NextToken(); // eat 'require'
3076 lexer_->NextToken(); // eat '('
3078 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_STRING) {
3082 result = AllocNode<ir::StringLiteral>(lexer_->GetToken().String());
3083 result->SetRange(lexer_->GetToken().Loc());
3084 lexer_->NextToken();
3086 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_PARENTHESIS) {
3091 result->SetRange({start, lexer_->GetToken().End()});
3092 lexer_->NextToken(); // eat ')'
3094 result = AllocNode<ir::Identifier>(lexer_->GetToken().Ident());
3095 result->SetRange(lexer_->GetToken().Loc());
3096 lexer_->NextToken();
3098 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_PERIOD) {
3108 ir::Identifier *local = ParseNamedImport(lexer_->GetToken());
3109 lexer_->NextToken(); // eat local name
3111 if (Extension() == ScriptExtension::TS && lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_SUBSTITUTION) {
3112 lexer_->NextToken(); // eat substitution
3113 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_IDENT) {
3116 if (lexer_->GetToken().KeywordType() != lexer::TokenType::KEYW_REQUIRE ||
3117 lexer_->Lookahead() != LEX_CHAR_LEFT_PAREN) {
3139 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COMMA) {
3140 lexer_->NextToken(); // eat comma
3141 } else if (lexer_->GetToken().KeywordType() != lexer::TokenType::KEYW_FROM) {
3150 if (lexer_->GetToken().KeywordType() != lexer::TokenType::KEYW_FROM) {
3155 lexer_->NextToken(); // eat `from` literal
3158 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_STRING) {
3162 ASSERT(lexer_->GetToken().Type() == lexer::TokenType::LITERAL_STRING);
3164 auto *source = AllocNode<ir::StringLiteral>(lexer_->GetToken().String());
3165 source->SetRange(lexer_->GetToken().Loc());
3167 lexer_->NextToken();
3177 if (lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT) {
3184 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_MULTIPLY) {
3186 } else if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_BRACE) {
3208 char32_t nextChar = lexer_->Lookahead();
3224 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
3225 lexer_->NextToken(); // eat import
3228 if (lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_LAZY) {
3229 const auto savedPos = lexer_->Save();
3230 lexer_->NextToken(); // eat lazy
3232 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_BRACE) {
3236 lexer_->Rewind(savedPos);
3242 lexer_->GetToken().KeywordType() == lexer::TokenType::KEYW_TYPE) {
3243 const auto savedPos = lexer_->Save();
3244 lexer_->NextToken(); // eat type
3245 if ((lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT &&
3246 lexer_->GetToken().KeywordType() != lexer::TokenType::KEYW_FROM) ||
3247 lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_LEFT_BRACE ||
3248 lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_MULTIPLY) {
3251 lexer_->Rewind(savedPos);
3259 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_STRING) {
3263 astNode->SetRange({startLoc, lexer_->GetToken().End()});
3282 if (Extension() == ScriptExtension::TS && !lexer_->GetToken().NewLine() &&
3283 lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT &&
3284 lexer_->GetToken().Ident().Is("assert")) {
3306 lexer::SourcePosition startLoc = lexer_->GetToken().Start();
3307 lexer_->NextToken(); // eat assert
3309 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_LEFT_BRACE) {
3312 lexer_->NextToken(); // eat '{'
3315 while (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_RIGHT_BRACE) {
3319 lexer_->NextToken(); // eat '}'
3322 assertClause->SetRange({startLoc, lexer_->GetToken().End()});
3330 if (lexer_->GetToken().Type() == lexer::TokenType::LITERAL_IDENT) {
3331 key = AllocNode<ir::Identifier>(lexer_->GetToken().Ident());
3332 key->SetRange(lexer_->GetToken().Loc());
3333 } else if (lexer_->GetToken().Type() == lexer::TokenType::LITERAL_STRING) {
3334 key = AllocNode<ir::StringLiteral>(lexer_->GetToken().String());
3335 key->SetRange(lexer_->GetToken().Loc());
3340 lexer_->NextToken();
3342 if (lexer_->GetToken().Type() != lexer::TokenType::PUNCTUATOR_COLON) {
3345 lexer_->NextToken(); // eat :
3347 if (lexer_->GetToken().Type() != lexer::TokenType::LITERAL_STRING) {
3351 ir::StringLiteral *value = AllocNode<ir::StringLiteral>(lexer_->GetToken().String());
3352 value->SetRange(lexer_->GetToken().Loc());
3353 lexer_->NextToken();
3361 if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COMMA) {
3362 lexer_->NextToken(); // eat comma