From e6de1d9e619c5b151c72cc408aeda9e2a282a882 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 2 Jul 2024 05:59:03 +0000 Subject: [PATCH] Create a lookup table on token info to avoid excessive branching. --- src/compiler/scanner.ts | 159 +++++++++++++++++++++------------------- 1 file changed, 84 insertions(+), 75 deletions(-) diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index fe0a99d8648..ac7b5287f94 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -301,6 +301,58 @@ const regExpFlagToFirstAvailableLanguageVersion = new Map= 0 && isIdentifierStart(extendedCookedChar, languageVersion)) { @@ -2302,13 +2299,25 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean pos++; return token = SyntaxKind.Unknown; case CharacterCodes.hash: - if (pos !== 0 && text[pos + 1] === "!") { - error(Diagnostics.can_only_be_used_at_the_start_of_a_file, pos, 2); - pos++; - return token = SyntaxKind.Unknown; + const charAfterHash = codePointUnchecked(pos + 1); + + if (charAfterHash === CharacterCodes.exclamation) { + if (pos === 0) { + pos = scanShebangTrivia(text, pos); + if (skipTrivia) { + continue; + } + else { + return token = SyntaxKind.ShebangTrivia; + } + } + else if (pos !== 0) { + error(Diagnostics.can_only_be_used_at_the_start_of_a_file, pos, 2); + pos++; + return token = SyntaxKind.Unknown; + } } - const charAfterHash = codePointUnchecked(pos + 1); if (charAfterHash === CharacterCodes.backslash) { pos++; const extendedCookedChar = peekExtendedUnicodeEscape();