Skip to content

Commit 0605424

Browse files
author
Andy
authored
fixJSDocTypes: Use ChangeTracker (#22391)
1 parent 2676786 commit 0605424

File tree

2 files changed

+10
-23
lines changed

2 files changed

+10
-23
lines changed

src/services/codeFixProvider.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,6 @@ namespace ts {
8888
return createCombinedCodeActions(changes, commands.length === 0 ? undefined : commands);
8989
}
9090

91-
export function codeFixAllWithTextChanges(context: CodeFixAllContext, errorCodes: number[], use: (changes: Push<TextChange>, error: Diagnostic) => void): CombinedCodeActions {
92-
const changes: TextChange[] = [];
93-
eachDiagnostic(context, errorCodes, diag => use(changes, diag));
94-
changes.sort((a, b) => b.span.start - a.span.start);
95-
return createCombinedCodeActions([createFileTextChanges(context.sourceFile.fileName, changes)]);
96-
}
97-
9891
function eachDiagnostic({ program, sourceFile }: CodeFixAllContext, errorCodes: number[], cb: (diag: Diagnostic) => void): void {
9992
for (const diag of program.getSemanticDiagnostics(sourceFile).concat(computeSuggestionDiagnostics(sourceFile, program))) {
10093
if (contains(errorCodes, diag.code)) {

src/services/codefixes/fixJSDocTypes.ts

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,42 +21,36 @@ namespace ts.codefix {
2121
return actions;
2222

2323
function fix(type: Type, fixId: string): CodeFixAction {
24-
const newText = typeString(type, checker);
25-
return {
26-
description: formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Change_0_to_1), [original, newText]),
27-
changes: [createFileTextChanges(sourceFile.fileName, [createChange(typeNode, sourceFile, newText)])],
28-
fixId,
29-
};
24+
const newText = checker.typeToString(type);
25+
const description = formatStringFromArgs(getLocaleSpecificMessage(Diagnostics.Change_0_to_1), [original, newText]);
26+
const changes = textChanges.ChangeTracker.with(context, t => doChange(t, sourceFile, typeNode, type, checker));
27+
return { description, changes, fixId };
3028
}
3129
},
3230
fixIds: [fixIdPlain, fixIdNullable],
3331
getAllCodeActions(context) {
3432
const { fixId, program, sourceFile } = context;
3533
const checker = program.getTypeChecker();
36-
return codeFixAllWithTextChanges(context, errorCodes, (changes, err) => {
34+
return codeFixAll(context, errorCodes, (changes, err) => {
3735
const info = getInfo(err.file, err.start!, checker);
3836
if (!info) return;
3937
const { typeNode, type } = info;
4038
const fixedType = typeNode.kind === SyntaxKind.JSDocNullableType && fixId === fixIdNullable ? checker.getNullableType(type, TypeFlags.Undefined) : type;
41-
changes.push(createChange(typeNode, sourceFile, typeString(fixedType, checker)));
39+
doChange(changes, sourceFile, typeNode, fixedType, checker);
4240
});
4341
}
4442
});
4543

44+
function doChange(changes: textChanges.ChangeTracker, sourceFile: SourceFile, oldTypeNode: TypeNode, newType: Type, checker: TypeChecker): void {
45+
changes.replaceNode(sourceFile, oldTypeNode, checker.typeToTypeNode(newType, /*enclosingDeclaration*/ oldTypeNode));
46+
}
47+
4648
function getInfo(sourceFile: SourceFile, pos: number, checker: TypeChecker): { readonly typeNode: TypeNode, type: Type } {
4749
const decl = findAncestor(getTokenAtPosition(sourceFile, pos, /*includeJsDocComment*/ false), isTypeContainer);
4850
const typeNode = decl && decl.type;
4951
return typeNode && { typeNode, type: checker.getTypeFromTypeNode(typeNode) };
5052
}
5153

52-
function createChange(declaration: TypeNode, sourceFile: SourceFile, newText: string): TextChange {
53-
return createTextChange(createTextSpanFromNode(declaration, sourceFile), newText);
54-
}
55-
56-
function typeString(type: Type, checker: TypeChecker): string {
57-
return checker.typeToString(type, /*enclosingDeclaration*/ undefined, TypeFormatFlags.NoTruncation);
58-
}
59-
6054
// TODO: GH#19856 Node & { type: TypeNode }
6155
type TypeContainer =
6256
| AsExpression | CallSignatureDeclaration | ConstructSignatureDeclaration | FunctionDeclaration

0 commit comments

Comments
 (0)