add lookup for extends class when implement interface

This commit is contained in:
王文璐 2018-05-28 18:38:07 +08:00
parent 927343cf3a
commit f9a55beec5
2 changed files with 51 additions and 1 deletions

View file

@ -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`.
*/

View file

@ -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;
}`,
});