Skip to content

Commit f9a55be

Browse files
committed
add lookup for extends class when implement interface
1 parent 927343c commit f9a55be

2 files changed

Lines changed: 51 additions & 1 deletion

File tree

src/services/codefixes/helpers.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,25 @@ 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+
1012
const classMembers = classDeclaration.symbol.members!;
1113
for (const symbol of possiblyMissingSymbols) {
12-
if (!classMembers.has(symbol.escapedName)) {
14+
if (!classMembers.has(symbol.escapedName) && !(heritageClauseSymbolTable && heritageClauseSymbolTable.has(symbol.escapedName))) {
1315
addNewNodeForMemberSymbol(symbol, classDeclaration, checker, preferences, out);
1416
}
1517
}
1618
}
1719

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+
1829
/**
1930
* @returns Empty string iff there we can't figure out a representation for `symbol` in `enclosingDeclaration`.
2031
*/
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// class Base {
4+
//// foo: number;
5+
//// }
6+
////
7+
//// class D extends Base {
8+
//// bar: number;
9+
//// }
10+
////
11+
//// interface I {
12+
//// foo: number;
13+
//// bar: number;
14+
//// baz: number;
15+
//// }
16+
////
17+
//// class C extends D implements I { }
18+
19+
verify.codeFix({
20+
description: "Implement interface 'I'",
21+
newFileContent:
22+
`class Base {
23+
foo: number;
24+
}
25+
26+
class D extends Base {
27+
bar: number;
28+
}
29+
30+
interface I {
31+
foo: number;
32+
bar: number;
33+
baz: number;
34+
}
35+
36+
class C extends D implements I {
37+
baz: number;
38+
}`,
39+
});

0 commit comments

Comments
 (0)