@@ -32,6 +32,10 @@ namespace ts.codefix {
3232 return Debug . assertDefined ( getContainingClass ( getTokenAtPosition ( sourceFile , pos , /*includeJsDocComment*/ false ) ) ) ;
3333 }
3434
35+ function symbolPointsToNonPrivateMember ( symbol : Symbol ) {
36+ return ! ( getModifierFlags ( symbol . valueDeclaration ) & ModifierFlags . Private ) ;
37+ }
38+
3539 function addMissingDeclarations (
3640 checker : TypeChecker ,
3741 implementedTypeNode : ExpressionWithTypeArguments ,
@@ -40,11 +44,12 @@ namespace ts.codefix {
4044 changeTracker : textChanges . ChangeTracker ,
4145 preferences : UserPreferences ,
4246 ) : void {
47+ const maybeHeritageClauseSymbol = getHeritageClauseSymbolTable ( classDeclaration , checker ) ;
4348 // Note that this is ultimately derived from a map indexed by symbol names,
4449 // so duplicates cannot occur.
4550 const implementedType = checker . getTypeAtLocation ( implementedTypeNode ) as InterfaceType ;
4651 const implementedTypeSymbols = checker . getPropertiesOfType ( implementedType ) ;
47- const nonPrivateMembers = implementedTypeSymbols . filter ( symbol => ! ( getModifierFlags ( symbol . valueDeclaration ) & ModifierFlags . Private ) ) ;
52+ const nonPrivateAndNotExistedInHeritageClauseMembers = implementedTypeSymbols . filter ( and ( symbolPointsToNonPrivateMember , symbol => ! maybeHeritageClauseSymbol . has ( symbol . escapedName ) ) ) ;
4853
4954 const classType = checker . getTypeAtLocation ( classDeclaration ) ! ;
5055
@@ -55,7 +60,7 @@ namespace ts.codefix {
5560 createMissingIndexSignatureDeclaration ( implementedType , IndexKind . String ) ;
5661 }
5762
58- createMissingMemberNodes ( classDeclaration , nonPrivateMembers , checker , preferences , member => changeTracker . insertNodeAtClassStart ( sourceFile , classDeclaration , member ) ) ;
63+ createMissingMemberNodes ( classDeclaration , nonPrivateAndNotExistedInHeritageClauseMembers , checker , preferences , member => changeTracker . insertNodeAtClassStart ( sourceFile , classDeclaration , member ) ) ;
5964
6065 function createMissingIndexSignatureDeclaration ( type : InterfaceType , kind : IndexKind ) : void {
6166 const indexInfoOfKind = checker . getIndexInfoOfType ( type , kind ) ;
@@ -64,4 +69,12 @@ namespace ts.codefix {
6469 }
6570 }
6671 }
72+
73+ function getHeritageClauseSymbolTable ( classDeclaration : ClassLikeDeclaration , checker : TypeChecker ) : SymbolTable {
74+ const heritageClauseNode = getClassExtendsHeritageClauseElement ( classDeclaration ) ;
75+ if ( ! heritageClauseNode ) return createSymbolTable ( ) ;
76+ const heritageClauseType = checker . getTypeAtLocation ( heritageClauseNode ) as InterfaceType ;
77+ const heritageClauseTypeSymbols = checker . getPropertiesOfType ( heritageClauseType ) ;
78+ return createSymbolTable ( heritageClauseTypeSymbols . filter ( symbolPointsToNonPrivateMember ) ) ;
79+ }
6780}
0 commit comments