diff --git a/src/services/codefixes/fixClassIncorrectlyImplementsInterface.ts b/src/services/codefixes/fixClassIncorrectlyImplementsInterface.ts index f8da7ae2218..af39da7b2d0 100644 --- a/src/services/codefixes/fixClassIncorrectlyImplementsInterface.ts +++ b/src/services/codefixes/fixClassIncorrectlyImplementsInterface.ts @@ -8,8 +8,8 @@ namespace ts.codefix { const token = getTokenAtPosition(sourceFile, start); const checker = context.program.getTypeChecker(); - const classDecl = getAncestor(token, SyntaxKind.ClassDeclaration) as ClassDeclaration; - if (!(classDecl && isClassLike(classDecl))) { + const classDecl = getContainingClass(token); + if (!classDecl) { return undefined; } diff --git a/src/services/codefixes/fixExtendsInterfaceBecomesImplements.ts b/src/services/codefixes/fixExtendsInterfaceBecomesImplements.ts index 307939785be..f29beb7b547 100644 --- a/src/services/codefixes/fixExtendsInterfaceBecomesImplements.ts +++ b/src/services/codefixes/fixExtendsInterfaceBecomesImplements.ts @@ -6,8 +6,8 @@ namespace ts.codefix { const sourceFile = context.sourceFile; const start = context.span.start; const token = getTokenAtPosition(sourceFile, start); - const classDeclNode = getAncestor(token, SyntaxKind.ClassDeclaration) as ClassDeclaration; - if (!(token.kind === SyntaxKind.Identifier && classDeclNode && classDeclNode.kind === SyntaxKind.ClassDeclaration)) { + const classDeclNode = getContainingClass(token); + if (!(token.kind === SyntaxKind.Identifier && isClassLike(classDeclNode))) { return undefined; } diff --git a/src/services/utilities.ts b/src/services/utilities.ts index f56a191e585..ec1a6320e3e 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -1359,7 +1359,7 @@ namespace ts { }; } - export function getMissingAbstractMembersInsertion(classDeclaration: ClassDeclaration, resolvedType: ResolvedType, checker: TypeChecker, newlineChar: string): string { + export function getMissingAbstractMembersInsertion(classDeclaration: ClassLikeDeclaration, resolvedType: ResolvedType, checker: TypeChecker, newlineChar: string): string { const missingMembers = filterMissingMembers(filterAbstract(filterNonPrivate(resolvedType.members)), classDeclaration.symbol.members); return getInsertionsForMembers(missingMembers, classDeclaration, checker, newlineChar); } @@ -1368,7 +1368,7 @@ namespace ts { * Finds members of the resolved type that are missing in the class pointed to by class decl * and generates source code for the missing members. */ - export function getMissingMembersInsertion(classDeclaration: ClassDeclaration, resolvedType: ResolvedType, checker: TypeChecker, newlineChar: string): string { + export function getMissingMembersInsertion(classDeclaration: ClassLikeDeclaration, resolvedType: ResolvedType, checker: TypeChecker, newlineChar: string): string { const missingMembers = filterMissingMembers(filterNonPrivate(resolvedType.members), classDeclaration.symbol.members); return getInsertionsForMembers(missingMembers, classDeclaration, checker, newlineChar); } @@ -1406,7 +1406,7 @@ namespace ts { return filterSymbolMapByDeclaration(symbolMap, decl => !(getModifierFlags(decl) & ModifierFlags.Private)); } - function getInsertionsForMembers(symbolMap: MapLike, enclosingDeclaration: ClassDeclaration, checker: TypeChecker, newlineChar: string): string { + function getInsertionsForMembers(symbolMap: MapLike, enclosingDeclaration: ClassLikeDeclaration, checker: TypeChecker, newlineChar: string): string { let insertion = ""; for (const symbolName in symbolMap) { @@ -1415,7 +1415,7 @@ namespace ts { return insertion; } - function getInsertionForMemberSymbol(symbol: Symbol, enclosingDeclaration: ClassDeclaration, checker: TypeChecker, newlineChar: string): string { + function getInsertionForMemberSymbol(symbol: Symbol, enclosingDeclaration: ClassLikeDeclaration, checker: TypeChecker, newlineChar: string): string { const name = symbol.getName(); const type = checker.getTypeOfSymbolAtLocation(symbol, enclosingDeclaration); const declarations = symbol.getDeclarations(); diff --git a/tests/cases/fourslash/codeFixUnImplementedInterfaceClassExpression.ts b/tests/cases/fourslash/codeFixUnImplementedInterfaceClassExpression.ts new file mode 100644 index 00000000000..5b07a582c6c --- /dev/null +++ b/tests/cases/fourslash/codeFixUnImplementedInterfaceClassExpression.ts @@ -0,0 +1,10 @@ +/// + + +//// interface I { x: number; } +//// +//// new class implements I {[| |]}; + +verify.rangeAfterCodeFix(` +x: number; +`); \ No newline at end of file