Skip to content

Commit 0141d1d

Browse files
authored
Reuse Printers with common options (#52382)
1 parent 45c246f commit 0141d1d

File tree

7 files changed

+34
-25
lines changed

7 files changed

+34
-25
lines changed

src/compiler/checker.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,10 @@ import {
111111
createGetCanonicalFileName,
112112
createGetSymbolWalker,
113113
createModeAwareCacheKey,
114-
createPrinter,
114+
createPrinterWithDefaults,
115+
createPrinterWithRemoveComments,
116+
createPrinterWithRemoveCommentsNeverAsciiEscape,
117+
createPrinterWithRemoveCommentsOmitTrailingSemicolon,
115118
createPropertyNameNodeForIdentifierOrLiteral,
116119
createSymbolTable,
117120
createTextWriter,
@@ -6123,7 +6126,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
61236126
function symbolToStringWorker(writer: EmitTextWriter) {
61246127
const entity = builder(symbol, meaning!, enclosingDeclaration, nodeFlags)!; // TODO: GH#18217
61256128
// add neverAsciiEscape for GH#39027
6126-
const printer = enclosingDeclaration?.kind === SyntaxKind.SourceFile ? createPrinter({ removeComments: true, neverAsciiEscape: true }) : createPrinter({ removeComments: true });
6129+
const printer = enclosingDeclaration?.kind === SyntaxKind.SourceFile
6130+
? createPrinterWithRemoveCommentsNeverAsciiEscape()
6131+
: createPrinterWithRemoveComments();
61276132
const sourceFile = enclosingDeclaration && getSourceFileOfNode(enclosingDeclaration);
61286133
printer.writeNode(EmitHint.Unspecified, entity, /*sourceFile*/ sourceFile, writer);
61296134
return writer;
@@ -6142,7 +6147,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
61426147
sigOutput = kind === SignatureKind.Construct ? SyntaxKind.ConstructSignature : SyntaxKind.CallSignature;
61436148
}
61446149
const sig = nodeBuilder.signatureToSignatureDeclaration(signature, sigOutput, enclosingDeclaration, toNodeBuilderFlags(flags) | NodeBuilderFlags.IgnoreErrors | NodeBuilderFlags.WriteTypeParametersInQualifiedName);
6145-
const printer = createPrinter({ removeComments: true, omitTrailingSemicolon: true });
6150+
const printer = createPrinterWithRemoveCommentsOmitTrailingSemicolon();
61466151
const sourceFile = enclosingDeclaration && getSourceFileOfNode(enclosingDeclaration);
61476152
printer.writeNode(EmitHint.Unspecified, sig!, /*sourceFile*/ sourceFile, getTrailingSemicolonDeferringWriter(writer)); // TODO: GH#18217
61486153
return writer;
@@ -6155,8 +6160,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
61556160
if (typeNode === undefined) return Debug.fail("should always get typenode");
61566161
// The unresolved type gets a synthesized comment on `any` to hint to users that it's not a plain `any`.
61576162
// Otherwise, we always strip comments out.
6158-
const options = { removeComments: type !== unresolvedType };
6159-
const printer = createPrinter(options);
6163+
const printer = type !== unresolvedType ? createPrinterWithRemoveComments() : createPrinterWithDefaults();
61606164
const sourceFile = enclosingDeclaration && getSourceFileOfNode(enclosingDeclaration);
61616165
printer.writeNode(EmitHint.Unspecified, typeNode, /*sourceFile*/ sourceFile, writer);
61626166
const result = writer.getText();
@@ -9636,7 +9640,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
96369640
typePredicate.kind === TypePredicateKind.Identifier || typePredicate.kind === TypePredicateKind.AssertsIdentifier ? factory.createIdentifier(typePredicate.parameterName) : factory.createThisTypeNode(),
96379641
typePredicate.type && nodeBuilder.typeToTypeNode(typePredicate.type, enclosingDeclaration, toNodeBuilderFlags(flags) | NodeBuilderFlags.IgnoreErrors | NodeBuilderFlags.WriteTypeParametersInQualifiedName)! // TODO: GH#18217
96389642
);
9639-
const printer = createPrinter({ removeComments: true });
9643+
const printer = createPrinterWithRemoveComments();
96409644
const sourceFile = enclosingDeclaration && getSourceFileOfNode(enclosingDeclaration);
96419645
printer.writeNode(EmitHint.Unspecified, predicate, /*sourceFile*/ sourceFile, writer);
96429646
return writer;

src/compiler/emitter.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,6 +1343,18 @@ const enum PipelinePhase {
13431343
Emit,
13441344
}
13451345

1346+
/** @internal */
1347+
export const createPrinterWithDefaults = memoize(() => createPrinter({}));
1348+
1349+
/** @internal */
1350+
export const createPrinterWithRemoveComments = memoize(() => createPrinter({ removeComments: true }));
1351+
1352+
/** @internal */
1353+
export const createPrinterWithRemoveCommentsNeverAsciiEscape = memoize(() => createPrinter({ removeComments: true, neverAsciiEscape: true }));
1354+
1355+
/** @internal */
1356+
export const createPrinterWithRemoveCommentsOmitTrailingSemicolon = memoize(() => createPrinter({ removeComments: true, omitTrailingSemicolon: true }));
1357+
13461358
export function createPrinter(printerOptions: PrinterOptions = {}, handlers: PrintHandlers = {}): Printer {
13471359
const {
13481360
hasGlobalName,

src/services/callHierarchy.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
ClassLikeDeclaration,
1515
ClassStaticBlockDeclaration,
1616
compareStringsCaseSensitive,
17-
createPrinter,
17+
createPrinterWithRemoveCommentsOmitTrailingSemicolon,
1818
createTextRangeFromNode,
1919
createTextSpanFromBounds,
2020
createTextSpanFromRange,
@@ -245,7 +245,7 @@ function getCallHierarchyItemName(program: Program, node: CallHierarchyDeclarati
245245
}
246246
if (text === undefined) {
247247
// get the text from printing the node on a single line without comments...
248-
const printer = createPrinter({ removeComments: true, omitTrailingSemicolon: true });
248+
const printer = createPrinterWithRemoveCommentsOmitTrailingSemicolon();
249249
text = usingSingleLineStringWriter(writer => printer.writeNode(EmitHint.Unspecified, node, node.getSourceFile(), writer));
250250
}
251251
return { text, pos: declName.getStart(), end: declName.getEnd() };

src/services/inlayHints.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {
22
__String,
33
ArrowFunction,
44
CallExpression,
5-
createPrinter,
5+
createPrinterWithRemoveComments,
66
Debug,
77
EmitHint,
88
EnumMember,
@@ -53,7 +53,6 @@ import {
5353
NodeBuilderFlags,
5454
ParameterDeclaration,
5555
PrefixUnaryExpression,
56-
PrinterOptions,
5756
PropertyDeclaration,
5857
Signature,
5958
skipParentheses,
@@ -383,8 +382,7 @@ export function provideInlayHints(context: InlayHintsContext): InlayHint[] {
383382

384383
function printTypeInSingleLine(type: Type) {
385384
const flags = NodeBuilderFlags.IgnoreErrors | TypeFormatFlags.AllowUniqueESSymbolType | TypeFormatFlags.UseAliasDefinedOutsideCurrentScope;
386-
const options: PrinterOptions = { removeComments: true };
387-
const printer = createPrinter(options);
385+
const printer = createPrinterWithRemoveComments();
388386

389387
return usingSingleLineStringWriter(writer => {
390388
const typeNode = checker.typeToTypeNode(type, /*enclosingDeclaration*/ undefined, flags);

src/services/signatureHelp.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
CheckFlags,
88
contains,
99
countWhere,
10-
createPrinter,
10+
createPrinterWithRemoveComments,
1111
createTextSpan,
1212
createTextSpanFromBounds,
1313
createTextSpanFromNode,
@@ -659,7 +659,7 @@ function createTypeHelpItems(
659659
function getTypeHelpItem(symbol: Symbol, typeParameters: readonly TypeParameter[], checker: TypeChecker, enclosingDeclaration: Node, sourceFile: SourceFile): SignatureHelpItem {
660660
const typeSymbolDisplay = symbolToDisplayParts(checker, symbol);
661661

662-
const printer = createPrinter({ removeComments: true });
662+
const printer = createPrinterWithRemoveComments();
663663
const parameters = typeParameters.map(t => createSignatureHelpParameterForTypeParameter(t, checker, enclosingDeclaration, sourceFile, printer));
664664

665665
const documentation = symbol.getDocumentationComment(checker);
@@ -699,7 +699,7 @@ interface SignatureHelpItemInfo { readonly isVariadic: boolean; readonly paramet
699699

700700
function itemInfoForTypeParameters(candidateSignature: Signature, checker: TypeChecker, enclosingDeclaration: Node, sourceFile: SourceFile): SignatureHelpItemInfo[] {
701701
const typeParameters = (candidateSignature.target || candidateSignature).typeParameters;
702-
const printer = createPrinter({ removeComments: true });
702+
const printer = createPrinterWithRemoveComments();
703703
const parameters = (typeParameters || emptyArray).map(t => createSignatureHelpParameterForTypeParameter(t, checker, enclosingDeclaration, sourceFile, printer));
704704
const thisParameter = candidateSignature.thisParameter ? [checker.symbolToParameterDeclaration(candidateSignature.thisParameter, enclosingDeclaration, signatureHelpNodeBuilderFlags)!] : [];
705705

@@ -713,7 +713,7 @@ function itemInfoForTypeParameters(candidateSignature: Signature, checker: TypeC
713713
}
714714

715715
function itemInfoForParameters(candidateSignature: Signature, checker: TypeChecker, enclosingDeclaration: Node, sourceFile: SourceFile): SignatureHelpItemInfo[] {
716-
const printer = createPrinter({ removeComments: true });
716+
const printer = createPrinterWithRemoveComments();
717717
const typeParameterParts = mapToDisplayParts(writer => {
718718
if (candidateSignature.typeParameters && candidateSignature.typeParameters.length) {
719719
const args = factory.createNodeArray(candidateSignature.typeParameters.map(p => checker.typeParameterToDeclaration(p, enclosingDeclaration, signatureHelpNodeBuilderFlags)!));

src/services/symbolDisplay.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
CallExpression,
66
CheckFlags,
77
contains,
8-
createPrinter,
8+
createPrinterWithRemoveComments,
99
Debug,
1010
displayPart,
1111
EmitHint,
@@ -75,7 +75,6 @@ import {
7575
NodeBuilderFlags,
7676
ObjectFlags,
7777
operatorPart,
78-
Printer,
7978
PropertyAccessExpression,
8079
PropertyDeclaration,
8180
punctuationPart,
@@ -259,7 +258,6 @@ export function getSymbolDisplayPartsDocumentationAndSymbolKind(typeChecker: Typ
259258
let hasAddedSymbolInfo = false;
260259
const isThisExpression = location.kind === SyntaxKind.ThisKeyword && isInExpressionContext(location) || isThisInTypeQuery(location);
261260
let type: Type | undefined;
262-
let printer: Printer;
263261
let documentationFromAlias: SymbolDisplayPart[] | undefined;
264262
let tagsFromAlias: JSDocTagInfo[] | undefined;
265263
let hasMultipleSignatures = false;
@@ -730,10 +728,7 @@ export function getSymbolDisplayPartsDocumentationAndSymbolKind(typeChecker: Typ
730728
return { displayParts, documentation, symbolKind, tags: tags.length === 0 ? undefined : tags };
731729

732730
function getPrinter() {
733-
if (!printer) {
734-
printer = createPrinter({ removeComments: true });
735-
}
736-
return printer;
731+
return createPrinterWithRemoveComments();
737732
}
738733

739734
function prefixNextMeaning() {

src/services/utilities.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import {
3030
ConditionalExpression,
3131
contains,
3232
ContextFlags,
33-
createPrinter,
33+
createPrinterWithRemoveCommentsOmitTrailingSemicolon,
3434
createRange,
3535
createScanner,
3636
createTextSpan,
@@ -2984,7 +2984,7 @@ export function signatureToDisplayParts(typechecker: TypeChecker, signature: Sig
29842984
export function nodeToDisplayParts(node: Node, enclosingDeclaration: Node): SymbolDisplayPart[] {
29852985
const file = enclosingDeclaration.getSourceFile();
29862986
return mapToDisplayParts(writer => {
2987-
const printer = createPrinter({ removeComments: true, omitTrailingSemicolon: true });
2987+
const printer = createPrinterWithRemoveCommentsOmitTrailingSemicolon();
29882988
printer.writeNode(EmitHint.Unspecified, node, file, writer);
29892989
});
29902990
}

0 commit comments

Comments
 (0)