Skip to content

Commit e05d2ba

Browse files
committed
fix broken test
1 parent 2cb2113 commit e05d2ba

File tree

2 files changed

+16
-14
lines changed

2 files changed

+16
-14
lines changed

src/services/codefixes/fixClassIncorrectlyImplementsInterface.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ namespace ts.codefix {
3232
return Debug.assertDefined(getContainingClass(getTokenAtPosition(sourceFile, pos, /*includeJsDocComment*/ false)));
3333
}
3434

35+
function symbolPointsToNonPrivateMember (symbol: Symbol) {
36+
return !(getModifierFlags(symbol.valueDeclaration) & ModifierFlags.Private);
37+
}
38+
3539
function addMissingDeclarations(
3640
checker: TypeChecker,
3741
implementedTypeNode: ExpressionWithTypeArguments,
@@ -40,11 +44,12 @@ namespace ts.codefix {
4044
changeTracker: textChanges.ChangeTracker,
4145
preferences: UserPreferences,
4246
): void {
47+
const maybeHeritageClauseSymbol = getHeritageClauseSymbolTable(classDeclaration, checker);
4348
// Note that this is ultimately derived from a map indexed by symbol names,
4449
// so duplicates cannot occur.
4550
const implementedType = checker.getTypeAtLocation(implementedTypeNode) as InterfaceType;
4651
const implementedTypeSymbols = checker.getPropertiesOfType(implementedType);
47-
const nonPrivateMembers = implementedTypeSymbols.filter(symbol => !(getModifierFlags(symbol.valueDeclaration) & ModifierFlags.Private));
52+
const nonPrivateAndNotExistedInHeritageClauseMembers = implementedTypeSymbols.filter(and(symbolPointsToNonPrivateMember, symbol => !maybeHeritageClauseSymbol.has(symbol.escapedName)));
4853

4954
const classType = checker.getTypeAtLocation(classDeclaration)!;
5055

@@ -55,7 +60,7 @@ namespace ts.codefix {
5560
createMissingIndexSignatureDeclaration(implementedType, IndexKind.String);
5661
}
5762

58-
createMissingMemberNodes(classDeclaration, nonPrivateMembers, checker, preferences, member => changeTracker.insertNodeAtClassStart(sourceFile, classDeclaration, member));
63+
createMissingMemberNodes(classDeclaration, nonPrivateAndNotExistedInHeritageClauseMembers, checker, preferences, member => changeTracker.insertNodeAtClassStart(sourceFile, classDeclaration, member));
5964

6065
function createMissingIndexSignatureDeclaration(type: InterfaceType, kind: IndexKind): void {
6166
const indexInfoOfKind = checker.getIndexInfoOfType(type, kind);
@@ -64,4 +69,12 @@ namespace ts.codefix {
6469
}
6570
}
6671
}
72+
73+
function getHeritageClauseSymbolTable (classDeclaration: ClassLikeDeclaration, checker: TypeChecker): SymbolTable {
74+
const heritageClauseNode = getClassExtendsHeritageClauseElement(classDeclaration);
75+
if (!heritageClauseNode) return createSymbolTable();
76+
const heritageClauseType = checker.getTypeAtLocation(heritageClauseNode) as InterfaceType;
77+
const heritageClauseTypeSymbols = checker.getPropertiesOfType(heritageClauseType);
78+
return createSymbolTable(heritageClauseTypeSymbols.filter(symbolPointsToNonPrivateMember));
79+
}
6780
}

src/services/codefixes/helpers.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,14 @@ namespace ts.codefix {
77
* @returns Empty string iff there are no member insertions.
88
*/
99
export function createMissingMemberNodes(classDeclaration: ClassLikeDeclaration, possiblyMissingSymbols: ReadonlyArray<Symbol>, checker: TypeChecker, preferences: UserPreferences, out: (node: ClassElement) => void): void {
10-
const heritageClauseSymbolTable = getHeritageClauseSymbolTable(classDeclaration, checker);
11-
1210
const classMembers = classDeclaration.symbol.members!;
1311
for (const symbol of possiblyMissingSymbols) {
14-
if (!classMembers.has(symbol.escapedName) && !(heritageClauseSymbolTable && heritageClauseSymbolTable.has(symbol.escapedName))) {
12+
if (!classMembers.has(symbol.escapedName)) {
1513
addNewNodeForMemberSymbol(symbol, classDeclaration, checker, preferences, out);
1614
}
1715
}
1816
}
1917

20-
function getHeritageClauseSymbolTable (classDeclaration: ClassLikeDeclaration, checker: TypeChecker): SymbolTable | undefined {
21-
const heritageClauseNode = getClassExtendsHeritageClauseElement(classDeclaration);
22-
if (!heritageClauseNode) return undefined;
23-
const heritageClauseType = checker.getTypeAtLocation(heritageClauseNode) as InterfaceType;
24-
const heritageClauseTypeSymbols = checker.getPropertiesOfType(heritageClauseType);
25-
const nonPrivateMembers = heritageClauseTypeSymbols.filter(symbol => !(getModifierFlags(symbol.valueDeclaration) & ModifierFlags.Private));
26-
return createSymbolTable(nonPrivateMembers);
27-
}
28-
2918
/**
3019
* @returns Empty string iff there we can't figure out a representation for `symbol` in `enclosingDeclaration`.
3120
*/

0 commit comments

Comments
 (0)