Skip to content

Commit d2dc2e6

Browse files
author
Andy
authored
Don't copy trivia when implementing an interface (#23343)
* Don't copy trivia when implementing an interface * Use an `includeTrivia` flag instead of a separate function
1 parent 05c746b commit d2dc2e6

File tree

4 files changed

+14
-22
lines changed

4 files changed

+14
-22
lines changed

src/services/codefixes/helpers.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ namespace ts.codefix {
2525
}
2626

2727
const declaration = declarations[0];
28-
// Clone name to remove leading trivia.
29-
const name = getSynthesizedDeepClone(getNameOfDeclaration(declaration)) as PropertyName;
28+
const name = getSynthesizedDeepClone(getNameOfDeclaration(declaration), /*includeTrivia*/ false) as PropertyName;
3029
const visibilityModifier = createVisibilityModifier(getModifierFlags(declaration));
3130
const modifiers = visibilityModifier ? createNodeArray([visibilityModifier]) : undefined;
3231
const type = checker.getWidenedType(checker.getTypeOfSymbolAtLocation(symbol, enclosingDeclaration));
@@ -69,7 +68,7 @@ namespace ts.codefix {
6968

7069
for (const signature of signatures) {
7170
// Need to ensure nodes are fresh each time so they can have different positions.
72-
outputMethod(signature, getSynthesizedDeepClones(modifiers), getSynthesizedDeepClone(name));
71+
outputMethod(signature, getSynthesizedDeepClones(modifiers, /*includeTrivia*/ false), getSynthesizedDeepClone(name, /*includeTrivia*/ false));
7372
}
7473

7574
if (declarations.length > signatures.length) {
@@ -103,10 +102,6 @@ namespace ts.codefix {
103102
return signatureDeclaration;
104103
}
105104

106-
function getSynthesizedDeepClones<T extends Node>(nodes: NodeArray<T> | undefined): NodeArray<T> | undefined {
107-
return nodes && createNodeArray(nodes.map(getSynthesizedDeepClone));
108-
}
109-
110105
export function createMethodFromCallExpression(
111106
{ typeArguments, arguments: args }: CallExpression,
112107
methodName: string,

src/services/utilities.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,11 +1459,13 @@ namespace ts {
14591459
* WARNING: This is an expensive operation and is only intended to be used in refactorings
14601460
* and code fixes (because those are triggered by explicit user actions).
14611461
*/
1462-
export function getSynthesizedDeepClone<T extends Node>(node: T | undefined): T | undefined {
1463-
if (node === undefined) {
1464-
return undefined;
1465-
}
1462+
export function getSynthesizedDeepClone<T extends Node>(node: T | undefined, includeTrivia = true): T | undefined {
1463+
const clone = node && getSynthesizedDeepCloneWorker(node);
1464+
if (clone && !includeTrivia) suppressLeadingAndTrailingTrivia(clone);
1465+
return clone;
1466+
}
14661467

1468+
function getSynthesizedDeepCloneWorker<T extends Node>(node: T): T | undefined {
14671469
const visited = visitEachChild(node, getSynthesizedDeepClone, nullTransformationContext);
14681470
if (visited === node) {
14691471
// This only happens for leaf nodes - internal nodes always see their children change.
@@ -1474,22 +1476,18 @@ namespace ts {
14741476
else if (isNumericLiteral(clone)) {
14751477
clone.numericLiteralFlags = (node as any).numericLiteralFlags;
14761478
}
1477-
clone.pos = node.pos;
1478-
clone.end = node.end;
1479-
return clone;
1479+
return setTextRange(clone, node);
14801480
}
14811481

14821482
// PERF: As an optimization, rather than calling getSynthesizedClone, we'll update
14831483
// the new node created by visitEachChild with the extra changes getSynthesizedClone
14841484
// would have made.
1485-
14861485
visited.parent = undefined;
1487-
14881486
return visited;
14891487
}
14901488

1491-
export function getSynthesizedDeepClones<T extends Node>(nodes: NodeArray<T> | undefined): NodeArray<T> | undefined {
1492-
return nodes && createNodeArray(nodes.map(getSynthesizedDeepClone), nodes.hasTrailingComma);
1489+
export function getSynthesizedDeepClones<T extends Node>(nodes: NodeArray<T> | undefined, includeTrivia = true): NodeArray<T> | undefined {
1490+
return nodes && createNodeArray(nodes.map(n => getSynthesizedDeepClone(n, includeTrivia)), nodes.hasTrailingComma);
14931491
}
14941492

14951493
/**

tests/cases/fourslash/codeFixClassImplementInterfaceComments.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ verify.codeFix({
3636
/**close-brace prefix*/ }
3737
/**close-brace prefix*/ }
3838
class C implements N.I {
39-
/** property prefix */ a /** colon prefix */: N.E.a;
40-
/** property prefix */ b /** colon prefix */: N.E;
41-
/**method signature prefix */ foo /**open angle prefix */<X>(a: X): string {
39+
a: N.E.a;
40+
b: N.E;
41+
foo<X>(a: X): string {
4242
throw new Error("Method not implemented.");
4343
}
4444
}`,

tests/cases/fourslash/codeFixClassImplementInterfaceMemberOrdering.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ class C implements I {
8484
20: any;
8585
21: any;
8686
22: any;
87-
/** a nice safe prime */
8887
23: any;
8988
}`,
9089
});

0 commit comments

Comments
 (0)