Skip to content

Commit 817c329

Browse files
author
Andy
authored
getFormattingScanner: Ensure scanner is closed, and avoid global variables (#18293)
1 parent 23f793f commit 817c329

File tree

2 files changed

+14
-25
lines changed

2 files changed

+14
-25
lines changed

src/services/formatting/formatting.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -339,17 +339,17 @@ namespace ts.formatting {
339339
/* @internal */
340340
export function formatNodeGivenIndentation(node: Node, sourceFileLike: SourceFileLike, languageVariant: LanguageVariant, initialIndentation: number, delta: number, rulesProvider: RulesProvider): TextChange[] {
341341
const range = { pos: 0, end: sourceFileLike.text.length };
342-
return formatSpanWorker(
342+
return getFormattingScanner(sourceFileLike.text, languageVariant, range.pos, range.end, scanner => formatSpanWorker(
343343
range,
344344
node,
345345
initialIndentation,
346346
delta,
347-
getFormattingScanner(sourceFileLike.text, languageVariant, range.pos, range.end),
347+
scanner,
348348
rulesProvider.getFormatOptions(),
349349
rulesProvider,
350350
FormattingRequestKind.FormatSelection,
351351
_ => false, // assume that node does not have any errors
352-
sourceFileLike);
352+
sourceFileLike));
353353
}
354354

355355
function formatNodeLines(node: Node, sourceFile: SourceFile, options: FormatCodeSettings, rulesProvider: RulesProvider, requestKind: FormattingRequestKind): TextChange[] {
@@ -372,17 +372,17 @@ namespace ts.formatting {
372372
requestKind: FormattingRequestKind): TextChange[] {
373373
// find the smallest node that fully wraps the range and compute the initial indentation for the node
374374
const enclosingNode = findEnclosingNode(originalRange, sourceFile);
375-
return formatSpanWorker(
375+
return getFormattingScanner(sourceFile.text, sourceFile.languageVariant, getScanStartPosition(enclosingNode, originalRange, sourceFile), originalRange.end, scanner => formatSpanWorker(
376376
originalRange,
377377
enclosingNode,
378378
SmartIndenter.getIndentationForNode(enclosingNode, originalRange, sourceFile, options),
379379
getOwnOrInheritedDelta(enclosingNode, options, sourceFile),
380-
getFormattingScanner(sourceFile.text, sourceFile.languageVariant, getScanStartPosition(enclosingNode, originalRange, sourceFile), originalRange.end),
380+
scanner,
381381
options,
382382
rulesProvider,
383383
requestKind,
384384
prepareRangeContainsErrorFunction(sourceFile.parseDiagnostics, originalRange),
385-
sourceFile);
385+
sourceFile));
386386
}
387387

388388
function formatSpanWorker(originalRange: TextRange,
@@ -427,8 +427,6 @@ namespace ts.formatting {
427427
}
428428
}
429429

430-
formattingScanner.close();
431-
432430
return edits;
433431

434432
// local functions

src/services/formatting/formattingScanner.ts

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,13 @@ namespace ts.formatting {
66
const standardScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, LanguageVariant.Standard);
77
const jsxScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, LanguageVariant.JSX);
88

9-
/**
10-
* Scanner that is currently used for formatting
11-
*/
12-
let scanner: Scanner;
13-
149
export interface FormattingScanner {
1510
advance(): void;
1611
isOnToken(): boolean;
1712
readTokenInfo(n: Node): TokenInfo;
1813
getCurrentLeadingTrivia(): TextRangeWithKind[];
1914
lastTrailingTriviaWasNewLine(): boolean;
2015
skipToEndOf(node: Node): void;
21-
close(): void;
2216
}
2317

2418
const enum ScanAction {
@@ -30,9 +24,8 @@ namespace ts.formatting {
3024
RescanJsxText,
3125
}
3226

33-
export function getFormattingScanner(text: string, languageVariant: LanguageVariant, startPos: number, endPos: number): FormattingScanner {
34-
Debug.assert(scanner === undefined, "Scanner should be undefined");
35-
scanner = languageVariant === LanguageVariant.JSX ? jsxScanner : standardScanner;
27+
export function getFormattingScanner<T>(text: string, languageVariant: LanguageVariant, startPos: number, endPos: number, cb: (scanner: FormattingScanner) => T): T {
28+
const scanner = languageVariant === LanguageVariant.JSX ? jsxScanner : standardScanner;
3629

3730
scanner.setText(text);
3831
scanner.setTextPos(startPos);
@@ -45,21 +38,19 @@ namespace ts.formatting {
4538
let lastScanAction: ScanAction | undefined;
4639
let lastTokenInfo: TokenInfo | undefined;
4740

48-
return {
41+
const res = cb({
4942
advance,
5043
readTokenInfo,
5144
isOnToken,
5245
getCurrentLeadingTrivia: () => leadingTrivia,
5346
lastTrailingTriviaWasNewLine: () => wasNewLine,
5447
skipToEndOf,
55-
close: () => {
56-
Debug.assert(scanner !== undefined);
48+
});
5749

58-
lastTokenInfo = undefined;
59-
scanner.setText(undefined);
60-
scanner = undefined;
61-
}
62-
};
50+
lastTokenInfo = undefined;
51+
scanner.setText(undefined);
52+
53+
return res;
6354

6455
function advance(): void {
6556
Debug.assert(scanner !== undefined, "Scanner should be present");

0 commit comments

Comments
 (0)