@@ -2153,10 +2153,6 @@ namespace Parser {
21532153 return currentToken = scanner.reScanTemplateToken(isTaggedTemplate);
21542154 }
21552155
2156- function reScanTemplateHeadOrNoSubstitutionTemplate(): SyntaxKind {
2157- return currentToken = scanner.reScanTemplateHeadOrNoSubstitutionTemplate();
2158- }
2159-
21602156 function reScanLessThanToken(): SyntaxKind {
21612157 return currentToken = scanner.reScanLessThanToken();
21622158 }
@@ -3606,9 +3602,7 @@ namespace Parser {
36063602 }
36073603
36083604 function parseTemplateHead(isTaggedTemplate: boolean): TemplateHead {
3609- if (isTaggedTemplate) {
3610- reScanTemplateHeadOrNoSubstitutionTemplate();
3611- }
3605+ reScanTemplateToken(isTaggedTemplate);
36123606 const fragment = parseLiteralLikeNode(token());
36133607 Debug.assert(fragment.kind === SyntaxKind.TemplateHead, "Template head has wrong token kind");
36143608 return fragment as TemplateHead;
@@ -3630,14 +3624,13 @@ namespace Parser {
36303624 const pos = getNodePos();
36313625 const node =
36323626 isTemplateLiteralKind(kind) ? factory.createTemplateLiteralLikeNode(kind, scanner.getTokenValue(), getTemplateLiteralRawText(kind), scanner.getTokenFlags() & TokenFlags.TemplateLiteralLikeFlags) :
3633- // Octal literals are not allowed in strict mode or ES5
36343627 // Note that theoretically the following condition would hold true literals like 009,
36353628 // which is not octal. But because of how the scanner separates the tokens, we would
36363629 // never get a token like this. Instead, we would get 00 and 9 as two separate tokens.
36373630 // We also do not need to check for negatives because any prefix operator would be part of a
36383631 // parent unary expression.
36393632 kind === SyntaxKind.NumericLiteral ? factory.createNumericLiteral(scanner.getTokenValue(), scanner.getNumericLiteralFlags()) :
3640- kind === SyntaxKind.StringLiteral ? factory.createStringLiteral(scanner.getTokenValue(), /*isSingleQuote*/ undefined, scanner.hasExtendedUnicodeEscape()) :
3633+ kind === SyntaxKind.StringLiteral ? factory.createStringLiteral(scanner.getTokenValue(), /*isSingleQuote*/ undefined, scanner.hasExtendedUnicodeEscape(), scanner.getRangesOfOctalSequences() ) :
36413634 isLiteralKind(kind) ? factory.createLiteralLikeNode(kind, scanner.getTokenValue()) :
36423635 Debug.fail();
36433636
@@ -6314,7 +6307,7 @@ namespace Parser {
63146307 tag,
63156308 typeArguments,
63166309 token() === SyntaxKind.NoSubstitutionTemplateLiteral ?
6317- (reScanTemplateHeadOrNoSubstitutionTemplate( ), parseLiteralNode() as NoSubstitutionTemplateLiteral) :
6310+ (reScanTemplateToken(/*isTaggedTemplate*/ true ), parseLiteralNode() as NoSubstitutionTemplateLiteral) :
63186311 parseTemplateExpression(/*isTaggedTemplate*/ true)
63196312 );
63206313 if (questionDotToken || tag.flags & NodeFlags.OptionalChain) {
@@ -6414,10 +6407,14 @@ namespace Parser {
64146407
64156408 function parsePrimaryExpression(): PrimaryExpression {
64166409 switch (token()) {
6410+ case SyntaxKind.NoSubstitutionTemplateLiteral:
6411+ if (scanner.getTokenFlags() & TokenFlags.ContainsOctalOrInvalidEscape) {
6412+ reScanTemplateToken(/* isTaggedTemplate */ false);
6413+ }
6414+ // falls through
64176415 case SyntaxKind.NumericLiteral:
64186416 case SyntaxKind.BigIntLiteral:
64196417 case SyntaxKind.StringLiteral:
6420- case SyntaxKind.NoSubstitutionTemplateLiteral:
64216418 return parseLiteralNode();
64226419 case SyntaxKind.ThisKeyword:
64236420 case SyntaxKind.SuperKeyword:
0 commit comments