Skip to content

Commit a961d7a

Browse files
committed
Only replace implements with a comma if the heritage clauses are sensible
1 parent afae97c commit a961d7a

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

src/services/codefixes/fixExtendsInterfaceBecomesImplements.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,25 @@ namespace ts.codefix {
2828

2929
function doChanges(changes: textChanges.ChangeTracker, sourceFile: SourceFile, extendsToken: Node, heritageClauses: ReadonlyArray<HeritageClause>): void {
3030
changes.replaceRange(sourceFile, { pos: extendsToken.getStart(), end: extendsToken.end }, createToken(SyntaxKind.ImplementsKeyword));
31-
// We replace existing keywords with commas.
32-
for (let i = 1; i < heritageClauses.length; i++) {
33-
const keywordToken = heritageClauses[i].getFirstToken()!;
34-
const keywordFullStart = keywordToken.getFullStart();
35-
changes.replaceRange(sourceFile, { pos: keywordFullStart, end: keywordFullStart }, createToken(SyntaxKind.CommaToken));
31+
32+
// If there is already an implements clause, replace the implements keyword with a comma.
33+
if (heritageClauses.length === 2 &&
34+
heritageClauses[0].token === SyntaxKind.ExtendsKeyword &&
35+
heritageClauses[1].token === SyntaxKind.ImplementsKeyword) {
36+
37+
const implementsToken = heritageClauses[1].getFirstToken()!;
38+
const implementsFullStart = implementsToken.getFullStart();
39+
changes.replaceRange(sourceFile, { pos: implementsFullStart, end: implementsFullStart }, createToken(SyntaxKind.CommaToken));
3640

3741
// Rough heuristic: delete trailing whitespace after keyword so that it's not excessive.
3842
// (Trailing because leading might be indentation, which is more sensitive.)
3943
const text = sourceFile.text;
40-
let end = keywordToken.end;
44+
let end = implementsToken.end;
4145
while (end < text.length && ts.isWhiteSpaceSingleLine(text.charCodeAt(end))) {
4246
end++;
4347
}
4448

45-
changes.deleteRange(sourceFile, { pos: keywordToken.getStart(), end });
49+
changes.deleteRange(sourceFile, { pos: implementsToken.getStart(), end });
4650
}
4751
}
4852
}

0 commit comments

Comments
 (0)