diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2ca169cb140..48a5933a59a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1308,7 +1308,7 @@ namespace ts { /** * Resolves a qualified name and any involved aliases. - */ + */ function resolveEntityName(name: EntityNameOrEntityNameExpression, meaning: SymbolFlags, ignoreErrors?: boolean, dontResolveAlias?: boolean, location?: Node): Symbol | undefined { if (nodeIsMissing(name)) { return undefined; diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 5f4465f490e..736b8d11a01 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -1370,7 +1370,7 @@ namespace ts { const missingMembers = getMissingInterfaceMembers(type.symbol.declarations[0], existingMembers, checker); for (const member of missingMembers) { - if (member.kind === SyntaxKind.PropertySignature) { + if (member.kind === SyntaxKind.PropertySignature || member.kind === SyntaxKind.PropertyDeclaration) { const interfaceProperty = member; if (trackingAddedMembers.indexOf(interfaceProperty.name.getText()) === -1) { let propertyText = ""; @@ -1405,25 +1405,24 @@ namespace ts { * Gets members in an interface and all its base types. */ function getInterfaceMembers(declaration: InterfaceDeclaration, checker: TypeChecker): TypeElement[] { + let result: TypeElement[] = declaration.members + ? declaration.members.filter(member => !(getModifierFlags(member) & ModifierFlags.Private)) + : []; const clauses = getInterfaceBaseTypeNodes(declaration); - let result: TypeElement[] = []; - for (let i = 0; clauses && i < clauses.length; i++) { - const type = checker.getTypeAtLocation(clauses[i]); - if (type && type.symbol && type.symbol.declarations) { - result = result.concat(getInterfaceMembers(type.symbol.declarations[0], checker)); + if (clauses) { + for (const clause of clauses) { + const type = checker.getTypeAtLocation(clause); + if (type && type.symbol && type.symbol.declarations) { + result = result.concat(getInterfaceMembers(type.symbol.declarations[0], checker)); + } } } - if (declaration.members) { - result = result.concat(declaration.members); - } - return result; } function getMissingInterfaceMembers(declaration: InterfaceDeclaration, existingMembers: string[], checker: TypeChecker): TypeElement[] { const interfaceMembers = getInterfaceMembers(declaration, checker); - return ts.filter(interfaceMembers, member => !member.name || existingMembers.indexOf(member.name.getText()) === -1); } diff --git a/tests/cases/fourslash/codeFixClassExtendsAbstractNumber.ts b/tests/cases/fourslash/codeFixClassExtendsAbstractNumber.ts index 134c1979dce..f57017693cd 100644 --- a/tests/cases/fourslash/codeFixClassExtendsAbstractNumber.ts +++ b/tests/cases/fourslash/codeFixClassExtendsAbstractNumber.ts @@ -7,5 +7,6 @@ //// class C extends A {[| //// |]} -verify.codeFixAtPosition(`x: number; +verify.codeFixAtPosition(` +abstract x: number; `); diff --git a/tests/cases/fourslash/codeFixClassExtendsAbstractProtectedNumber.ts b/tests/cases/fourslash/codeFixClassExtendsAbstractProtectedNumber.ts index 7f525632fc5..2f1a0f4b64e 100644 --- a/tests/cases/fourslash/codeFixClassExtendsAbstractProtectedNumber.ts +++ b/tests/cases/fourslash/codeFixClassExtendsAbstractProtectedNumber.ts @@ -7,5 +7,6 @@ //// class C extends A {[| //// |]} -verify.codeFixAtPosition(`protected x: number; +verify.codeFixAtPosition(` +protected abstract x: number; `); diff --git a/tests/cases/fourslash/codeFixClassExtendsAbstractPublicNumber.ts b/tests/cases/fourslash/codeFixClassExtendsAbstractPublicNumber.ts index 82cafbd86ad..380f23f6c58 100644 --- a/tests/cases/fourslash/codeFixClassExtendsAbstractPublicNumber.ts +++ b/tests/cases/fourslash/codeFixClassExtendsAbstractPublicNumber.ts @@ -7,5 +7,6 @@ //// class C extends A {[| //// |]} -verify.codeFixAtPosition(`public x: number; +verify.codeFixAtPosition(` +public abstract x: number; `); \ No newline at end of file diff --git a/tests/cases/fourslash/codeFixUnimplementedInterfaceMissingMultipleFunctionsDeepInheritance.ts b/tests/cases/fourslash/codeFixUnimplementedInterfaceMissingMultipleFunctionsDeepInheritance.ts index 729df3a91c8..fcb990ac27f 100644 --- a/tests/cases/fourslash/codeFixUnimplementedInterfaceMissingMultipleFunctionsDeepInheritance.ts +++ b/tests/cases/fourslash/codeFixUnimplementedInterfaceMissingMultipleFunctionsDeepInheritance.ts @@ -53,10 +53,11 @@ verify.codeFixAtPosition( -`a: number; -b: number; -c: number; -d: number; -e: number: +` +e: number; f: number; +a: number; +b: number; +d: number; +c: number; `);