add lookup for extends class when implement interface
This commit is contained in:
parent
927343cf3a
commit
f9a55beec5
|
@ -7,14 +7,25 @@ namespace ts.codefix {
|
|||
* @returns Empty string iff there are no member insertions.
|
||||
*/
|
||||
export function createMissingMemberNodes(classDeclaration: ClassLikeDeclaration, possiblyMissingSymbols: ReadonlyArray<Symbol>, checker: TypeChecker, preferences: UserPreferences, out: (node: ClassElement) => void): void {
|
||||
const heritageClauseSymbolTable = getHeritageClauseSymbolTable(classDeclaration, checker);
|
||||
|
||||
const classMembers = classDeclaration.symbol.members!;
|
||||
for (const symbol of possiblyMissingSymbols) {
|
||||
if (!classMembers.has(symbol.escapedName)) {
|
||||
if (!classMembers.has(symbol.escapedName) && !(heritageClauseSymbolTable && heritageClauseSymbolTable.has(symbol.escapedName))) {
|
||||
addNewNodeForMemberSymbol(symbol, classDeclaration, checker, preferences, out);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getHeritageClauseSymbolTable (classDeclaration: ClassLikeDeclaration, checker: TypeChecker): SymbolTable | undefined {
|
||||
const heritageClauseNode = getClassExtendsHeritageClauseElement(classDeclaration);
|
||||
if (!heritageClauseNode) return undefined;
|
||||
const heritageClauseType = checker.getTypeAtLocation(heritageClauseNode) as InterfaceType;
|
||||
const heritageClauseTypeSymbols = checker.getPropertiesOfType(heritageClauseType);
|
||||
const nonPrivateMembers = heritageClauseTypeSymbols.filter(symbol => !(getModifierFlags(symbol.valueDeclaration) & ModifierFlags.Private));
|
||||
return createSymbolTable(nonPrivateMembers);
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns Empty string iff there we can't figure out a representation for `symbol` in `enclosingDeclaration`.
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
/// <reference path='fourslash.ts' />
|
||||
|
||||
//// class Base {
|
||||
//// foo: number;
|
||||
//// }
|
||||
////
|
||||
//// class D extends Base {
|
||||
//// bar: number;
|
||||
//// }
|
||||
////
|
||||
//// interface I {
|
||||
//// foo: number;
|
||||
//// bar: number;
|
||||
//// baz: number;
|
||||
//// }
|
||||
////
|
||||
//// class C extends D implements I { }
|
||||
|
||||
verify.codeFix({
|
||||
description: "Implement interface 'I'",
|
||||
newFileContent:
|
||||
`class Base {
|
||||
foo: number;
|
||||
}
|
||||
|
||||
class D extends Base {
|
||||
bar: number;
|
||||
}
|
||||
|
||||
interface I {
|
||||
foo: number;
|
||||
bar: number;
|
||||
baz: number;
|
||||
}
|
||||
|
||||
class C extends D implements I {
|
||||
baz: number;
|
||||
}`,
|
||||
});
|
Loading…
Reference in a new issue