Skip to content

Commit 9a3847f

Browse files
author
Andy
authored
getSingleLineStringWriter: Use try-finally, and only one stringWriter (#16751)
* getSingleLineStringWriter: Use try-finally, and only one stringWriter * Use a `usingSingleLineStringWriter` helper function * Add assert
1 parent 79b1008 commit 9a3847f

File tree

2 files changed

+50
-54
lines changed

2 files changed

+50
-54
lines changed

src/compiler/checker.ts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2285,21 +2285,15 @@ namespace ts {
22852285
}
22862286

22872287
function symbolToString(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags): string {
2288-
const writer = getSingleLineStringWriter();
2289-
getSymbolDisplayBuilder().buildSymbolDisplay(symbol, writer, enclosingDeclaration, meaning);
2290-
const result = writer.string();
2291-
releaseStringWriter(writer);
2292-
2293-
return result;
2288+
return usingSingleLineStringWriter(writer => {
2289+
getSymbolDisplayBuilder().buildSymbolDisplay(symbol, writer, enclosingDeclaration, meaning);
2290+
});
22942291
}
22952292

22962293
function signatureToString(signature: Signature, enclosingDeclaration?: Node, flags?: TypeFormatFlags, kind?: SignatureKind): string {
2297-
const writer = getSingleLineStringWriter();
2298-
getSymbolDisplayBuilder().buildSignatureDisplay(signature, writer, enclosingDeclaration, flags, kind);
2299-
const result = writer.string();
2300-
releaseStringWriter(writer);
2301-
2302-
return result;
2294+
return usingSingleLineStringWriter(writer => {
2295+
getSymbolDisplayBuilder().buildSignatureDisplay(signature, writer, enclosingDeclaration, flags, kind);
2296+
});
23032297
}
23042298

23052299
function typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string {
@@ -2996,12 +2990,9 @@ namespace ts {
29962990
}
29972991

29982992
function typePredicateToString(typePredicate: TypePredicate, enclosingDeclaration?: Declaration, flags?: TypeFormatFlags): string {
2999-
const writer = getSingleLineStringWriter();
3000-
getSymbolDisplayBuilder().buildTypePredicateDisplay(typePredicate, writer, enclosingDeclaration, flags);
3001-
const result = writer.string();
3002-
releaseStringWriter(writer);
3003-
3004-
return result;
2993+
return usingSingleLineStringWriter(writer => {
2994+
getSymbolDisplayBuilder().buildTypePredicateDisplay(typePredicate, writer, enclosingDeclaration, flags);
2995+
});
30052996
}
30062997

30072998
function formatUnionTypes(types: Type[]): Type[] {

src/compiler/utilities.ts

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -44,42 +44,47 @@ namespace ts {
4444
string(): string;
4545
}
4646

47-
// Pool writers to avoid needing to allocate them for every symbol we write.
48-
const stringWriters: StringSymbolWriter[] = [];
49-
export function getSingleLineStringWriter(): StringSymbolWriter {
50-
if (stringWriters.length === 0) {
51-
let str = "";
52-
53-
const writeText: (text: string) => void = text => str += text;
54-
return {
55-
string: () => str,
56-
writeKeyword: writeText,
57-
writeOperator: writeText,
58-
writePunctuation: writeText,
59-
writeSpace: writeText,
60-
writeStringLiteral: writeText,
61-
writeParameter: writeText,
62-
writeProperty: writeText,
63-
writeSymbol: writeText,
64-
65-
// Completely ignore indentation for string writers. And map newlines to
66-
// a single space.
67-
writeLine: () => str += " ",
68-
increaseIndent: noop,
69-
decreaseIndent: noop,
70-
clear: () => str = "",
71-
trackSymbol: noop,
72-
reportInaccessibleThisError: noop,
73-
reportPrivateInBaseOfClassExpression: noop,
74-
};
75-
}
76-
77-
return stringWriters.pop();
78-
}
79-
80-
export function releaseStringWriter(writer: StringSymbolWriter) {
81-
writer.clear();
82-
stringWriters.push(writer);
47+
const stringWriter = createSingleLineStringWriter();
48+
let stringWriterAcquired = false;
49+
50+
function createSingleLineStringWriter(): StringSymbolWriter {
51+
let str = "";
52+
53+
const writeText: (text: string) => void = text => str += text;
54+
return {
55+
string: () => str,
56+
writeKeyword: writeText,
57+
writeOperator: writeText,
58+
writePunctuation: writeText,
59+
writeSpace: writeText,
60+
writeStringLiteral: writeText,
61+
writeParameter: writeText,
62+
writeProperty: writeText,
63+
writeSymbol: writeText,
64+
65+
// Completely ignore indentation for string writers. And map newlines to
66+
// a single space.
67+
writeLine: () => str += " ",
68+
increaseIndent: noop,
69+
decreaseIndent: noop,
70+
clear: () => str = "",
71+
trackSymbol: noop,
72+
reportInaccessibleThisError: noop,
73+
reportPrivateInBaseOfClassExpression: noop,
74+
};
75+
}
76+
77+
export function usingSingleLineStringWriter(action: (writer: StringSymbolWriter) => void): string {
78+
try {
79+
Debug.assert(!stringWriterAcquired);
80+
stringWriterAcquired = true;
81+
action(stringWriter);
82+
return stringWriter.string();
83+
}
84+
finally {
85+
stringWriter.clear();
86+
stringWriterAcquired = false;
87+
}
8388
}
8489

8590
export function getFullWidth(node: Node) {

0 commit comments

Comments
 (0)